cindel 1.0.5 → 1.0.6

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/README.md CHANGED
@@ -28,11 +28,11 @@
28
28
 
29
29
  **Client**
30
30
 
31
+ - No runtime dependencies, works in any modern browser
31
32
  - Exponential backoff with automatic reconnect
32
- - No runtime dependencies, so it works in any modern browser
33
33
  - Event system with `on`, `once`, and `off` for connect, disconnect, reload, add, remove, etc.
34
- - IIFE build compatible with userscript managers (Tampermonkey, Greasemonkey) via `@require`
35
34
  - Iframe injection via `postMessage` for Private Network Access restricted environments
35
+ - IIFE build compatible with userscript managers (Tampermonkey, Greasemonkey) via `@require`
36
36
 
37
37
  ---
38
38
 
@@ -49,7 +49,7 @@ export class FileLoader {
49
49
  _flushReload(path: any): Promise<void>;
50
50
  removeFile(path: any): Promise<void>;
51
51
  makeUrl(path: any): string;
52
- _post(message: any): void;
53
- _inject(kind: any, code: any, file: any): void;
52
+ _postAndAwaitAck(message: any): Promise<any>;
53
+ _inject(kind: any, code: any, file: any): Promise<any>;
54
54
  }
55
55
  //# sourceMappingURL=file-loader.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"file-loader.d.ts","sourceRoot":"","sources":["../../src/client/file-loader.js"],"names":[],"mappings":"AAAA,mFAAmF;AACnF;IACE;;;;OAiCC;IAhCC,aAAsB;IACtB;;;;;OAKG;IACH,cAFU,MAAM,GAAG,IAAI,CAES;IAChC,qBAAqB;IACrB,cADW,MAAM,CACe;IAChC;;;;;;OAMG;IACH,KAFU,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAExB;IACd;;;;;OAKG;IACH,WAFU,GAAG,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,UAAU,CAAA;KAAE,CAAC,CAEvC;IAC1B;;;;;OAKG;IACH,UAFU,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAEJ;IAG3B,kCAOC;IAKD,qCAwBC;IAED,oDAmBC;IAED,wCAcC;IAED,oCAwBC;IAKD,oCAeC;IAED,uCAUC;IAED,qCAsBC;IAGD,2BAIC;IAGD,0BAEC;IAGD,+CAEC;CACF"}
1
+ {"version":3,"file":"file-loader.d.ts","sourceRoot":"","sources":["../../src/client/file-loader.js"],"names":[],"mappings":"AAAA,mFAAmF;AACnF;IACE;;;;OAiCC;IAhCC,aAAsB;IACtB;;;;;OAKG;IACH,cAFU,MAAM,GAAG,IAAI,CAES;IAChC,qBAAqB;IACrB,cADW,MAAM,CACe;IAChC;;;;;;OAMG;IACH,KAFU,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAExB;IACd;;;;;OAKG;IACH,WAFU,GAAG,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,UAAU,CAAA;KAAE,CAAC,CAEvC;IAC1B;;;;;OAKG;IACH,UAFU,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAEJ;IAG3B,kCAOC;IAKD,qCAwBC;IAED,oDAmBC;IAED,wCAcC;IAED,oCAwBC;IAKD,oCAeC;IAED,uCAUC;IAED,qCAqBC;IAGD,2BAIC;IAED,6CAaC;IAED,uDAEC;CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"hmr-client.d.ts","sourceRoot":"","sources":["../../src/client/hmr-client.js"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH;IACE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA6BG;IACH,qBAvBG;QAAyB,KAAK,GAAtB,MAAM;QACW,OAAO,GAAxB,MAAM;QACY,UAAU,GAA5B,OAAO;QACU,IAAI,GAArB,MAAM;QACW,IAAI,GAArB,MAAM;QACY,MAAM,GAAxB,OAAO;QACW,aAAa,GAA/B,OAAO;QACU,cAAc,GAA/B,MAAM;QACW,iBAAiB,GAAlC,MAAM;QACY,eAAe,GAAjC,OAAO;QACY,IAAI,GAAvB,MAAM,EAAE;QACsC,UAAU,GAAxD,CAAS,IAAM,EAAN,MAAM,EAAE,IAAQ,EAAR,MAAM,EAAE,KAAG,OAAO;QAChB,IAAI,GAAvB,MAAM,EAAE;QAC4B,UAAU,GAA9C,CAAS,IAAM,EAAN,MAAM,KAAG,OAAO;QACyB,iBAAiB,GAAnE,CAAS,IAAM,EAAN,MAAM,EAAE,IAAQ,EAAR,MAAM,EAAE,KAAG,MAAM,GAAC,IAAI;QACN,YAAY,GAA7C,CAAS,IAAM,EAAN,MAAM,KAAG,IAAI;QACiB,SAAS,GAAhD,CAAS,IAAQ,EAAR,MAAM,EAAE,KAAG,MAAM,EAAE;QACF,SAAS,GAAnC,KAAK,UAAU;QACY,MAAM,GAAjC,OAAO,MAAS;KACxB,EAwFF;IA9EC,WAAkB;IAClB,aAAsB;IACtB,oBAAsB;IAEtB,+BAAyD;IACzD,uBAA+C;IAC/C,uBAAiD;IACjD,0BAAwD;IACxD,yBAAqD;IAGrD,wBAAsC;IACtC,oBA5BkB,MAAM,KAAG,OAAO,CA4BQ;IAG1C,oBAAiF;IACjF,gBAAuE;IAGvE,gBAAkB;IAElB,0BApCkB,MAAM,QAAE,MAAM,EAAE,KAAG,MAAM,GAAC,IAAI,CAoCO;IACvD,qBApCkB,MAAM,KAAG,IAAI,CAoCc;IAC7C,sBAAqC;IACrC,eAAmE;IAEnE,kBAAkB;IAClB,0BAA0B;IAC1B,qBAAwB;IACxB,6BAA8B;IAC9B,gCAA2B;IAI3B,qBAAuB;IACvB,6BAAgC;IAShC,mBAAiC;IACjC,mBAAiC;IAIjC,sBAAiD;IAGjD,uCAAuB;IAEvB,uBAIE;IAEF,wEAAwE;IACxE,aADW,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CACF;IAC5B,uFAAuF;IACvF,qBADW,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CACC;IAEpC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAYC;IAGH,oCAkBC;IAED,8CAcC;IAED,mCAIC;IAED,sEAoDC;IAED,kCA0BC;IAED,4CAgDC;IAED,8EAkEC;IAED,2CA4CC;IAED,wCA6CC;IAED;;;;;OAKG;IACH,UAJW,MAAM,GAAC,QAAQ,GAAC,KAAK,GAAC,QAAQ,GAAC,MAAM,GAAC,SAAS,GAAC,YAAY,GAAC,OAAO,sBAElE,SAAS,CAQrB;IAED;;;;;OAKG;IACH,YAJW,MAAM,GAAC,QAAQ,GAAC,KAAK,GAAC,QAAQ,GAAC,MAAM,GAAC,SAAS,GAAC,YAAY,GAAC,OAAO,sBAElE,SAAS,CASrB;IAED;;;;;OAKG;IACH,WAJW,MAAM,GAAC,QAAQ,GAAC,KAAK,GAAC,QAAQ,GAAC,MAAM,GAAC,SAAS,GAAC,YAAY,GAAC,OAAO,sBAElE,SAAS,CAoBrB;IAED,uCAQC;IAMD,iCAGC;IAED,oCAWC;IAID,6BAsBC;IAKD,2BAoBC;IAED;;;OAGG;IACH,WAFa,OAAO,CAAC,IAAI,CAAC,CAwGzB;IAED;;OAEG;IACH,mBAgBC;CACF;2BA1uB0B,kBAAkB"}
1
+ {"version":3,"file":"hmr-client.d.ts","sourceRoot":"","sources":["../../src/client/hmr-client.js"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH;IACE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA6BG;IACH,qBAvBG;QAAyB,KAAK,GAAtB,MAAM;QACW,OAAO,GAAxB,MAAM;QACY,UAAU,GAA5B,OAAO;QACU,IAAI,GAArB,MAAM;QACW,IAAI,GAArB,MAAM;QACY,MAAM,GAAxB,OAAO;QACW,aAAa,GAA/B,OAAO;QACU,cAAc,GAA/B,MAAM;QACW,iBAAiB,GAAlC,MAAM;QACY,eAAe,GAAjC,OAAO;QACY,IAAI,GAAvB,MAAM,EAAE;QACsC,UAAU,GAAxD,CAAS,IAAM,EAAN,MAAM,EAAE,IAAQ,EAAR,MAAM,EAAE,KAAG,OAAO;QAChB,IAAI,GAAvB,MAAM,EAAE;QAC4B,UAAU,GAA9C,CAAS,IAAM,EAAN,MAAM,KAAG,OAAO;QACyB,iBAAiB,GAAnE,CAAS,IAAM,EAAN,MAAM,EAAE,IAAQ,EAAR,MAAM,EAAE,KAAG,MAAM,GAAC,IAAI;QACN,YAAY,GAA7C,CAAS,IAAM,EAAN,MAAM,KAAG,IAAI;QACiB,SAAS,GAAhD,CAAS,IAAQ,EAAR,MAAM,EAAE,KAAG,MAAM,EAAE;QACF,SAAS,GAAnC,KAAK,UAAU;QACY,MAAM,GAAjC,OAAO,MAAS;KACxB,EAwFF;IA9EC,WAAkB;IAClB,aAAsB;IACtB,oBAAsB;IAEtB,+BAAyD;IACzD,uBAA+C;IAC/C,uBAAiD;IACjD,0BAAwD;IACxD,yBAAqD;IAGrD,wBAAsC;IACtC,oBA5BkB,MAAM,KAAG,OAAO,CA4BQ;IAG1C,oBAAiF;IACjF,gBAAuE;IAGvE,gBAAkB;IAElB,0BApCkB,MAAM,QAAE,MAAM,EAAE,KAAG,MAAM,GAAC,IAAI,CAoCO;IACvD,qBApCkB,MAAM,KAAG,IAAI,CAoCc;IAC7C,sBAAqC;IACrC,eAAmE;IAEnE,kBAAkB;IAClB,0BAA0B;IAC1B,qBAAwB;IACxB,6BAA8B;IAC9B,gCAA2B;IAI3B,qBAAuB;IACvB,6BAAgC;IAShC,mBAAiC;IACjC,mBAAiC;IAIjC,sBAAiD;IAGjD,uCAAuB;IAEvB,uBAIE;IAEF,wEAAwE;IACxE,aADW,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CACF;IAC5B,uFAAuF;IACvF,qBADW,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CACC;IAEpC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAYC;IAGH,oCAkBC;IAED,8CAcC;IAED,mCAIC;IAED,sEAoDC;IAED,kCA0BC;IAED,4CAgDC;IAED,8EAkEC;IAED,2CA4CC;IAED,wCA6CC;IAED;;;;;OAKG;IACH,UAJW,MAAM,GAAC,QAAQ,GAAC,KAAK,GAAC,QAAQ,GAAC,MAAM,GAAC,SAAS,GAAC,YAAY,GAAC,OAAO,sBAElE,SAAS,CAQrB;IAED;;;;;OAKG;IACH,YAJW,MAAM,GAAC,QAAQ,GAAC,KAAK,GAAC,QAAQ,GAAC,MAAM,GAAC,SAAS,GAAC,YAAY,GAAC,OAAO,sBAElE,SAAS,CASrB;IAED;;;;;OAKG;IACH,WAJW,MAAM,GAAC,QAAQ,GAAC,KAAK,GAAC,QAAQ,GAAC,MAAM,GAAC,SAAS,GAAC,YAAY,GAAC,OAAO,sBAElE,SAAS,CAoBrB;IAED,uCAQC;IAMD,iCAGC;IAED,oCAWC;IAID,6BAyBC;IAKD,2BA0BC;IAED;;;OAGG;IACH,WAFa,OAAO,CAAC,IAAI,CAAC,CAiGzB;IAED;;OAEG;IACH,mBAgBC;CACF;2BA5uB0B,kBAAkB"}
@@ -1 +1 @@
1
- {"version":3,"file":"stub.d.ts","sourceRoot":"","sources":["../../src/client/stub.js"],"names":[],"mappings":"AAAA,6BAmCC"}
1
+ {"version":3,"file":"stub.d.ts","sourceRoot":"","sources":["../../src/client/stub.js"],"names":[],"mappings":"AAAA,6BAsEC"}
@@ -1586,15 +1586,15 @@ var HMR = (() => {
1586
1586
  fetch(url).then((r) => {
1587
1587
  if (!r.ok) throw new Error(`Failed to fetch CSS: ${path} (${r.status})`);
1588
1588
  return r.text();
1589
- }).then((code) => {
1590
- this._inject("css", code, path);
1591
- })
1589
+ }).then((code) => this._inject("css", code, path))
1592
1590
  );
1593
1591
  }
1594
1592
  if (toParent) {
1595
1593
  ops.push(this._loadCSSInParent(path, url));
1596
1594
  }
1597
- await Promise.all(ops);
1595
+ const results = await Promise.allSettled(ops);
1596
+ const failed = results.find((r) => r.status === "rejected");
1597
+ if (failed) throw failed.reason;
1598
1598
  return true;
1599
1599
  }
1600
1600
  _loadCSSInParent(path, url) {
@@ -1622,7 +1622,7 @@ var HMR = (() => {
1622
1622
  if (!r.ok) throw new Error(`Failed to fetch module: ${path} (${r.status})`);
1623
1623
  return r.text();
1624
1624
  });
1625
- this._inject("module", code, path);
1625
+ await this._inject("module", code, path);
1626
1626
  return true;
1627
1627
  }
1628
1628
  await import(url);
@@ -1637,7 +1637,7 @@ var HMR = (() => {
1637
1637
  if (!r.ok) throw new Error(`Failed to fetch script: ${path} (${r.status})`);
1638
1638
  return r.text();
1639
1639
  });
1640
- this._inject("script", code, path);
1640
+ await this._inject("script", code, path);
1641
1641
  return true;
1642
1642
  }
1643
1643
  const script = document.createElement("script");
@@ -1686,8 +1686,7 @@ var HMR = (() => {
1686
1686
  this.loadQueue.delete(path);
1687
1687
  }
1688
1688
  if (this.iframeTarget) {
1689
- this._post({ type: "hmr:remove", file: path });
1690
- await Promise.resolve();
1689
+ await this._postAndAwaitAck({ type: "hmr:remove", file: path });
1691
1690
  } else {
1692
1691
  const el = document.querySelector(`[data-file="${path}"]`);
1693
1692
  if (el) {
@@ -1703,13 +1702,27 @@ var HMR = (() => {
1703
1702
  this.versions.set(path, v);
1704
1703
  return `${this.httpUrl}${path}?v=${v}`;
1705
1704
  }
1706
- // Send a raw postMessage to the iframe target
1707
- _post(message) {
1708
- this.iframeTarget.postMessage(message, this.iframeOrigin);
1705
+ // Post a message and resolve once the stub sends back hmr:ack
1706
+ _postAndAwaitAck(message) {
1707
+ return new Promise((resolve) => {
1708
+ const onAck = (e) => {
1709
+ if (e.source !== this.iframeTarget) return;
1710
+ let data;
1711
+ try {
1712
+ data = JSON.parse(e.data);
1713
+ } catch {
1714
+ return;
1715
+ }
1716
+ if (data?.type !== "hmr:ack") return;
1717
+ window.removeEventListener("message", onAck);
1718
+ resolve();
1719
+ };
1720
+ window.addEventListener("message", onAck);
1721
+ this.iframeTarget.postMessage(JSON.stringify(message), this.iframeOrigin);
1722
+ });
1709
1723
  }
1710
- // Forward a file payload to the iframe target
1711
1724
  _inject(kind, code, file) {
1712
- this._post({ type: "hmr:inject", kind, code, file });
1725
+ return this._postAndAwaitAck({ type: "hmr:inject", kind, code, file });
1713
1726
  }
1714
1727
  };
1715
1728
 
@@ -2213,15 +2226,22 @@ var HMR = (() => {
2213
2226
  this._processingMessages = false;
2214
2227
  }
2215
2228
  // Wait for stub's hmr:ready signal. Stub fires it proactively on run.
2216
- // Times out after 5s if stub was never injected.
2229
+ // Times out after 5s and resolves anyway, a missing stub degrades gracefully.
2217
2230
  _waitForStub() {
2218
- return new Promise((resolve, reject) => {
2231
+ return new Promise((resolve) => {
2219
2232
  const timer = setTimeout(() => {
2220
2233
  window.removeEventListener("message", onReady);
2221
- reject(new Error("Timed out waiting for hmr:ready. Was HMR.stub() called in the iframe?"));
2234
+ this.log("warning", "Timed out waiting for hmr:ready. Was HMR.stub() called in the iframe?");
2235
+ resolve();
2222
2236
  }, 5e3);
2223
2237
  const onReady = (e) => {
2224
- if (e.data?.type !== "hmr:ready") return;
2238
+ let data;
2239
+ try {
2240
+ data = JSON.parse(e.data);
2241
+ } catch {
2242
+ return;
2243
+ }
2244
+ if (data?.type !== "hmr:ready") return;
2225
2245
  const originOk = this._iframeOrigin === "*" || e.origin === this._iframeOrigin;
2226
2246
  if (!originOk) return;
2227
2247
  clearTimeout(timer);
@@ -2241,15 +2261,25 @@ var HMR = (() => {
2241
2261
  _listenForReattach() {
2242
2262
  if (this._onReattach) return;
2243
2263
  this._onReattach = async (e) => {
2244
- if (e.data?.type !== "hmr:ready") return;
2264
+ let data;
2265
+ try {
2266
+ data = JSON.parse(e.data);
2267
+ } catch {
2268
+ return;
2269
+ }
2270
+ if (data?.type !== "hmr:ready") return;
2245
2271
  const originOk = this._iframeOrigin === "*" || e.origin === this._iframeOrigin;
2246
2272
  if (!originOk) return;
2247
2273
  if (e.source === this._iframeTarget) return;
2248
2274
  this._iframeTarget = e.source;
2249
2275
  this.fileLoader.iframeTarget = e.source;
2250
2276
  this.log("success", "HMR reattached to new iframe");
2251
- for (const path of this.fileLoader.versions.keys()) {
2252
- await this.fileLoader.loadFile(path);
2277
+ for (const path of this.sortFiles([...this.fileLoader.versions.keys()])) {
2278
+ try {
2279
+ await this.fileLoader.loadFile(path);
2280
+ } catch (e2) {
2281
+ this.log("error", `Reattach failed to load ${path}: ${e2.message}`);
2282
+ }
2253
2283
  }
2254
2284
  };
2255
2285
  window.addEventListener("message", this._onReattach);
@@ -2285,15 +2315,8 @@ var HMR = (() => {
2285
2315
  this._messageQueue = [];
2286
2316
  this._processingMessages = true;
2287
2317
  if (this._iframeTarget || this._stubManaged) {
2288
- try {
2289
- await this._waitForStub();
2290
- if (this._stubManaged) this._listenForReattach();
2291
- } catch (e) {
2292
- this.log("error", e.message);
2293
- this._processingMessages = false;
2294
- reject(e);
2295
- return;
2296
- }
2318
+ await this._waitForStub();
2319
+ if (this._stubManaged) this._listenForReattach();
2297
2320
  }
2298
2321
  this._processingMessages = false;
2299
2322
  if (this._messageQueue.length > 0) this._drainMessageQueue();
@@ -2369,36 +2392,72 @@ var HMR = (() => {
2369
2392
  const removeIfExists = (el) => {
2370
2393
  if (el) el.remove();
2371
2394
  };
2372
- const injectScript = (kind, code, file) => {
2373
- removeIfExists(byFile("script", file));
2374
- const script = document.createElement("script");
2375
- if (kind === "module") script.type = "module";
2376
- script.textContent = code;
2377
- script.dataset.file = file;
2378
- document.documentElement.appendChild(script);
2379
- script.remove();
2395
+ const injectScript = async (kind, code, file) => {
2396
+ const url = URL.createObjectURL(new Blob([code + `
2397
+ //# sourceURL=${file}`], { type: "text/javascript" }));
2398
+ try {
2399
+ if (kind === "module") {
2400
+ await import(url);
2401
+ } else {
2402
+ const script = document.createElement("script");
2403
+ script.src = url;
2404
+ await new Promise((resolve, reject) => {
2405
+ script.onload = resolve;
2406
+ script.onerror = () => reject(new Error(`Failed to execute script: ${file}`));
2407
+ document.documentElement.appendChild(script);
2408
+ });
2409
+ }
2410
+ } finally {
2411
+ URL.revokeObjectURL(url);
2412
+ }
2380
2413
  };
2381
- const injectStyle = (code, file) => {
2382
- const existing = byFile("style", file);
2383
- const style = document.createElement("style");
2384
- style.textContent = code;
2385
- style.dataset.file = file;
2386
- document.head.appendChild(style);
2414
+ const injectStyle = async (code, file) => {
2415
+ const existing = byFile("link", file);
2416
+ const url = URL.createObjectURL(new Blob([code + `
2417
+ /*# sourceURL=${file} */`], { type: "text/css" }));
2418
+ const link = document.createElement("link");
2419
+ link.rel = "stylesheet";
2420
+ link.href = url;
2421
+ link.dataset.file = file;
2422
+ await new Promise((resolve, reject) => {
2423
+ link.onload = () => {
2424
+ URL.revokeObjectURL(url);
2425
+ resolve();
2426
+ };
2427
+ link.onerror = () => {
2428
+ URL.revokeObjectURL(url);
2429
+ reject(new Error(`Failed to load CSS: ${file}`));
2430
+ };
2431
+ document.head.appendChild(link);
2432
+ });
2387
2433
  removeIfExists(existing);
2388
2434
  };
2389
- window.addEventListener("message", (e) => {
2390
- const data = e.data;
2435
+ window.addEventListener("message", async (e) => {
2436
+ let data;
2437
+ try {
2438
+ data = JSON.parse(e.data);
2439
+ } catch {
2440
+ return;
2441
+ }
2391
2442
  if (!data?.type) return;
2443
+ const ackOrigin = e.origin && e.origin !== "null" ? e.origin : "*";
2444
+ const ack = () => e.source?.postMessage(JSON.stringify({ type: "hmr:ack" }), ackOrigin);
2392
2445
  if (data.type === "hmr:remove") {
2393
2446
  removeIfExists(document.querySelector(`[data-file="${CSS.escape(data.file)}"]`));
2447
+ ack();
2394
2448
  return;
2395
2449
  }
2396
2450
  if (data.type !== "hmr:inject") return;
2397
2451
  const { kind, code, file } = data;
2398
- if (kind === "script" || kind === "module") injectScript(kind, code, file);
2399
- else if (kind === "css") injectStyle(code, file);
2452
+ try {
2453
+ if (kind === "script" || kind === "module") await injectScript(kind, code, file);
2454
+ else if (kind === "css") await injectStyle(code, file);
2455
+ } catch (err) {
2456
+ console.error(`Failed to inject ${file}:`, err.message ?? err, "\n" + err.stack);
2457
+ }
2458
+ ack();
2400
2459
  });
2401
- window.parent.postMessage({ type: "hmr:ready" }, "*");
2460
+ window.parent.postMessage(JSON.stringify({ type: "hmr:ready" }), "*");
2402
2461
  }
2403
2462
  return __toCommonJS(client_exports);
2404
2463
  })();