@rspack/plugin-react-refresh 1.0.0-beta.2 → 1.0.0-beta.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/LICENSE +0 -1
- package/README.md +67 -3
- package/client/errorOverlayEntry.js +9 -7
- package/client/overlay/components/CompileErrorTrace.js +7 -2
- package/client/overlay/components/PageHeader.js +4 -2
- package/client/overlay/components/RuntimeErrorHeader.js +2 -1
- package/client/overlay/components/RuntimeErrorStack.js +2 -1
- package/client/overlay/index.js +10 -3
- package/client/overlay/utils.js +1 -1
- package/client/reactRefresh.js +15 -15
- package/client/reactRefreshEntry.js +41 -41
- package/client/refreshUtils.js +213 -213
- package/client/utils/ansi-html.js +80 -78
- package/client/utils/errorEventHandlers.js +2 -2
- package/client/utils/formatWebpackErrors.js +15 -5
- package/client/utils/retry.js +2 -2
- package/dist/index.d.ts +2 -7
- package/dist/index.js +23 -26
- package/dist/options.d.ts +1 -1
- package/dist/options.js +10 -10
- package/dist/sockets/WDSSocket.d.ts +8 -5
- package/dist/sockets/WDSSocket.js +10 -8
- package/dist/sockets/utils/getCurrentScriptSource.d.ts +1 -1
- package/dist/sockets/utils/getCurrentScriptSource.js +4 -4
- package/dist/sockets/utils/getSocketUrlParts.d.ts +1 -1
- package/dist/sockets/utils/getSocketUrlParts.js +14 -18
- package/dist/sockets/utils/getUrlFromParts.d.ts +6 -6
- package/dist/sockets/utils/getUrlFromParts.js +7 -10
- package/dist/sockets/utils/getWDSMetadata.d.ts +12 -1
- package/dist/sockets/utils/getWDSMetadata.js +6 -6
- package/dist/utils/getAdditionalEntries.d.ts +2 -2
- package/dist/utils/getAdditionalEntries.js +11 -11
- package/dist/utils/getSocketIntegration.d.ts +2 -2
- package/dist/utils/getSocketIntegration.js +4 -3
- package/package.json +31 -21
package/client/refreshUtils.js
CHANGED
@@ -9,7 +9,7 @@
|
|
9
9
|
*/
|
10
10
|
|
11
11
|
/* global __webpack_require__ */
|
12
|
-
var Refresh = require(
|
12
|
+
var Refresh = require('react-refresh/runtime');
|
13
13
|
|
14
14
|
/**
|
15
15
|
* Extracts exports from a webpack module object.
|
@@ -17,32 +17,32 @@ var Refresh = require("react-refresh/runtime");
|
|
17
17
|
* @returns {*} An exports object from the module.
|
18
18
|
*/
|
19
19
|
function getModuleExports(moduleId) {
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
20
|
+
if (typeof moduleId === 'undefined') {
|
21
|
+
// `moduleId` is unavailable, which indicates that this module is not in the cache,
|
22
|
+
// which means we won't be able to capture any exports,
|
23
|
+
// and thus they cannot be refreshed safely.
|
24
|
+
// These are likely runtime or dynamically generated modules.
|
25
|
+
return {};
|
26
|
+
}
|
27
|
+
|
28
|
+
var maybeModule = __webpack_require__.c[moduleId];
|
29
|
+
if (typeof maybeModule === 'undefined') {
|
30
|
+
// `moduleId` is available but the module in cache is unavailable,
|
31
|
+
// which indicates the module is somehow corrupted (e.g. broken Webpacak `module` globals).
|
32
|
+
// We will warn the user (as this is likely a mistake) and assume they cannot be refreshed.
|
33
|
+
console.warn(
|
34
|
+
'[React Refresh] Failed to get exports for module: ' + moduleId + '.',
|
35
|
+
);
|
36
|
+
return {};
|
37
|
+
}
|
38
|
+
|
39
|
+
var exportsOrPromise = maybeModule.exports;
|
40
|
+
if (typeof Promise !== 'undefined' && exportsOrPromise instanceof Promise) {
|
41
|
+
return exportsOrPromise.then(function (exports) {
|
42
|
+
return exports;
|
43
|
+
});
|
44
|
+
}
|
45
|
+
return exportsOrPromise;
|
46
46
|
}
|
47
47
|
|
48
48
|
/**
|
@@ -54,24 +54,24 @@ function getModuleExports(moduleId) {
|
|
54
54
|
* @returns {string[]} A React refresh boundary signature array.
|
55
55
|
*/
|
56
56
|
function getReactRefreshBoundarySignature(moduleExports) {
|
57
|
-
|
58
|
-
|
57
|
+
var signature = [];
|
58
|
+
signature.push(Refresh.getFamilyByType(moduleExports));
|
59
59
|
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
60
|
+
if (moduleExports == null || typeof moduleExports !== 'object') {
|
61
|
+
// Exit if we can't iterate over exports.
|
62
|
+
return signature;
|
63
|
+
}
|
64
64
|
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
65
|
+
for (var key in moduleExports) {
|
66
|
+
if (key === '__esModule') {
|
67
|
+
continue;
|
68
|
+
}
|
69
69
|
|
70
|
-
|
71
|
-
|
72
|
-
|
70
|
+
signature.push(key);
|
71
|
+
signature.push(Refresh.getFamilyByType(moduleExports[key]));
|
72
|
+
}
|
73
73
|
|
74
|
-
|
74
|
+
return signature;
|
75
75
|
}
|
76
76
|
|
77
77
|
/**
|
@@ -79,28 +79,28 @@ function getReactRefreshBoundarySignature(moduleExports) {
|
|
79
79
|
* @returns {function(function(): void): void} A debounced React refresh function.
|
80
80
|
*/
|
81
81
|
function createDebounceUpdate() {
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
82
|
+
/**
|
83
|
+
* A cached setTimeout handler.
|
84
|
+
* @type {number | undefined}
|
85
|
+
*/
|
86
|
+
var refreshTimeout;
|
87
|
+
|
88
|
+
/**
|
89
|
+
* Performs react refresh on a delay and clears the error overlay.
|
90
|
+
* @param {function(): void} callback
|
91
|
+
* @returns {void}
|
92
|
+
*/
|
93
|
+
function enqueueUpdate(callback) {
|
94
|
+
if (typeof refreshTimeout === 'undefined') {
|
95
|
+
refreshTimeout = setTimeout(function () {
|
96
|
+
refreshTimeout = undefined;
|
97
|
+
Refresh.performReactRefresh();
|
98
|
+
callback();
|
99
|
+
}, 30);
|
100
|
+
}
|
101
|
+
}
|
102
|
+
|
103
|
+
return enqueueUpdate;
|
104
104
|
}
|
105
105
|
|
106
106
|
/**
|
@@ -111,39 +111,39 @@ function createDebounceUpdate() {
|
|
111
111
|
* @returns {boolean} Whether the exports are React component like.
|
112
112
|
*/
|
113
113
|
function isReactRefreshBoundary(moduleExports) {
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
114
|
+
if (Refresh.isLikelyComponentType(moduleExports)) {
|
115
|
+
return true;
|
116
|
+
}
|
117
|
+
if (
|
118
|
+
moduleExports === undefined ||
|
119
|
+
moduleExports === null ||
|
120
|
+
typeof moduleExports !== 'object'
|
121
|
+
) {
|
122
|
+
// Exit if we can't iterate over exports.
|
123
|
+
return false;
|
124
|
+
}
|
125
|
+
|
126
|
+
var hasExports = false;
|
127
|
+
var areAllExportsComponents = true;
|
128
|
+
for (var key in moduleExports) {
|
129
|
+
hasExports = true;
|
130
|
+
|
131
|
+
// This is the ES Module indicator flag
|
132
|
+
if (key === '__esModule') {
|
133
|
+
continue;
|
134
|
+
}
|
135
|
+
|
136
|
+
// We can (and have to) safely execute getters here,
|
137
|
+
// as Webpack manually assigns harmony exports to getters,
|
138
|
+
// without any side-effects attached.
|
139
|
+
// Ref: https://github.com/webpack/webpack/blob/b93048643fe74de2a6931755911da1212df55897/lib/MainTemplate.js#L281
|
140
|
+
var exportValue = moduleExports[key];
|
141
|
+
if (!Refresh.isLikelyComponentType(exportValue)) {
|
142
|
+
areAllExportsComponents = false;
|
143
|
+
}
|
144
|
+
}
|
145
|
+
|
146
|
+
return hasExports && areAllExportsComponents;
|
147
147
|
}
|
148
148
|
|
149
149
|
/**
|
@@ -155,32 +155,32 @@ function isReactRefreshBoundary(moduleExports) {
|
|
155
155
|
* @returns {void}
|
156
156
|
*/
|
157
157
|
function registerExportsForReactRefresh(moduleExports, moduleId) {
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
158
|
+
if (Refresh.isLikelyComponentType(moduleExports)) {
|
159
|
+
// Register module.exports if it is likely a component
|
160
|
+
Refresh.register(moduleExports, moduleId + ' %exports%');
|
161
|
+
}
|
162
|
+
|
163
|
+
if (
|
164
|
+
moduleExports === undefined ||
|
165
|
+
moduleExports === null ||
|
166
|
+
typeof moduleExports !== 'object'
|
167
|
+
) {
|
168
|
+
// Exit if we can't iterate over the exports.
|
169
|
+
return;
|
170
|
+
}
|
171
|
+
|
172
|
+
for (var key in moduleExports) {
|
173
|
+
// Skip registering the ES Module indicator
|
174
|
+
if (key === '__esModule') {
|
175
|
+
continue;
|
176
|
+
}
|
177
|
+
|
178
|
+
var exportValue = moduleExports[key];
|
179
|
+
if (Refresh.isLikelyComponentType(exportValue)) {
|
180
|
+
var typeID = moduleId + ' %exports% ' + key;
|
181
|
+
Refresh.register(exportValue, typeID);
|
182
|
+
}
|
183
|
+
}
|
184
184
|
}
|
185
185
|
|
186
186
|
/**
|
@@ -192,106 +192,106 @@ function registerExportsForReactRefresh(moduleExports, moduleId) {
|
|
192
192
|
* @returns {boolean} Whether the React refresh boundary should be invalidated.
|
193
193
|
*/
|
194
194
|
function shouldInvalidateReactRefreshBoundary(prevExports, nextExports) {
|
195
|
-
|
196
|
-
|
195
|
+
var prevSignature = getReactRefreshBoundarySignature(prevExports);
|
196
|
+
var nextSignature = getReactRefreshBoundarySignature(nextExports);
|
197
197
|
|
198
|
-
|
199
|
-
|
200
|
-
|
198
|
+
if (prevSignature.length !== nextSignature.length) {
|
199
|
+
return true;
|
200
|
+
}
|
201
201
|
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
202
|
+
for (var i = 0; i < nextSignature.length; i += 1) {
|
203
|
+
if (prevSignature[i] !== nextSignature[i]) {
|
204
|
+
return true;
|
205
|
+
}
|
206
|
+
}
|
207
207
|
|
208
|
-
|
208
|
+
return false;
|
209
209
|
}
|
210
210
|
|
211
211
|
var enqueueUpdate = createDebounceUpdate();
|
212
212
|
function executeRuntime(
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
213
|
+
moduleExports,
|
214
|
+
moduleId,
|
215
|
+
webpackHot,
|
216
|
+
refreshOverlay,
|
217
|
+
isTest,
|
218
218
|
) {
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
219
|
+
registerExportsForReactRefresh(moduleExports, moduleId);
|
220
|
+
|
221
|
+
if (webpackHot) {
|
222
|
+
var isHotUpdate = !!webpackHot.data;
|
223
|
+
var prevExports;
|
224
|
+
if (isHotUpdate) {
|
225
|
+
prevExports = webpackHot.data.prevExports;
|
226
|
+
}
|
227
|
+
|
228
|
+
if (isReactRefreshBoundary(moduleExports)) {
|
229
|
+
webpackHot.dispose(
|
230
|
+
/**
|
231
|
+
* A callback to performs a full refresh if React has unrecoverable errors,
|
232
|
+
* and also caches the to-be-disposed module.
|
233
|
+
* @param {*} data A hot module data object from Webpack HMR.
|
234
|
+
* @returns {void}
|
235
|
+
*/
|
236
|
+
function hotDisposeCallback(data) {
|
237
|
+
// We have to mutate the data object to get data registered and cached
|
238
|
+
data.prevExports = moduleExports;
|
239
|
+
},
|
240
|
+
);
|
241
|
+
webpackHot.accept(
|
242
|
+
/**
|
243
|
+
* An error handler to allow self-recovering behaviours.
|
244
|
+
* @param {Error} error An error occurred during evaluation of a module.
|
245
|
+
* @returns {void}
|
246
|
+
*/
|
247
|
+
function hotErrorHandler(error) {
|
248
|
+
if (typeof refreshOverlay !== 'undefined' && refreshOverlay) {
|
249
|
+
refreshOverlay.handleRuntimeError(error);
|
250
|
+
}
|
251
|
+
|
252
|
+
if (typeof isTest !== 'undefined' && isTest) {
|
253
|
+
if (window.onHotAcceptError) {
|
254
|
+
window.onHotAcceptError(error.message);
|
255
|
+
}
|
256
|
+
}
|
257
|
+
|
258
|
+
__webpack_require__.c[moduleId].hot.accept(hotErrorHandler);
|
259
|
+
},
|
260
|
+
);
|
261
|
+
|
262
|
+
if (isHotUpdate) {
|
263
|
+
if (
|
264
|
+
isReactRefreshBoundary(prevExports) &&
|
265
|
+
shouldInvalidateReactRefreshBoundary(prevExports, moduleExports)
|
266
|
+
) {
|
267
|
+
webpackHot.invalidate();
|
268
|
+
} else {
|
269
|
+
enqueueUpdate(
|
270
|
+
/**
|
271
|
+
* A function to dismiss the error overlay after performing React refresh.
|
272
|
+
* @returns {void}
|
273
|
+
*/
|
274
|
+
function updateCallback() {
|
275
|
+
if (typeof refreshOverlay !== 'undefined' && refreshOverlay) {
|
276
|
+
refreshOverlay.clearRuntimeErrors();
|
277
|
+
}
|
278
|
+
},
|
279
|
+
);
|
280
|
+
}
|
281
|
+
}
|
282
|
+
} else {
|
283
|
+
if (isHotUpdate && typeof prevExports !== 'undefined') {
|
284
|
+
webpackHot.invalidate();
|
285
|
+
}
|
286
|
+
}
|
287
|
+
}
|
288
288
|
}
|
289
289
|
|
290
290
|
module.exports = Object.freeze({
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
291
|
+
enqueueUpdate: enqueueUpdate,
|
292
|
+
executeRuntime: executeRuntime,
|
293
|
+
getModuleExports: getModuleExports,
|
294
|
+
isReactRefreshBoundary: isReactRefreshBoundary,
|
295
|
+
shouldInvalidateReactRefreshBoundary: shouldInvalidateReactRefreshBoundary,
|
296
|
+
registerExportsForReactRefresh: registerExportsForReactRefresh,
|
297
297
|
});
|