@bleedingdev/modern-js-server 3.9.0-ultramodern.16 → 3.9.0-ultramodern.18
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/dist/cjs/createDevServer.js +1 -0
- package/dist/cjs/dev-tools/reloadManager.js +27 -3
- package/dist/cjs/dev.js +4 -4
- package/dist/cjs/helpers/repack.js +12 -9
- package/dist/esm/createDevServer.mjs +1 -0
- package/dist/esm/dev-tools/reloadManager.mjs +27 -3
- package/dist/esm/dev.mjs +4 -4
- package/dist/esm/helpers/repack.mjs +12 -9
- package/dist/esm-node/createDevServer.mjs +1 -0
- package/dist/esm-node/dev-tools/reloadManager.mjs +27 -3
- package/dist/esm-node/dev.mjs +4 -4
- package/dist/esm-node/helpers/repack.mjs +12 -9
- package/dist/types/dev-tools/reloadManager.d.ts +9 -0
- package/dist/types/dev.d.ts +6 -1
- package/dist/types/helpers/repack.d.ts +11 -1
- package/package.json +7 -7
|
@@ -149,6 +149,7 @@ async function createDevServer(options, applyPlugins) {
|
|
|
149
149
|
compiler,
|
|
150
150
|
nodeServer,
|
|
151
151
|
getRuntimeServer: ()=>currentRuntimeServer,
|
|
152
|
+
holdRequests: (task)=>reloadManager.hold(task),
|
|
152
153
|
onFileChange: (filepath)=>{
|
|
153
154
|
pendingReloadFiles.add(external_node_path_default().relative(pwd, filepath));
|
|
154
155
|
reloadManager.schedule();
|
|
@@ -108,13 +108,21 @@ const notReadyHandle = ()=>new Response('Dev server is starting…', {
|
|
|
108
108
|
'content-type': 'text/plain; charset=utf-8'
|
|
109
109
|
}
|
|
110
110
|
});
|
|
111
|
-
var _current = /*#__PURE__*/ new WeakMap(), _build = /*#__PURE__*/ new WeakMap(), _debounceMs = /*#__PURE__*/ new WeakMap(), _onReload = /*#__PURE__*/ new WeakMap(), _onError = /*#__PURE__*/ new WeakMap(), _onReloadError = /*#__PURE__*/ new WeakMap(), _debounceTimer = /*#__PURE__*/ new WeakMap(), _running = /*#__PURE__*/ new WeakMap(), _pending = /*#__PURE__*/ new WeakMap(), _runningPromise = /*#__PURE__*/ new WeakMap(), _closed = /*#__PURE__*/ new WeakMap(), _runLoop = /*#__PURE__*/ new WeakSet(), _reportBuildError = /*#__PURE__*/ new WeakSet(), _reportReloadCallbackError = /*#__PURE__*/ new WeakSet(), _dispose = /*#__PURE__*/ new WeakSet();
|
|
111
|
+
var _current = /*#__PURE__*/ new WeakMap(), _build = /*#__PURE__*/ new WeakMap(), _debounceMs = /*#__PURE__*/ new WeakMap(), _onReload = /*#__PURE__*/ new WeakMap(), _onError = /*#__PURE__*/ new WeakMap(), _onReloadError = /*#__PURE__*/ new WeakMap(), _debounceTimer = /*#__PURE__*/ new WeakMap(), _running = /*#__PURE__*/ new WeakMap(), _pending = /*#__PURE__*/ new WeakMap(), _runningPromise = /*#__PURE__*/ new WeakMap(), _closed = /*#__PURE__*/ new WeakMap(), _held = /*#__PURE__*/ new WeakMap(), _holding = /*#__PURE__*/ new WeakMap(), _released = /*#__PURE__*/ new WeakSet(), _runLoop = /*#__PURE__*/ new WeakSet(), _reportBuildError = /*#__PURE__*/ new WeakSet(), _reportReloadCallbackError = /*#__PURE__*/ new WeakSet(), _dispose = /*#__PURE__*/ new WeakSet();
|
|
112
112
|
class ReloadManager {
|
|
113
113
|
setHandle(handle) {
|
|
114
114
|
_class_private_field_set(this, _current, handle);
|
|
115
115
|
}
|
|
116
116
|
get handle() {
|
|
117
|
-
return (request, ...args)=>_class_private_field_get(this, _current).call(this, request, ...args);
|
|
117
|
+
return (request, ...args)=>0 === _class_private_field_get(this, _holding) ? _class_private_field_get(this, _current).call(this, request, ...args) : _class_private_method_get(this, _released, released).call(this).then(()=>_class_private_field_get(this, _current).call(this, request, ...args));
|
|
118
|
+
}
|
|
119
|
+
hold(task) {
|
|
120
|
+
_class_private_field_set(this, _holding, _class_private_field_get(this, _holding) + 1);
|
|
121
|
+
const run = _class_private_field_get(this, _held).then(task).finally(()=>{
|
|
122
|
+
_class_private_field_set(this, _holding, _class_private_field_get(this, _holding) - 1);
|
|
123
|
+
});
|
|
124
|
+
_class_private_field_set(this, _held, run.catch(()=>{}));
|
|
125
|
+
return run;
|
|
118
126
|
}
|
|
119
127
|
get currentHandle() {
|
|
120
128
|
return _class_private_field_get(this, _current);
|
|
@@ -153,9 +161,11 @@ class ReloadManager {
|
|
|
153
161
|
clearTimeout(_class_private_field_get(this, _debounceTimer));
|
|
154
162
|
_class_private_field_set(this, _debounceTimer, null);
|
|
155
163
|
}
|
|
156
|
-
|
|
164
|
+
const current = _class_private_field_get(this, _current);
|
|
165
|
+
_class_private_method_get(this, _released, released).call(this).then(()=>_class_private_method_get(this, _dispose, reloadManager_dispose).call(this, current));
|
|
157
166
|
}
|
|
158
167
|
constructor(options){
|
|
168
|
+
_class_private_method_init(this, _released);
|
|
159
169
|
_class_private_method_init(this, _runLoop);
|
|
160
170
|
_class_private_method_init(this, _reportBuildError);
|
|
161
171
|
_class_private_method_init(this, _reportReloadCallbackError);
|
|
@@ -204,11 +214,21 @@ class ReloadManager {
|
|
|
204
214
|
writable: true,
|
|
205
215
|
value: void 0
|
|
206
216
|
});
|
|
217
|
+
_class_private_field_init(this, _held, {
|
|
218
|
+
writable: true,
|
|
219
|
+
value: void 0
|
|
220
|
+
});
|
|
221
|
+
_class_private_field_init(this, _holding, {
|
|
222
|
+
writable: true,
|
|
223
|
+
value: void 0
|
|
224
|
+
});
|
|
207
225
|
_class_private_field_set(this, _debounceTimer, null);
|
|
208
226
|
_class_private_field_set(this, _running, false);
|
|
209
227
|
_class_private_field_set(this, _pending, false);
|
|
210
228
|
_class_private_field_set(this, _runningPromise, null);
|
|
211
229
|
_class_private_field_set(this, _closed, false);
|
|
230
|
+
_class_private_field_set(this, _held, Promise.resolve());
|
|
231
|
+
_class_private_field_set(this, _holding, 0);
|
|
212
232
|
_class_private_field_set(this, _current, options.initialHandle ?? notReadyHandle);
|
|
213
233
|
_class_private_field_set(this, _build, options.build);
|
|
214
234
|
_class_private_field_set(this, _debounceMs, options.debounceMs ?? DEFAULT_DEBOUNCE_MS);
|
|
@@ -217,6 +237,9 @@ class ReloadManager {
|
|
|
217
237
|
_class_private_field_set(this, _onReloadError, options.onReloadError);
|
|
218
238
|
}
|
|
219
239
|
}
|
|
240
|
+
async function released() {
|
|
241
|
+
while(_class_private_field_get(this, _holding) > 0)await _class_private_field_get(this, _held);
|
|
242
|
+
}
|
|
220
243
|
async function runLoop() {
|
|
221
244
|
var _this, _this1;
|
|
222
245
|
do {
|
|
@@ -228,6 +251,7 @@ async function runLoop() {
|
|
|
228
251
|
_class_private_method_get(this, _reportBuildError, reportBuildError).call(this, error);
|
|
229
252
|
continue;
|
|
230
253
|
}
|
|
254
|
+
await _class_private_method_get(this, _released, released).call(this);
|
|
231
255
|
if (_class_private_field_get(this, _closed)) return void await _class_private_method_get(this, _dispose, reloadManager_dispose).call(this, next);
|
|
232
256
|
const previous = _class_private_field_get(this, _current);
|
|
233
257
|
_class_private_field_set(this, _current, next);
|
package/dist/cjs/dev.js
CHANGED
|
@@ -81,7 +81,7 @@ const devRuntimeMiddlewarePlugin = (options, compiler)=>({
|
|
|
81
81
|
});
|
|
82
82
|
}
|
|
83
83
|
});
|
|
84
|
-
function setupDevInfra({ config, pwd, distDir, apiDir, sharedDir, builder, builderDevServer, getRuntimeServer, onFileChange, onClose, nodeServer }) {
|
|
84
|
+
function setupDevInfra({ config, pwd, distDir, apiDir, sharedDir, builder, builderDevServer, getRuntimeServer, holdRequests, onFileChange, onClose, nodeServer }) {
|
|
85
85
|
const { close, connectWebSocket } = builderDevServer || {};
|
|
86
86
|
const closeCb = [];
|
|
87
87
|
close && closeCb.push(close);
|
|
@@ -91,10 +91,10 @@ function setupDevInfra({ config, pwd, distDir, apiDir, sharedDir, builder, build
|
|
|
91
91
|
builder?.onDevCompileDone(({ stats })=>{
|
|
92
92
|
if ('server' !== stats.toJson({
|
|
93
93
|
all: false
|
|
94
|
-
}).name) {
|
|
94
|
+
}).name) holdRequests(async ()=>{
|
|
95
95
|
const runtimeServer = getRuntimeServer();
|
|
96
|
-
if (runtimeServer) (0, index_js_namespaceObject.onRepack)(distDir, runtimeServer.hooks);
|
|
97
|
-
}
|
|
96
|
+
if (runtimeServer) await (0, index_js_namespaceObject.onRepack)(distDir, runtimeServer.hooks);
|
|
97
|
+
}).catch((error)=>utils_namespaceObject.logger.error(error));
|
|
98
98
|
});
|
|
99
99
|
const { watchOptions } = config.server;
|
|
100
100
|
const mockDir = config.dev?.mockDir;
|
|
@@ -52,15 +52,18 @@ const cleanFederationRuntime = ()=>{
|
|
|
52
52
|
const remoteEntries = runtime.__GLOBAL_LOADING_REMOTE_ENTRY__ ?? {};
|
|
53
53
|
for (const key of Object.keys(remoteEntries))delete remoteEntries[key];
|
|
54
54
|
};
|
|
55
|
-
const onRepack = (distDir, hooks)=>{
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
55
|
+
const onRepack = async (distDir, hooks)=>{
|
|
56
|
+
try {
|
|
57
|
+
await hooks.onReset.call({
|
|
58
|
+
event: {
|
|
59
|
+
type: 'repack'
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
} finally{
|
|
63
|
+
cleanSSRCache(distDir);
|
|
64
|
+
cleanFederationRuntime();
|
|
65
|
+
fileReader_namespaceObject.fileReader.reset();
|
|
66
|
+
}
|
|
64
67
|
};
|
|
65
68
|
exports.onRepack = __webpack_exports__.onRepack;
|
|
66
69
|
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
@@ -107,6 +107,7 @@ async function createDevServer(options, applyPlugins) {
|
|
|
107
107
|
compiler,
|
|
108
108
|
nodeServer,
|
|
109
109
|
getRuntimeServer: ()=>currentRuntimeServer,
|
|
110
|
+
holdRequests: (task)=>reloadManager.hold(task),
|
|
110
111
|
onFileChange: (filepath)=>{
|
|
111
112
|
pendingReloadFiles.add(node_path.relative(pwd, filepath));
|
|
112
113
|
reloadManager.schedule();
|
|
@@ -74,13 +74,21 @@ const notReadyHandle = ()=>new Response('Dev server is starting…', {
|
|
|
74
74
|
'content-type': 'text/plain; charset=utf-8'
|
|
75
75
|
}
|
|
76
76
|
});
|
|
77
|
-
var _current = /*#__PURE__*/ new WeakMap(), _build = /*#__PURE__*/ new WeakMap(), _debounceMs = /*#__PURE__*/ new WeakMap(), _onReload = /*#__PURE__*/ new WeakMap(), _onError = /*#__PURE__*/ new WeakMap(), _onReloadError = /*#__PURE__*/ new WeakMap(), _debounceTimer = /*#__PURE__*/ new WeakMap(), _running = /*#__PURE__*/ new WeakMap(), _pending = /*#__PURE__*/ new WeakMap(), _runningPromise = /*#__PURE__*/ new WeakMap(), _closed = /*#__PURE__*/ new WeakMap(), _runLoop = /*#__PURE__*/ new WeakSet(), _reportBuildError = /*#__PURE__*/ new WeakSet(), _reportReloadCallbackError = /*#__PURE__*/ new WeakSet(), _dispose = /*#__PURE__*/ new WeakSet();
|
|
77
|
+
var _current = /*#__PURE__*/ new WeakMap(), _build = /*#__PURE__*/ new WeakMap(), _debounceMs = /*#__PURE__*/ new WeakMap(), _onReload = /*#__PURE__*/ new WeakMap(), _onError = /*#__PURE__*/ new WeakMap(), _onReloadError = /*#__PURE__*/ new WeakMap(), _debounceTimer = /*#__PURE__*/ new WeakMap(), _running = /*#__PURE__*/ new WeakMap(), _pending = /*#__PURE__*/ new WeakMap(), _runningPromise = /*#__PURE__*/ new WeakMap(), _closed = /*#__PURE__*/ new WeakMap(), _held = /*#__PURE__*/ new WeakMap(), _holding = /*#__PURE__*/ new WeakMap(), _released = /*#__PURE__*/ new WeakSet(), _runLoop = /*#__PURE__*/ new WeakSet(), _reportBuildError = /*#__PURE__*/ new WeakSet(), _reportReloadCallbackError = /*#__PURE__*/ new WeakSet(), _dispose = /*#__PURE__*/ new WeakSet();
|
|
78
78
|
class ReloadManager {
|
|
79
79
|
setHandle(handle) {
|
|
80
80
|
_class_private_field_set(this, _current, handle);
|
|
81
81
|
}
|
|
82
82
|
get handle() {
|
|
83
|
-
return (request, ...args)=>_class_private_field_get(this, _current).call(this, request, ...args);
|
|
83
|
+
return (request, ...args)=>0 === _class_private_field_get(this, _holding) ? _class_private_field_get(this, _current).call(this, request, ...args) : _class_private_method_get(this, _released, released).call(this).then(()=>_class_private_field_get(this, _current).call(this, request, ...args));
|
|
84
|
+
}
|
|
85
|
+
hold(task) {
|
|
86
|
+
_class_private_field_set(this, _holding, _class_private_field_get(this, _holding) + 1);
|
|
87
|
+
const run = _class_private_field_get(this, _held).then(task).finally(()=>{
|
|
88
|
+
_class_private_field_set(this, _holding, _class_private_field_get(this, _holding) - 1);
|
|
89
|
+
});
|
|
90
|
+
_class_private_field_set(this, _held, run.catch(()=>{}));
|
|
91
|
+
return run;
|
|
84
92
|
}
|
|
85
93
|
get currentHandle() {
|
|
86
94
|
return _class_private_field_get(this, _current);
|
|
@@ -119,9 +127,11 @@ class ReloadManager {
|
|
|
119
127
|
clearTimeout(_class_private_field_get(this, _debounceTimer));
|
|
120
128
|
_class_private_field_set(this, _debounceTimer, null);
|
|
121
129
|
}
|
|
122
|
-
|
|
130
|
+
const current = _class_private_field_get(this, _current);
|
|
131
|
+
_class_private_method_get(this, _released, released).call(this).then(()=>_class_private_method_get(this, _dispose, reloadManager_dispose).call(this, current));
|
|
123
132
|
}
|
|
124
133
|
constructor(options){
|
|
134
|
+
_class_private_method_init(this, _released);
|
|
125
135
|
_class_private_method_init(this, _runLoop);
|
|
126
136
|
_class_private_method_init(this, _reportBuildError);
|
|
127
137
|
_class_private_method_init(this, _reportReloadCallbackError);
|
|
@@ -170,11 +180,21 @@ class ReloadManager {
|
|
|
170
180
|
writable: true,
|
|
171
181
|
value: void 0
|
|
172
182
|
});
|
|
183
|
+
_class_private_field_init(this, _held, {
|
|
184
|
+
writable: true,
|
|
185
|
+
value: void 0
|
|
186
|
+
});
|
|
187
|
+
_class_private_field_init(this, _holding, {
|
|
188
|
+
writable: true,
|
|
189
|
+
value: void 0
|
|
190
|
+
});
|
|
173
191
|
_class_private_field_set(this, _debounceTimer, null);
|
|
174
192
|
_class_private_field_set(this, _running, false);
|
|
175
193
|
_class_private_field_set(this, _pending, false);
|
|
176
194
|
_class_private_field_set(this, _runningPromise, null);
|
|
177
195
|
_class_private_field_set(this, _closed, false);
|
|
196
|
+
_class_private_field_set(this, _held, Promise.resolve());
|
|
197
|
+
_class_private_field_set(this, _holding, 0);
|
|
178
198
|
_class_private_field_set(this, _current, options.initialHandle ?? notReadyHandle);
|
|
179
199
|
_class_private_field_set(this, _build, options.build);
|
|
180
200
|
_class_private_field_set(this, _debounceMs, options.debounceMs ?? DEFAULT_DEBOUNCE_MS);
|
|
@@ -183,6 +203,9 @@ class ReloadManager {
|
|
|
183
203
|
_class_private_field_set(this, _onReloadError, options.onReloadError);
|
|
184
204
|
}
|
|
185
205
|
}
|
|
206
|
+
async function released() {
|
|
207
|
+
while(_class_private_field_get(this, _holding) > 0)await _class_private_field_get(this, _held);
|
|
208
|
+
}
|
|
186
209
|
async function runLoop() {
|
|
187
210
|
var _this, _this1;
|
|
188
211
|
do {
|
|
@@ -194,6 +217,7 @@ async function runLoop() {
|
|
|
194
217
|
_class_private_method_get(this, _reportBuildError, reportBuildError).call(this, error);
|
|
195
218
|
continue;
|
|
196
219
|
}
|
|
220
|
+
await _class_private_method_get(this, _released, released).call(this);
|
|
197
221
|
if (_class_private_field_get(this, _closed)) return void await _class_private_method_get(this, _dispose, reloadManager_dispose).call(this, next);
|
|
198
222
|
const previous = _class_private_field_get(this, _current);
|
|
199
223
|
_class_private_field_set(this, _current, next);
|
package/dist/esm/dev.mjs
CHANGED
|
@@ -48,7 +48,7 @@ const devRuntimeMiddlewarePlugin = (options, compiler)=>({
|
|
|
48
48
|
});
|
|
49
49
|
}
|
|
50
50
|
});
|
|
51
|
-
function setupDevInfra({ config, pwd, distDir, apiDir, sharedDir, builder, builderDevServer, getRuntimeServer, onFileChange, onClose, nodeServer }) {
|
|
51
|
+
function setupDevInfra({ config, pwd, distDir, apiDir, sharedDir, builder, builderDevServer, getRuntimeServer, holdRequests, onFileChange, onClose, nodeServer }) {
|
|
52
52
|
const { close, connectWebSocket } = builderDevServer || {};
|
|
53
53
|
const closeCb = [];
|
|
54
54
|
close && closeCb.push(close);
|
|
@@ -58,10 +58,10 @@ function setupDevInfra({ config, pwd, distDir, apiDir, sharedDir, builder, build
|
|
|
58
58
|
builder?.onDevCompileDone(({ stats })=>{
|
|
59
59
|
if ('server' !== stats.toJson({
|
|
60
60
|
all: false
|
|
61
|
-
}).name) {
|
|
61
|
+
}).name) holdRequests(async ()=>{
|
|
62
62
|
const runtimeServer = getRuntimeServer();
|
|
63
|
-
if (runtimeServer) onRepack(distDir, runtimeServer.hooks);
|
|
64
|
-
}
|
|
63
|
+
if (runtimeServer) await onRepack(distDir, runtimeServer.hooks);
|
|
64
|
+
}).catch((error)=>logger.error(error));
|
|
65
65
|
});
|
|
66
66
|
const { watchOptions } = config.server;
|
|
67
67
|
const mockDir = config.dev?.mockDir;
|
|
@@ -20,14 +20,17 @@ const cleanFederationRuntime = ()=>{
|
|
|
20
20
|
const remoteEntries = runtime.__GLOBAL_LOADING_REMOTE_ENTRY__ ?? {};
|
|
21
21
|
for (const key of Object.keys(remoteEntries))delete remoteEntries[key];
|
|
22
22
|
};
|
|
23
|
-
const onRepack = (distDir, hooks)=>{
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
23
|
+
const onRepack = async (distDir, hooks)=>{
|
|
24
|
+
try {
|
|
25
|
+
await hooks.onReset.call({
|
|
26
|
+
event: {
|
|
27
|
+
type: 'repack'
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
} finally{
|
|
31
|
+
cleanSSRCache(distDir);
|
|
32
|
+
cleanFederationRuntime();
|
|
33
|
+
fileReader.reset();
|
|
34
|
+
}
|
|
32
35
|
};
|
|
33
36
|
export { onRepack };
|
|
@@ -108,6 +108,7 @@ async function createDevServer(options, applyPlugins) {
|
|
|
108
108
|
compiler,
|
|
109
109
|
nodeServer,
|
|
110
110
|
getRuntimeServer: ()=>currentRuntimeServer,
|
|
111
|
+
holdRequests: (task)=>reloadManager.hold(task),
|
|
111
112
|
onFileChange: (filepath)=>{
|
|
112
113
|
pendingReloadFiles.add(node_path.relative(pwd, filepath));
|
|
113
114
|
reloadManager.schedule();
|
|
@@ -75,13 +75,21 @@ const notReadyHandle = ()=>new Response('Dev server is starting…', {
|
|
|
75
75
|
'content-type': 'text/plain; charset=utf-8'
|
|
76
76
|
}
|
|
77
77
|
});
|
|
78
|
-
var _current = /*#__PURE__*/ new WeakMap(), _build = /*#__PURE__*/ new WeakMap(), _debounceMs = /*#__PURE__*/ new WeakMap(), _onReload = /*#__PURE__*/ new WeakMap(), _onError = /*#__PURE__*/ new WeakMap(), _onReloadError = /*#__PURE__*/ new WeakMap(), _debounceTimer = /*#__PURE__*/ new WeakMap(), _running = /*#__PURE__*/ new WeakMap(), _pending = /*#__PURE__*/ new WeakMap(), _runningPromise = /*#__PURE__*/ new WeakMap(), _closed = /*#__PURE__*/ new WeakMap(), _runLoop = /*#__PURE__*/ new WeakSet(), _reportBuildError = /*#__PURE__*/ new WeakSet(), _reportReloadCallbackError = /*#__PURE__*/ new WeakSet(), _dispose = /*#__PURE__*/ new WeakSet();
|
|
78
|
+
var _current = /*#__PURE__*/ new WeakMap(), _build = /*#__PURE__*/ new WeakMap(), _debounceMs = /*#__PURE__*/ new WeakMap(), _onReload = /*#__PURE__*/ new WeakMap(), _onError = /*#__PURE__*/ new WeakMap(), _onReloadError = /*#__PURE__*/ new WeakMap(), _debounceTimer = /*#__PURE__*/ new WeakMap(), _running = /*#__PURE__*/ new WeakMap(), _pending = /*#__PURE__*/ new WeakMap(), _runningPromise = /*#__PURE__*/ new WeakMap(), _closed = /*#__PURE__*/ new WeakMap(), _held = /*#__PURE__*/ new WeakMap(), _holding = /*#__PURE__*/ new WeakMap(), _released = /*#__PURE__*/ new WeakSet(), _runLoop = /*#__PURE__*/ new WeakSet(), _reportBuildError = /*#__PURE__*/ new WeakSet(), _reportReloadCallbackError = /*#__PURE__*/ new WeakSet(), _dispose = /*#__PURE__*/ new WeakSet();
|
|
79
79
|
class ReloadManager {
|
|
80
80
|
setHandle(handle) {
|
|
81
81
|
_class_private_field_set(this, _current, handle);
|
|
82
82
|
}
|
|
83
83
|
get handle() {
|
|
84
|
-
return (request, ...args)=>_class_private_field_get(this, _current).call(this, request, ...args);
|
|
84
|
+
return (request, ...args)=>0 === _class_private_field_get(this, _holding) ? _class_private_field_get(this, _current).call(this, request, ...args) : _class_private_method_get(this, _released, released).call(this).then(()=>_class_private_field_get(this, _current).call(this, request, ...args));
|
|
85
|
+
}
|
|
86
|
+
hold(task) {
|
|
87
|
+
_class_private_field_set(this, _holding, _class_private_field_get(this, _holding) + 1);
|
|
88
|
+
const run = _class_private_field_get(this, _held).then(task).finally(()=>{
|
|
89
|
+
_class_private_field_set(this, _holding, _class_private_field_get(this, _holding) - 1);
|
|
90
|
+
});
|
|
91
|
+
_class_private_field_set(this, _held, run.catch(()=>{}));
|
|
92
|
+
return run;
|
|
85
93
|
}
|
|
86
94
|
get currentHandle() {
|
|
87
95
|
return _class_private_field_get(this, _current);
|
|
@@ -120,9 +128,11 @@ class ReloadManager {
|
|
|
120
128
|
clearTimeout(_class_private_field_get(this, _debounceTimer));
|
|
121
129
|
_class_private_field_set(this, _debounceTimer, null);
|
|
122
130
|
}
|
|
123
|
-
|
|
131
|
+
const current = _class_private_field_get(this, _current);
|
|
132
|
+
_class_private_method_get(this, _released, released).call(this).then(()=>_class_private_method_get(this, _dispose, reloadManager_dispose).call(this, current));
|
|
124
133
|
}
|
|
125
134
|
constructor(options){
|
|
135
|
+
_class_private_method_init(this, _released);
|
|
126
136
|
_class_private_method_init(this, _runLoop);
|
|
127
137
|
_class_private_method_init(this, _reportBuildError);
|
|
128
138
|
_class_private_method_init(this, _reportReloadCallbackError);
|
|
@@ -171,11 +181,21 @@ class ReloadManager {
|
|
|
171
181
|
writable: true,
|
|
172
182
|
value: void 0
|
|
173
183
|
});
|
|
184
|
+
_class_private_field_init(this, _held, {
|
|
185
|
+
writable: true,
|
|
186
|
+
value: void 0
|
|
187
|
+
});
|
|
188
|
+
_class_private_field_init(this, _holding, {
|
|
189
|
+
writable: true,
|
|
190
|
+
value: void 0
|
|
191
|
+
});
|
|
174
192
|
_class_private_field_set(this, _debounceTimer, null);
|
|
175
193
|
_class_private_field_set(this, _running, false);
|
|
176
194
|
_class_private_field_set(this, _pending, false);
|
|
177
195
|
_class_private_field_set(this, _runningPromise, null);
|
|
178
196
|
_class_private_field_set(this, _closed, false);
|
|
197
|
+
_class_private_field_set(this, _held, Promise.resolve());
|
|
198
|
+
_class_private_field_set(this, _holding, 0);
|
|
179
199
|
_class_private_field_set(this, _current, options.initialHandle ?? notReadyHandle);
|
|
180
200
|
_class_private_field_set(this, _build, options.build);
|
|
181
201
|
_class_private_field_set(this, _debounceMs, options.debounceMs ?? DEFAULT_DEBOUNCE_MS);
|
|
@@ -184,6 +204,9 @@ class ReloadManager {
|
|
|
184
204
|
_class_private_field_set(this, _onReloadError, options.onReloadError);
|
|
185
205
|
}
|
|
186
206
|
}
|
|
207
|
+
async function released() {
|
|
208
|
+
while(_class_private_field_get(this, _holding) > 0)await _class_private_field_get(this, _held);
|
|
209
|
+
}
|
|
187
210
|
async function runLoop() {
|
|
188
211
|
var _this, _this1;
|
|
189
212
|
do {
|
|
@@ -195,6 +218,7 @@ async function runLoop() {
|
|
|
195
218
|
_class_private_method_get(this, _reportBuildError, reportBuildError).call(this, error);
|
|
196
219
|
continue;
|
|
197
220
|
}
|
|
221
|
+
await _class_private_method_get(this, _released, released).call(this);
|
|
198
222
|
if (_class_private_field_get(this, _closed)) return void await _class_private_method_get(this, _dispose, reloadManager_dispose).call(this, next);
|
|
199
223
|
const previous = _class_private_field_get(this, _current);
|
|
200
224
|
_class_private_field_set(this, _current, next);
|
package/dist/esm-node/dev.mjs
CHANGED
|
@@ -49,7 +49,7 @@ const devRuntimeMiddlewarePlugin = (options, compiler)=>({
|
|
|
49
49
|
});
|
|
50
50
|
}
|
|
51
51
|
});
|
|
52
|
-
function setupDevInfra({ config, pwd, distDir, apiDir, sharedDir, builder, builderDevServer, getRuntimeServer, onFileChange, onClose, nodeServer }) {
|
|
52
|
+
function setupDevInfra({ config, pwd, distDir, apiDir, sharedDir, builder, builderDevServer, getRuntimeServer, holdRequests, onFileChange, onClose, nodeServer }) {
|
|
53
53
|
const { close, connectWebSocket } = builderDevServer || {};
|
|
54
54
|
const closeCb = [];
|
|
55
55
|
close && closeCb.push(close);
|
|
@@ -59,10 +59,10 @@ function setupDevInfra({ config, pwd, distDir, apiDir, sharedDir, builder, build
|
|
|
59
59
|
builder?.onDevCompileDone(({ stats })=>{
|
|
60
60
|
if ('server' !== stats.toJson({
|
|
61
61
|
all: false
|
|
62
|
-
}).name) {
|
|
62
|
+
}).name) holdRequests(async ()=>{
|
|
63
63
|
const runtimeServer = getRuntimeServer();
|
|
64
|
-
if (runtimeServer) onRepack(distDir, runtimeServer.hooks);
|
|
65
|
-
}
|
|
64
|
+
if (runtimeServer) await onRepack(distDir, runtimeServer.hooks);
|
|
65
|
+
}).catch((error)=>logger.error(error));
|
|
66
66
|
});
|
|
67
67
|
const { watchOptions } = config.server;
|
|
68
68
|
const mockDir = config.dev?.mockDir;
|
|
@@ -22,14 +22,17 @@ const cleanFederationRuntime = ()=>{
|
|
|
22
22
|
const remoteEntries = runtime.__GLOBAL_LOADING_REMOTE_ENTRY__ ?? {};
|
|
23
23
|
for (const key of Object.keys(remoteEntries))delete remoteEntries[key];
|
|
24
24
|
};
|
|
25
|
-
const onRepack = (distDir, hooks)=>{
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
25
|
+
const onRepack = async (distDir, hooks)=>{
|
|
26
|
+
try {
|
|
27
|
+
await hooks.onReset.call({
|
|
28
|
+
event: {
|
|
29
|
+
type: 'repack'
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
} finally{
|
|
33
|
+
cleanSSRCache(distDir);
|
|
34
|
+
cleanFederationRuntime();
|
|
35
|
+
fileReader.reset();
|
|
36
|
+
}
|
|
34
37
|
};
|
|
35
38
|
export { onRepack };
|
|
@@ -71,6 +71,15 @@ export declare class ReloadManager {
|
|
|
71
71
|
* be recreated on reload.
|
|
72
72
|
*/
|
|
73
73
|
get handle(): ReloadableHandle;
|
|
74
|
+
/**
|
|
75
|
+
* Run `task` after the previously held tasks, and make requests arriving
|
|
76
|
+
* through `handle` wait until it settles. A reload waits for it before it
|
|
77
|
+
* swaps the runtime. Requests already dispatched are not waited for: an SSR
|
|
78
|
+
* loader fetching its own dev server would deadlock. The task itself must
|
|
79
|
+
* not await a request to this handle, which waits for the task.
|
|
80
|
+
* Returns the task's own result, rejection included.
|
|
81
|
+
*/
|
|
82
|
+
hold(task: () => Promise<void>): Promise<void>;
|
|
74
83
|
/** The currently active resolved handle (introspection / tests). */
|
|
75
84
|
get currentHandle(): ReloadableHandle;
|
|
76
85
|
/** Whether a reload is currently running (introspection / tests). */
|
package/dist/types/dev.d.ts
CHANGED
|
@@ -35,6 +35,11 @@ export interface DevInfraOptions {
|
|
|
35
35
|
nodeServer?: NodeServer | NodeHttpsServer | Http2SecureServer;
|
|
36
36
|
/** Accessor for the currently-active runtime ServerBase (a mutable ref). */
|
|
37
37
|
getRuntimeServer: () => ServerBase | undefined;
|
|
38
|
+
/**
|
|
39
|
+
* Run a repack task while new requests wait for it (`ReloadManager.hold`),
|
|
40
|
+
* so no request re-requires the server bundle mid-reset.
|
|
41
|
+
*/
|
|
42
|
+
holdRequests: (task: () => Promise<void>) => Promise<void>;
|
|
38
43
|
/**
|
|
39
44
|
* Triggered when a watched user server file changes (require cache already
|
|
40
45
|
* busted). Wired to the runtime reload scheduler.
|
|
@@ -64,5 +69,5 @@ export interface DevInfra {
|
|
|
64
69
|
* runtime, so a later phase can swap the trigger to the reload scheduler
|
|
65
70
|
* without leaking a stale closure to a dead runtime.
|
|
66
71
|
*/
|
|
67
|
-
export declare function setupDevInfra({ config, pwd, distDir, apiDir, sharedDir, builder, builderDevServer, getRuntimeServer, onFileChange, onClose, nodeServer, }: DevInfraOptions): DevInfra;
|
|
72
|
+
export declare function setupDevInfra({ config, pwd, distDir, apiDir, sharedDir, builder, builderDevServer, getRuntimeServer, holdRequests, onFileChange, onClose, nodeServer, }: DevInfraOptions): DevInfra;
|
|
68
73
|
export {};
|
|
@@ -1,2 +1,12 @@
|
|
|
1
1
|
import type { ServerPluginHooks } from '@modern-js/server-core';
|
|
2
|
-
|
|
2
|
+
/**
|
|
3
|
+
* Reset the dev server after the server bundle is rebuilt.
|
|
4
|
+
*
|
|
5
|
+
* Contract: the `onReset({ event: { type: 'repack' } })` handlers run in
|
|
6
|
+
* registration order and are awaited before the previous generation is purged.
|
|
7
|
+
* The caller holds new requests until this promise settles, so no request
|
|
8
|
+
* re-requires the bundle while a handler is still running. As with every async
|
|
9
|
+
* server hook, a rejecting handler skips the handlers after it; the generation
|
|
10
|
+
* is still purged and the promise rejects with that error.
|
|
11
|
+
*/
|
|
12
|
+
export declare const onRepack: (distDir: string, hooks: ServerPluginHooks) => Promise<void>;
|
package/package.json
CHANGED
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"modern",
|
|
18
18
|
"modern.js"
|
|
19
19
|
],
|
|
20
|
-
"version": "3.9.0-ultramodern.
|
|
20
|
+
"version": "3.9.0-ultramodern.18",
|
|
21
21
|
"types": "./dist/types/index.d.ts",
|
|
22
22
|
"main": "./dist/cjs/index.js",
|
|
23
23
|
"exports": {
|
|
@@ -38,11 +38,11 @@
|
|
|
38
38
|
}
|
|
39
39
|
},
|
|
40
40
|
"dependencies": {
|
|
41
|
-
"@modern-js/runtime-utils": "npm:@bleedingdev/modern-js-runtime-utils@3.9.0-ultramodern.
|
|
42
|
-
"@modern-js/server-core": "npm:@bleedingdev/modern-js-server-core@3.9.0-ultramodern.
|
|
43
|
-
"@modern-js/server-utils": "npm:@bleedingdev/modern-js-server-utils@3.9.0-ultramodern.
|
|
44
|
-
"@modern-js/types": "npm:@bleedingdev/modern-js-types@3.9.0-ultramodern.
|
|
45
|
-
"@modern-js/utils": "npm:@bleedingdev/modern-js-utils@3.9.0-ultramodern.
|
|
41
|
+
"@modern-js/runtime-utils": "npm:@bleedingdev/modern-js-runtime-utils@3.9.0-ultramodern.18",
|
|
42
|
+
"@modern-js/server-core": "npm:@bleedingdev/modern-js-server-core@3.9.0-ultramodern.18",
|
|
43
|
+
"@modern-js/server-utils": "npm:@bleedingdev/modern-js-server-utils@3.9.0-ultramodern.18",
|
|
44
|
+
"@modern-js/types": "npm:@bleedingdev/modern-js-types@3.9.0-ultramodern.18",
|
|
45
|
+
"@modern-js/utils": "npm:@bleedingdev/modern-js-utils@3.9.0-ultramodern.18",
|
|
46
46
|
"@swc/helpers": "^0.5.23",
|
|
47
47
|
"connect-history-api-fallback": "^2.0.0",
|
|
48
48
|
"http-compression": "1.1.3",
|
|
@@ -51,7 +51,7 @@
|
|
|
51
51
|
"ws": "^8.21.3"
|
|
52
52
|
},
|
|
53
53
|
"devDependencies": {
|
|
54
|
-
"@modern-js/builder": "npm:@bleedingdev/modern-js-builder@3.9.0-ultramodern.
|
|
54
|
+
"@modern-js/builder": "npm:@bleedingdev/modern-js-builder@3.9.0-ultramodern.18",
|
|
55
55
|
"@module-federation/runtime": "npm:@bleedingdev/mf-runtime@2.9.1",
|
|
56
56
|
"@rslib/core": "1.0.2",
|
|
57
57
|
"@scripts/rstest-config": "2.66.0",
|