@remix-run/node-hmr 0.0.0 → 0.1.0

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 (53) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +306 -2
  3. package/dist/index.d.ts +128 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +107 -0
  6. package/dist/lib/browser-events.d.ts +99 -0
  7. package/dist/lib/browser-events.d.ts.map +1 -0
  8. package/dist/lib/browser-events.js +11 -0
  9. package/dist/lib/events.d.ts +29 -0
  10. package/dist/lib/events.d.ts.map +1 -0
  11. package/dist/lib/events.js +32 -0
  12. package/dist/lib/hmr-analysis.d.ts +17 -0
  13. package/dist/lib/hmr-analysis.d.ts.map +1 -0
  14. package/dist/lib/hmr-analysis.js +130 -0
  15. package/dist/lib/module-store.d.ts +27 -0
  16. package/dist/lib/module-store.d.ts.map +1 -0
  17. package/dist/lib/module-store.js +161 -0
  18. package/dist/lib/process-state.d.ts +3 -0
  19. package/dist/lib/process-state.d.ts.map +1 -0
  20. package/dist/lib/process-state.js +7 -0
  21. package/dist/lib/runner.d.ts +62 -0
  22. package/dist/lib/runner.d.ts.map +1 -0
  23. package/dist/lib/runner.js +1046 -0
  24. package/dist/lib/runtime-api.d.ts +7 -0
  25. package/dist/lib/runtime-api.d.ts.map +1 -0
  26. package/dist/lib/runtime-api.js +1 -0
  27. package/dist/lib/runtime.d.ts +46 -0
  28. package/dist/lib/runtime.d.ts.map +1 -0
  29. package/dist/lib/runtime.js +374 -0
  30. package/dist/register.d.ts +2 -0
  31. package/dist/register.d.ts.map +1 -0
  32. package/dist/register.js +317 -0
  33. package/dist/runtime.d.ts +26 -0
  34. package/dist/runtime.d.ts.map +1 -0
  35. package/dist/runtime.js +32 -0
  36. package/dist/runtime.node-hmr.d.ts +27 -0
  37. package/dist/runtime.node-hmr.d.ts.map +1 -0
  38. package/dist/runtime.node-hmr.js +33 -0
  39. package/dist/types.d.ts +36 -0
  40. package/package.json +55 -5
  41. package/src/index.ts +244 -0
  42. package/src/lib/browser-events.ts +123 -0
  43. package/src/lib/events.ts +61 -0
  44. package/src/lib/hmr-analysis.ts +178 -0
  45. package/src/lib/module-store.ts +228 -0
  46. package/src/lib/process-state.ts +9 -0
  47. package/src/lib/runner.ts +1427 -0
  48. package/src/lib/runtime-api.ts +9 -0
  49. package/src/lib/runtime.ts +534 -0
  50. package/src/register.ts +401 -0
  51. package/src/runtime.node-hmr.ts +40 -0
  52. package/src/runtime.ts +40 -0
  53. package/src/types.d.ts +36 -0
@@ -0,0 +1,7 @@
1
+ import type { BrowserHmrChannel } from './browser-events.ts';
2
+ export interface NodeHmrRuntimeApi {
3
+ createBrowserHmrChannel(): Promise<BrowserHmrChannel>;
4
+ emitServerReady(): void;
5
+ }
6
+ export declare const nodeHmrRuntimeUnavailableError = "The node-hmr/runtime API is only available when running inside node-hmr";
7
+ //# sourceMappingURL=runtime-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-api.d.ts","sourceRoot":"","sources":["../../src/lib/runtime-api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAE5D,MAAM,WAAW,iBAAiB;IAChC,uBAAuB,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAAA;IACrD,eAAe,IAAI,IAAI,CAAA;CACxB;AAED,eAAO,MAAM,8BAA8B,4EACgC,CAAA"}
@@ -0,0 +1 @@
1
+ export const nodeHmrRuntimeUnavailableError = 'The node-hmr/runtime API is only available when running inside node-hmr';
@@ -0,0 +1,46 @@
1
+ import { type BrowserHmrChannel, type BrowserHmrFileEvent } from './browser-events.ts';
2
+ /**
3
+ * Hot module context available at `import.meta.hot`.
4
+ */
5
+ export interface ImportMetaHot {
6
+ /** Mutable state preserved for this module across accepted updates and passed to dispose handlers. */
7
+ readonly data: Record<string, unknown>;
8
+ /** Accepts updates to this module, optionally receiving its newly evaluated namespace. */
9
+ accept(callback?: (module: HotModule) => HotCallbackResult): void;
10
+ /** Accepts updates from one dependency, optionally receiving its newly evaluated namespace. */
11
+ accept(dep: string, callback?: (module: HotModule) => HotCallbackResult): void;
12
+ /**
13
+ * Accepts updates from multiple dependencies. The callback array preserves `deps` order and
14
+ * contains the updated namespace only at the position of the dependency that changed.
15
+ */
16
+ accept(deps: readonly string[], callback?: (modules: Array<HotModule | undefined>) => HotCallbackResult): void;
17
+ /** Registers cleanup that runs before this module is re-evaluated or the runtime is disposed. */
18
+ dispose(callback: (data: Record<string, unknown>) => HotCallbackResult): void;
19
+ /** Declines the current update and asks the runner to restart the child process. */
20
+ invalidate(message?: string): void;
21
+ /** Registers a custom-event listener for API compatibility. Server modules receive no events. */
22
+ on(event: string, callback: (data: unknown) => void | Promise<void>): void;
23
+ }
24
+ type HotModule = Readonly<Record<string, unknown>> & {
25
+ readonly [Symbol.toStringTag]: 'Module';
26
+ };
27
+ export interface RemixNodeHmrRuntime {
28
+ createBrowserHmrChannel(): Promise<BrowserHmrChannel>;
29
+ createHotContext(url: string, resolveDependency?: (specifier: string) => string): ImportMetaHot;
30
+ disposeAll(): Promise<void>;
31
+ emitServerReady(): void;
32
+ handleBrowserHmrFileEvents(requestId: number, events: readonly BrowserHmrFileEvent[]): void;
33
+ reportAcceptedDependencies(url: string, acceptedDeps: string[]): void;
34
+ update(url: string, timestamp: number, acceptedUrl?: string): Promise<void>;
35
+ }
36
+ type HotCallbackResult = void | Promise<void>;
37
+ export declare function getNodeHmrRuntime(): RemixNodeHmrRuntime | undefined;
38
+ /**
39
+ * Notifies the parent process that the child server is ready.
40
+ */
41
+ export declare function emitServerReady(): void;
42
+ export declare function installNodeHmrRuntime(options?: {
43
+ browserEventUrl?: string;
44
+ }): RemixNodeHmrRuntime;
45
+ export {};
46
+ //# sourceMappingURL=runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/lib/runtime.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,iBAAiB,EAEtB,KAAK,mBAAmB,EAIzB,MAAM,qBAAqB,CAAA;AAI5B;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,sGAAsG;IACtG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACtC,0FAA0F;IAC1F,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,SAAS,KAAK,iBAAiB,GAAG,IAAI,CAAA;IACjE,+FAA+F;IAC/F,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,SAAS,KAAK,iBAAiB,GAAG,IAAI,CAAA;IAC9E;;;OAGG;IACH,MAAM,CACJ,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,SAAS,GAAG,SAAS,CAAC,KAAK,iBAAiB,GACtE,IAAI,CAAA;IACP,iGAAiG;IACjG,OAAO,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,iBAAiB,GAAG,IAAI,CAAA;IAC7E,oFAAoF;IACpF,UAAU,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAClC,iGAAiG;IACjG,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;CAC3E;AAED,KAAK,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG;IACnD,QAAQ,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,QAAQ,CAAA;CACxC,CAAA;AAED,MAAM,WAAW,mBAAmB;IAClC,uBAAuB,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAAA;IACrD,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,iBAAiB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,GAAG,aAAa,CAAA;IAC/F,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IAC3B,eAAe,IAAI,IAAI,CAAA;IACvB,0BAA0B,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,mBAAmB,EAAE,GAAG,IAAI,CAAA;IAC3F,0BAA0B,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;IACrE,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAC5E;AAMD,KAAK,iBAAiB,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;AAiL7C,wBAAgB,iBAAiB,IAAI,mBAAmB,GAAG,SAAS,CAGnE;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAEtC;AAED,wBAAgB,qBAAqB,CACnC,OAAO,GAAE;IACP,eAAe,CAAC,EAAE,MAAM,CAAA;CACpB,GACL,mBAAmB,CAiPrB"}
@@ -0,0 +1,374 @@
1
+ var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {
2
+ if (typeof path === "string" && /^\.\.?\//.test(path)) {
3
+ return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
4
+ return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
5
+ });
6
+ }
7
+ return path;
8
+ };
9
+ import { fileURLToPath } from 'node:url';
10
+ import { sendHmrEventPayload, } from './browser-events.js';
11
+ import { emitServerHmrEvent, emitServerHmrUpdate } from './events.js';
12
+ import { hasNodeHmrParentProcess } from './process-state.js';
13
+ const browserHmrChannelRequestTimeoutMs = 5_000;
14
+ class NodeHotContext {
15
+ data;
16
+ url;
17
+ #acceptCallbacks = [];
18
+ #acceptDependencyCallbacks = [];
19
+ #disposeCallbacks = [];
20
+ #invalidated = false;
21
+ #invalidationMessage;
22
+ #isUpdating = false;
23
+ #disposeSelf;
24
+ #disposeDependency;
25
+ #resolveDependency;
26
+ constructor(url, data, disposeSelf, disposeDependency, resolveDependency) {
27
+ this.data = data;
28
+ this.url = url;
29
+ this.#disposeSelf = disposeSelf;
30
+ this.#disposeDependency = disposeDependency;
31
+ this.#resolveDependency = resolveDependency;
32
+ }
33
+ accept(deps, callback = () => { }) {
34
+ if (typeof deps === 'string') {
35
+ let normalizedDeps = [this.#normalizeAcceptedDependency(deps)];
36
+ let dependencyCallback = callback;
37
+ this.#acceptDependencyCallbacks.push({
38
+ callback(module) {
39
+ return dependencyCallback(module);
40
+ },
41
+ deps: normalizedDeps,
42
+ });
43
+ return;
44
+ }
45
+ if (isDependencyArray(deps)) {
46
+ let normalizedDeps = deps.map((dep) => this.#normalizeAcceptedDependency(dep));
47
+ let dependencyCallback = callback;
48
+ this.#acceptDependencyCallbacks.push({
49
+ callback(module, acceptedUrl) {
50
+ return dependencyCallback(normalizedDeps.map((dep) => (dep === acceptedUrl ? module : undefined)));
51
+ },
52
+ deps: normalizedDeps,
53
+ });
54
+ return;
55
+ }
56
+ this.#acceptCallbacks.push(deps ?? (() => { }));
57
+ }
58
+ dispose(callback) {
59
+ this.#disposeCallbacks.push(callback);
60
+ }
61
+ invalidate(message) {
62
+ this.#invalidated = true;
63
+ this.#invalidationMessage = message;
64
+ if (this.#isUpdating) {
65
+ if (message !== undefined)
66
+ console.warn(message);
67
+ return;
68
+ }
69
+ requestRestart(message);
70
+ }
71
+ on(_event, _callback) {
72
+ void _event;
73
+ void _callback;
74
+ }
75
+ async disposeAll() {
76
+ for (let callback of this.#disposeCallbacks) {
77
+ await callback(this.data);
78
+ }
79
+ }
80
+ async update(timestamp, acceptedUrl) {
81
+ this.#invalidated = false;
82
+ this.#invalidationMessage = undefined;
83
+ if (acceptedUrl !== this.url) {
84
+ return await this.updateDependency(timestamp, acceptedUrl);
85
+ }
86
+ if (this.#acceptCallbacks.length === 0) {
87
+ requestRestart(`No HMR accept handler found for ${this.url}`);
88
+ return 'restart-requested';
89
+ }
90
+ await this.#disposeSelf();
91
+ this.#isUpdating = true;
92
+ try {
93
+ let updatedModule = await import(__rewriteRelativeImportExtension(`${this.url}?t=${timestamp}`));
94
+ for (let callback of this.#acceptCallbacks) {
95
+ await callback(updatedModule);
96
+ }
97
+ }
98
+ finally {
99
+ this.#isUpdating = false;
100
+ }
101
+ return this.#invalidated ? 'invalidated' : 'accepted';
102
+ }
103
+ get invalidationMessage() {
104
+ return this.#invalidationMessage;
105
+ }
106
+ async updateDependency(timestamp, acceptedUrl) {
107
+ let callbacks = this.#acceptDependencyCallbacks.filter((callback) => callback.deps.includes(acceptedUrl));
108
+ if (callbacks.length === 0) {
109
+ requestRestart(`No HMR accept handler found for ${acceptedUrl} via ${this.url}`);
110
+ return 'restart-requested';
111
+ }
112
+ this.#isUpdating = true;
113
+ try {
114
+ await this.#disposeDependency(acceptedUrl);
115
+ let updatedModule = await import(__rewriteRelativeImportExtension(`${acceptedUrl}?t=${timestamp}`));
116
+ for (let { callback } of callbacks) {
117
+ await callback(updatedModule, acceptedUrl);
118
+ }
119
+ }
120
+ finally {
121
+ this.#isUpdating = false;
122
+ }
123
+ return this.#invalidated ? 'invalidated' : 'accepted';
124
+ }
125
+ #normalizeAcceptedDependency(dep) {
126
+ let resolved = this.#resolveDependency(dep);
127
+ let url = new URL(resolved);
128
+ url.search = '';
129
+ url.hash = '';
130
+ return url.href;
131
+ }
132
+ }
133
+ function isDependencyArray(deps) {
134
+ return Array.isArray(deps);
135
+ }
136
+ export function getNodeHmrRuntime() {
137
+ let runtimeGlobal = globalThis;
138
+ return runtimeGlobal.__remixNodeHmr;
139
+ }
140
+ /**
141
+ * Notifies the parent process that the child server is ready.
142
+ */
143
+ export function emitServerReady() {
144
+ getNodeHmrRuntime()?.emitServerReady();
145
+ }
146
+ export function installNodeHmrRuntime(options = {}) {
147
+ let runtimeGlobal = globalThis;
148
+ if (runtimeGlobal.__remixNodeHmr)
149
+ return runtimeGlobal.__remixNodeHmr;
150
+ let dataByUrl = new Map();
151
+ let updateContextsByUrl = new Map();
152
+ let latestContextsByUrl = new Map();
153
+ let browserEventUrl = options.browserEventUrl;
154
+ let browserHmrChannelId = 0;
155
+ let browserHmrChannelRequestId = 0;
156
+ let pendingBrowserHmrChannelRequests = new Map();
157
+ let browserHmrChannels = new Map();
158
+ process.on('message', (message) => {
159
+ if (!isBrowserHmrChannelMessage(message))
160
+ return;
161
+ let request = pendingBrowserHmrChannelRequests.get(message.requestId);
162
+ if (request === undefined)
163
+ return;
164
+ clearTimeout(request.timer);
165
+ pendingBrowserHmrChannelRequests.delete(message.requestId);
166
+ request.resolve(message.url);
167
+ });
168
+ let runtime = {
169
+ async createBrowserHmrChannel() {
170
+ browserEventUrl ??= await requestBrowserHmrChannelUrl();
171
+ if (browserEventUrl === undefined) {
172
+ throw new Error('Browser HMR is disabled for this node-hmr runtime');
173
+ }
174
+ let id = browserHmrChannelId++;
175
+ let watchedFiles = new Set();
176
+ let handlers = new Set();
177
+ let closed = false;
178
+ browserHmrChannels.set(id, {
179
+ async handleFileEvents(events) {
180
+ let eventGroups = await Promise.all([...handlers].map((handler) => handler(events)));
181
+ return eventGroups.flat();
182
+ },
183
+ });
184
+ function updateWatchedFiles(delta) {
185
+ if (closed)
186
+ return;
187
+ for (let file of delta.add) {
188
+ watchedFiles.add(file);
189
+ }
190
+ for (let file of delta.remove) {
191
+ watchedFiles.delete(file);
192
+ }
193
+ process.send?.({
194
+ id,
195
+ delta,
196
+ type: 'node-hmr:child:browser-hmr-watch-files-changed',
197
+ });
198
+ }
199
+ return {
200
+ close() {
201
+ if (closed)
202
+ return;
203
+ closed = true;
204
+ browserHmrChannels.delete(id);
205
+ handlers.clear();
206
+ let remove = [...watchedFiles];
207
+ watchedFiles.clear();
208
+ process.send?.({
209
+ id,
210
+ delta: { add: [], remove },
211
+ type: 'node-hmr:child:browser-hmr-watch-files-changed',
212
+ });
213
+ },
214
+ onFileEvents(handler) {
215
+ if (closed)
216
+ return () => { };
217
+ handlers.add(handler);
218
+ return () => {
219
+ handlers.delete(handler);
220
+ };
221
+ },
222
+ updateWatchedFiles,
223
+ url: browserEventUrl,
224
+ };
225
+ },
226
+ createHotContext(url, resolveDependency = (specifier) => new URL(specifier, url).href) {
227
+ let data = dataByUrl.get(url);
228
+ if (data === undefined) {
229
+ data = {};
230
+ dataByUrl.set(url, data);
231
+ }
232
+ let context = new NodeHotContext(url, data, async () => {
233
+ await latestContextsByUrl.get(url)?.disposeAll();
234
+ }, async (dependencyUrl) => {
235
+ await latestContextsByUrl.get(dependencyUrl)?.disposeAll();
236
+ }, resolveDependency);
237
+ if (!updateContextsByUrl.has(url)) {
238
+ updateContextsByUrl.set(url, context);
239
+ }
240
+ latestContextsByUrl.set(url, context);
241
+ return context;
242
+ },
243
+ emitServerReady() {
244
+ if (!hasNodeHmrParentProcess())
245
+ return;
246
+ process.send?.({
247
+ type: 'node-hmr:child:server-ready',
248
+ });
249
+ },
250
+ handleBrowserHmrFileEvents(requestId, events) {
251
+ if (!hasNodeHmrParentProcess())
252
+ return;
253
+ Promise.all([...browserHmrChannels.values()].map((browserHmrChannel) => browserHmrChannel.handleFileEvents(events)))
254
+ .then((eventGroups) => {
255
+ process.send?.({
256
+ events: eventGroups.flat(),
257
+ requestId,
258
+ type: 'node-hmr:child:browser-hmr-file-events-handled',
259
+ });
260
+ })
261
+ .catch((error) => {
262
+ process.send?.({
263
+ error: formatUnknownError(error),
264
+ events: [],
265
+ requestId,
266
+ type: 'node-hmr:child:browser-hmr-file-events-handled',
267
+ });
268
+ });
269
+ },
270
+ reportAcceptedDependencies(url, acceptedDeps) {
271
+ if (!hasNodeHmrParentProcess())
272
+ return;
273
+ process.send?.({
274
+ type: 'node-hmr:child:accepted-deps-resolved',
275
+ url,
276
+ acceptedDeps,
277
+ });
278
+ },
279
+ async disposeAll() {
280
+ for (let context of latestContextsByUrl.values()) {
281
+ await context.disposeAll();
282
+ }
283
+ updateContextsByUrl.clear();
284
+ latestContextsByUrl.clear();
285
+ },
286
+ async update(url, timestamp, acceptedUrl = url) {
287
+ let context = updateContextsByUrl.get(url);
288
+ if (context === undefined) {
289
+ requestRestart(`No HMR context found for ${url}`);
290
+ return;
291
+ }
292
+ try {
293
+ let updateResult = await context.update(timestamp, acceptedUrl);
294
+ if (updateResult === 'invalidated') {
295
+ process.send?.({
296
+ acceptedUrl,
297
+ message: context.invalidationMessage,
298
+ timestamp,
299
+ type: 'node-hmr:child:hot-module-invalidated',
300
+ url,
301
+ });
302
+ return;
303
+ }
304
+ if (updateResult === 'restart-requested')
305
+ return;
306
+ emitServerHmrUpdate({
307
+ ...(acceptedUrl === url ? {} : { acceptedUrl }),
308
+ filePath: acceptedUrl.startsWith('file:') ? fileURLToPath(acceptedUrl) : acceptedUrl,
309
+ timestamp,
310
+ type: 'update',
311
+ url,
312
+ });
313
+ }
314
+ catch (error) {
315
+ requestRestart(`Failed to hot update ${url}: ${formatUnknownError(error)}`);
316
+ }
317
+ },
318
+ };
319
+ runtimeGlobal.__remixNodeHmr = runtime;
320
+ return runtime;
321
+ function requestBrowserHmrChannelUrl() {
322
+ if (!hasNodeHmrParentProcess())
323
+ return Promise.resolve(undefined);
324
+ let requestId = browserHmrChannelRequestId++;
325
+ return new Promise((resolvePromise) => {
326
+ let timer = setTimeout(() => {
327
+ pendingBrowserHmrChannelRequests.delete(requestId);
328
+ resolvePromise(undefined);
329
+ }, browserHmrChannelRequestTimeoutMs);
330
+ pendingBrowserHmrChannelRequests.set(requestId, {
331
+ resolve: resolvePromise,
332
+ timer,
333
+ });
334
+ if (!process.send?.({
335
+ requestId,
336
+ type: 'node-hmr:child:browser-hmr-channel-requested',
337
+ })) {
338
+ clearTimeout(timer);
339
+ pendingBrowserHmrChannelRequests.delete(requestId);
340
+ resolvePromise(undefined);
341
+ }
342
+ });
343
+ }
344
+ }
345
+ function isBrowserHmrChannelMessage(message) {
346
+ return (typeof message === 'object' &&
347
+ message !== null &&
348
+ 'type' in message &&
349
+ message.type === 'node-hmr:parent:browser-hmr-channel' &&
350
+ 'requestId' in message &&
351
+ typeof message.requestId === 'number' &&
352
+ (!('url' in message) || typeof message.url === 'string'));
353
+ }
354
+ function requestRestart(message) {
355
+ if (message !== undefined) {
356
+ console.warn(message);
357
+ }
358
+ emitServerHmrEvent({
359
+ reason: message,
360
+ timestamp: Date.now(),
361
+ type: 'restart',
362
+ });
363
+ if (process.send) {
364
+ process.send({
365
+ type: 'node-hmr:child:restart-requested',
366
+ message,
367
+ });
368
+ return;
369
+ }
370
+ process.kill(process.pid, 'SIGTERM');
371
+ }
372
+ function formatUnknownError(error) {
373
+ return error instanceof Error ? error.message : String(error);
374
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=register.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../src/register.ts"],"names":[],"mappings":""}