client.mjs 38 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235
  1. import "@vite/env";
  2. //#region \0@oxc-project+runtime@0.124.0/helpers/typeof.js
  3. function _typeof(o) {
  4. "@babel/helpers - typeof";
  5. return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(o) {
  6. return typeof o;
  7. } : function(o) {
  8. return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o;
  9. }, _typeof(o);
  10. }
  11. //#endregion
  12. //#region \0@oxc-project+runtime@0.124.0/helpers/toPrimitive.js
  13. function toPrimitive(t, r) {
  14. if ("object" != _typeof(t) || !t) return t;
  15. var e = t[Symbol.toPrimitive];
  16. if (void 0 !== e) {
  17. var i = e.call(t, r || "default");
  18. if ("object" != _typeof(i)) return i;
  19. throw new TypeError("@@toPrimitive must return a primitive value.");
  20. }
  21. return ("string" === r ? String : Number)(t);
  22. }
  23. //#endregion
  24. //#region \0@oxc-project+runtime@0.124.0/helpers/toPropertyKey.js
  25. function toPropertyKey(t) {
  26. var i = toPrimitive(t, "string");
  27. return "symbol" == _typeof(i) ? i : i + "";
  28. }
  29. //#endregion
  30. //#region \0@oxc-project+runtime@0.124.0/helpers/defineProperty.js
  31. function _defineProperty(e, r, t) {
  32. return (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, {
  33. value: t,
  34. enumerable: !0,
  35. configurable: !0,
  36. writable: !0
  37. }) : e[r] = t, e;
  38. }
  39. //#endregion
  40. //#region src/shared/hmr.ts
  41. var HMRContext = class {
  42. constructor(hmrClient, ownerPath) {
  43. this.hmrClient = hmrClient;
  44. this.ownerPath = ownerPath;
  45. _defineProperty(this, "newListeners", void 0);
  46. if (!hmrClient.dataMap.has(ownerPath)) hmrClient.dataMap.set(ownerPath, {});
  47. const mod = hmrClient.hotModulesMap.get(ownerPath);
  48. if (mod) mod.callbacks = [];
  49. const staleListeners = hmrClient.ctxToListenersMap.get(ownerPath);
  50. if (staleListeners) for (const [event, staleFns] of staleListeners) {
  51. const listeners = hmrClient.customListenersMap.get(event);
  52. if (listeners) hmrClient.customListenersMap.set(event, listeners.filter((l) => !staleFns.includes(l)));
  53. }
  54. this.newListeners = /* @__PURE__ */ new Map();
  55. hmrClient.ctxToListenersMap.set(ownerPath, this.newListeners);
  56. }
  57. get data() {
  58. return this.hmrClient.dataMap.get(this.ownerPath);
  59. }
  60. accept(deps, callback) {
  61. if (typeof deps === "function" || !deps) this.acceptDeps([this.ownerPath], ([mod]) => deps?.(mod));
  62. else if (typeof deps === "string") this.acceptDeps([deps], ([mod]) => callback?.(mod));
  63. else if (Array.isArray(deps)) this.acceptDeps(deps, callback);
  64. else throw new Error(`invalid hot.accept() usage.`);
  65. }
  66. acceptExports(_, callback) {
  67. this.acceptDeps([this.ownerPath], ([mod]) => callback?.(mod));
  68. }
  69. dispose(cb) {
  70. this.hmrClient.disposeMap.set(this.ownerPath, cb);
  71. }
  72. prune(cb) {
  73. this.hmrClient.pruneMap.set(this.ownerPath, cb);
  74. }
  75. decline() {}
  76. invalidate(message) {
  77. const firstInvalidatedBy = this.hmrClient.currentFirstInvalidatedBy ?? this.ownerPath;
  78. this.hmrClient.notifyListeners("vite:invalidate", {
  79. path: this.ownerPath,
  80. message,
  81. firstInvalidatedBy
  82. });
  83. this.send("vite:invalidate", {
  84. path: this.ownerPath,
  85. message,
  86. firstInvalidatedBy
  87. });
  88. this.hmrClient.logger.debug(`invalidate ${this.ownerPath}${message ? `: ${message}` : ""}`);
  89. }
  90. on(event, cb) {
  91. const addToMap = (map) => {
  92. const existing = map.get(event) || [];
  93. existing.push(cb);
  94. map.set(event, existing);
  95. };
  96. addToMap(this.hmrClient.customListenersMap);
  97. addToMap(this.newListeners);
  98. }
  99. off(event, cb) {
  100. const removeFromMap = (map) => {
  101. const existing = map.get(event);
  102. if (existing === void 0) return;
  103. const pruned = existing.filter((l) => l !== cb);
  104. if (pruned.length === 0) {
  105. map.delete(event);
  106. return;
  107. }
  108. map.set(event, pruned);
  109. };
  110. removeFromMap(this.hmrClient.customListenersMap);
  111. removeFromMap(this.newListeners);
  112. }
  113. send(event, data) {
  114. this.hmrClient.send({
  115. type: "custom",
  116. event,
  117. data
  118. });
  119. }
  120. acceptDeps(deps, callback = () => {}) {
  121. const mod = this.hmrClient.hotModulesMap.get(this.ownerPath) || {
  122. id: this.ownerPath,
  123. callbacks: []
  124. };
  125. mod.callbacks.push({
  126. deps,
  127. fn: callback
  128. });
  129. this.hmrClient.hotModulesMap.set(this.ownerPath, mod);
  130. }
  131. };
  132. var HMRClient = class {
  133. constructor(logger, transport, importUpdatedModule) {
  134. this.logger = logger;
  135. this.transport = transport;
  136. this.importUpdatedModule = importUpdatedModule;
  137. _defineProperty(this, "hotModulesMap", /* @__PURE__ */ new Map());
  138. _defineProperty(this, "disposeMap", /* @__PURE__ */ new Map());
  139. _defineProperty(this, "pruneMap", /* @__PURE__ */ new Map());
  140. _defineProperty(this, "dataMap", /* @__PURE__ */ new Map());
  141. _defineProperty(this, "customListenersMap", /* @__PURE__ */ new Map());
  142. _defineProperty(this, "ctxToListenersMap", /* @__PURE__ */ new Map());
  143. _defineProperty(this, "currentFirstInvalidatedBy", void 0);
  144. _defineProperty(this, "updateQueue", []);
  145. _defineProperty(this, "pendingUpdateQueue", false);
  146. }
  147. async notifyListeners(event, data) {
  148. const cbs = this.customListenersMap.get(event);
  149. if (cbs) await Promise.allSettled(cbs.map((cb) => cb(data)));
  150. }
  151. send(payload) {
  152. this.transport.send(payload).catch((err) => {
  153. this.logger.error(err);
  154. });
  155. }
  156. clear() {
  157. this.hotModulesMap.clear();
  158. this.disposeMap.clear();
  159. this.pruneMap.clear();
  160. this.dataMap.clear();
  161. this.customListenersMap.clear();
  162. this.ctxToListenersMap.clear();
  163. }
  164. async prunePaths(paths) {
  165. await Promise.all(paths.map((path) => {
  166. const disposer = this.disposeMap.get(path);
  167. if (disposer) return disposer(this.dataMap.get(path));
  168. }));
  169. await Promise.all(paths.map((path) => {
  170. const fn = this.pruneMap.get(path);
  171. if (fn) return fn(this.dataMap.get(path));
  172. }));
  173. }
  174. warnFailedUpdate(err, path) {
  175. if (!(err instanceof Error) || !err.message.includes("fetch")) this.logger.error(err);
  176. this.logger.error(`Failed to reload ${path}. This could be due to syntax errors or importing non-existent modules. (see errors above)`);
  177. }
  178. /**
  179. * buffer multiple hot updates triggered by the same src change
  180. * so that they are invoked in the same order they were sent.
  181. * (otherwise the order may be inconsistent because of the http request round trip)
  182. */
  183. async queueUpdate(payload) {
  184. this.updateQueue.push(this.fetchUpdate(payload));
  185. if (!this.pendingUpdateQueue) {
  186. this.pendingUpdateQueue = true;
  187. await Promise.resolve();
  188. this.pendingUpdateQueue = false;
  189. const loading = [...this.updateQueue];
  190. this.updateQueue = [];
  191. (await Promise.all(loading)).forEach((fn) => fn && fn());
  192. }
  193. }
  194. async fetchUpdate(update) {
  195. const { path, acceptedPath, firstInvalidatedBy } = update;
  196. const mod = this.hotModulesMap.get(path);
  197. if (!mod) return;
  198. let fetchedModule;
  199. const isSelfUpdate = path === acceptedPath;
  200. const qualifiedCallbacks = mod.callbacks.filter(({ deps }) => deps.includes(acceptedPath));
  201. if (isSelfUpdate || qualifiedCallbacks.length > 0) {
  202. const disposer = this.disposeMap.get(acceptedPath);
  203. if (disposer) await disposer(this.dataMap.get(acceptedPath));
  204. try {
  205. fetchedModule = await this.importUpdatedModule(update);
  206. } catch (e) {
  207. this.warnFailedUpdate(e, acceptedPath);
  208. }
  209. }
  210. return () => {
  211. try {
  212. this.currentFirstInvalidatedBy = firstInvalidatedBy;
  213. for (const { deps, fn } of qualifiedCallbacks) fn(deps.map((dep) => dep === acceptedPath ? fetchedModule : void 0));
  214. const loggedPath = isSelfUpdate ? path : `${acceptedPath} via ${path}`;
  215. this.logger.debug(`hot updated: ${loggedPath}`);
  216. } finally {
  217. this.currentFirstInvalidatedBy = void 0;
  218. }
  219. };
  220. }
  221. };
  222. //#endregion
  223. //#region ../../node_modules/.pnpm/nanoid@5.1.7/node_modules/nanoid/non-secure/index.js
  224. let urlAlphabet = "useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict";
  225. let nanoid = (size = 21) => {
  226. let id = "";
  227. let i = size | 0;
  228. while (i--) id += urlAlphabet[Math.random() * 64 | 0];
  229. return id;
  230. };
  231. //#endregion
  232. //#region src/shared/constants.ts
  233. let SOURCEMAPPING_URL = "sourceMa";
  234. SOURCEMAPPING_URL += "ppingURL";
  235. typeof process !== "undefined" && process.platform;
  236. (async function() {}).constructor;
  237. function promiseWithResolvers() {
  238. let resolve;
  239. let reject;
  240. return {
  241. promise: new Promise((_resolve, _reject) => {
  242. resolve = _resolve;
  243. reject = _reject;
  244. }),
  245. resolve,
  246. reject
  247. };
  248. }
  249. //#endregion
  250. //#region src/shared/moduleRunnerTransport.ts
  251. function reviveInvokeError(e) {
  252. const error = new Error(e.message || "Unknown invoke error");
  253. Object.assign(error, e, { runnerError: /* @__PURE__ */ new Error("RunnerError") });
  254. return error;
  255. }
  256. const createInvokeableTransport = (transport) => {
  257. if (transport.invoke) return {
  258. ...transport,
  259. async invoke(name, data) {
  260. const result = await transport.invoke({
  261. type: "custom",
  262. event: "vite:invoke",
  263. data: {
  264. id: "send",
  265. name,
  266. data
  267. }
  268. });
  269. if ("error" in result) throw reviveInvokeError(result.error);
  270. return result.result;
  271. }
  272. };
  273. if (!transport.send || !transport.connect) throw new Error("transport must implement send and connect when invoke is not implemented");
  274. const rpcPromises = /* @__PURE__ */ new Map();
  275. return {
  276. ...transport,
  277. connect({ onMessage, onDisconnection }) {
  278. return transport.connect({
  279. onMessage(payload) {
  280. if (payload.type === "custom" && payload.event === "vite:invoke") {
  281. const data = payload.data;
  282. if (data.id.startsWith("response:")) {
  283. const invokeId = data.id.slice(9);
  284. const promise = rpcPromises.get(invokeId);
  285. if (!promise) return;
  286. if (promise.timeoutId) clearTimeout(promise.timeoutId);
  287. rpcPromises.delete(invokeId);
  288. const { error, result } = data.data;
  289. if (error) promise.reject(error);
  290. else promise.resolve(result);
  291. return;
  292. }
  293. }
  294. onMessage(payload);
  295. },
  296. onDisconnection
  297. });
  298. },
  299. disconnect() {
  300. rpcPromises.forEach((promise) => {
  301. promise.reject(/* @__PURE__ */ new Error(`transport was disconnected, cannot call ${JSON.stringify(promise.name)}`));
  302. });
  303. rpcPromises.clear();
  304. return transport.disconnect?.();
  305. },
  306. send(data) {
  307. return transport.send(data);
  308. },
  309. async invoke(name, data) {
  310. const promiseId = nanoid();
  311. const wrappedData = {
  312. type: "custom",
  313. event: "vite:invoke",
  314. data: {
  315. name,
  316. id: `send:${promiseId}`,
  317. data
  318. }
  319. };
  320. const sendPromise = transport.send(wrappedData);
  321. const { promise, resolve, reject } = promiseWithResolvers();
  322. const timeout = transport.timeout ?? 6e4;
  323. let timeoutId;
  324. if (timeout > 0) {
  325. timeoutId = setTimeout(() => {
  326. rpcPromises.delete(promiseId);
  327. reject(/* @__PURE__ */ new Error(`transport invoke timed out after ${timeout}ms (data: ${JSON.stringify(wrappedData)})`));
  328. }, timeout);
  329. timeoutId?.unref?.();
  330. }
  331. rpcPromises.set(promiseId, {
  332. resolve,
  333. reject,
  334. name,
  335. timeoutId
  336. });
  337. if (sendPromise) sendPromise.catch((err) => {
  338. clearTimeout(timeoutId);
  339. rpcPromises.delete(promiseId);
  340. reject(err);
  341. });
  342. try {
  343. return await promise;
  344. } catch (err) {
  345. throw reviveInvokeError(err);
  346. }
  347. }
  348. };
  349. };
  350. const normalizeModuleRunnerTransport = (transport) => {
  351. const invokeableTransport = createInvokeableTransport(transport);
  352. let isConnected = !invokeableTransport.connect;
  353. let connectingPromise;
  354. return {
  355. ...transport,
  356. ...invokeableTransport.connect ? { async connect(onMessage) {
  357. if (isConnected) return;
  358. if (connectingPromise) {
  359. await connectingPromise;
  360. return;
  361. }
  362. const maybePromise = invokeableTransport.connect({
  363. onMessage: onMessage ?? (() => {}),
  364. onDisconnection() {
  365. isConnected = false;
  366. }
  367. });
  368. if (maybePromise) {
  369. connectingPromise = maybePromise;
  370. await connectingPromise;
  371. connectingPromise = void 0;
  372. }
  373. isConnected = true;
  374. } } : {},
  375. ...invokeableTransport.disconnect ? { async disconnect() {
  376. if (!isConnected) return;
  377. if (connectingPromise) await connectingPromise;
  378. isConnected = false;
  379. await invokeableTransport.disconnect();
  380. } } : {},
  381. async send(data) {
  382. if (!invokeableTransport.send) return;
  383. if (!isConnected) if (connectingPromise) await connectingPromise;
  384. else throw new Error("send was called before connect");
  385. await invokeableTransport.send(data);
  386. },
  387. async invoke(name, data) {
  388. if (!isConnected) if (connectingPromise) await connectingPromise;
  389. else throw new Error("invoke was called before connect");
  390. return invokeableTransport.invoke(name, data);
  391. }
  392. };
  393. };
  394. const createWebSocketModuleRunnerTransport = (options) => {
  395. const pingInterval = options.pingInterval ?? 3e4;
  396. let ws;
  397. let pingIntervalId;
  398. return {
  399. async connect({ onMessage, onDisconnection }) {
  400. const socket = options.createConnection();
  401. socket.addEventListener("message", async ({ data }) => {
  402. onMessage(JSON.parse(data));
  403. });
  404. let isOpened = socket.readyState === socket.OPEN;
  405. if (!isOpened) await new Promise((resolve, reject) => {
  406. socket.addEventListener("open", () => {
  407. isOpened = true;
  408. resolve();
  409. }, { once: true });
  410. socket.addEventListener("close", async () => {
  411. if (!isOpened) {
  412. reject(/* @__PURE__ */ new Error("WebSocket closed without opened."));
  413. return;
  414. }
  415. onMessage({
  416. type: "custom",
  417. event: "vite:ws:disconnect",
  418. data: { webSocket: socket }
  419. });
  420. onDisconnection();
  421. });
  422. });
  423. onMessage({
  424. type: "custom",
  425. event: "vite:ws:connect",
  426. data: { webSocket: socket }
  427. });
  428. ws = socket;
  429. pingIntervalId = setInterval(() => {
  430. if (socket.readyState === socket.OPEN) socket.send(JSON.stringify({ type: "ping" }));
  431. }, pingInterval);
  432. },
  433. disconnect() {
  434. clearInterval(pingIntervalId);
  435. ws?.close();
  436. },
  437. send(data) {
  438. ws.send(JSON.stringify(data));
  439. }
  440. };
  441. };
  442. //#endregion
  443. //#region src/shared/hmrHandler.ts
  444. function createHMRHandler(handler) {
  445. const queue = new Queue();
  446. return (payload) => queue.enqueue(() => handler(payload));
  447. }
  448. var Queue = class {
  449. constructor() {
  450. _defineProperty(this, "queue", []);
  451. _defineProperty(this, "pending", false);
  452. }
  453. enqueue(promise) {
  454. return new Promise((resolve, reject) => {
  455. this.queue.push({
  456. promise,
  457. resolve,
  458. reject
  459. });
  460. this.dequeue();
  461. });
  462. }
  463. dequeue() {
  464. if (this.pending) return false;
  465. const item = this.queue.shift();
  466. if (!item) return false;
  467. this.pending = true;
  468. item.promise().then(item.resolve).catch(item.reject).finally(() => {
  469. this.pending = false;
  470. this.dequeue();
  471. });
  472. return true;
  473. }
  474. };
  475. //#endregion
  476. //#region src/shared/forwardConsole.ts
  477. function setupForwardConsoleHandler(transport, options) {
  478. if (!options.enabled) return;
  479. function sendError(type, error) {
  480. transport.send({
  481. type: "custom",
  482. event: "vite:forward-console",
  483. data: {
  484. type,
  485. data: {
  486. name: error?.name || "Unknown Error",
  487. message: error?.message || String(error),
  488. stack: error?.stack
  489. }
  490. }
  491. });
  492. }
  493. function sendLog(level, args) {
  494. transport.send({
  495. type: "custom",
  496. event: "vite:forward-console",
  497. data: {
  498. type: "log",
  499. data: {
  500. level,
  501. message: formatConsoleArgs(args)
  502. }
  503. }
  504. });
  505. }
  506. for (const level of options.logLevels) {
  507. const original = console[level];
  508. if (typeof original !== "function") continue;
  509. console[level] = (...args) => {
  510. original(...args);
  511. sendLog(level, args);
  512. };
  513. }
  514. if (options.unhandledErrors && typeof window !== "undefined") {
  515. window.addEventListener("error", (event) => {
  516. sendError("error", event.error ?? (event.message ? new Error(event.message) : event));
  517. });
  518. window.addEventListener("unhandledrejection", (event) => {
  519. sendError("unhandled-rejection", event.reason);
  520. });
  521. }
  522. }
  523. function formatConsoleArgs(args) {
  524. if (args.length === 0) return "";
  525. if (typeof args[0] !== "string") return args.map((arg) => stringifyConsoleArg(arg)).join(" ");
  526. const len = args.length;
  527. let i = 1;
  528. let message = args[0].replace(/%[sdjifoOc%]/g, (specifier) => {
  529. if (specifier === "%%") return "%";
  530. if (i >= len) return specifier;
  531. const arg = args[i++];
  532. switch (specifier) {
  533. case "%s":
  534. if (typeof arg === "bigint") return `${arg.toString()}n`;
  535. return typeof arg === "object" && arg != null ? stringifyConsoleArg(arg) : String(arg);
  536. case "%d":
  537. if (typeof arg === "bigint") return `${arg.toString()}n`;
  538. if (typeof arg === "symbol") return "NaN";
  539. return Number(arg).toString();
  540. case "%i":
  541. if (typeof arg === "bigint") return `${arg.toString()}n`;
  542. return Number.parseInt(String(arg), 10).toString();
  543. case "%f": return Number.parseFloat(String(arg)).toString();
  544. case "%o":
  545. case "%O": return stringifyConsoleArg(arg);
  546. case "%j": try {
  547. return JSON.stringify(arg) ?? "undefined";
  548. } catch {
  549. return "[Circular]";
  550. }
  551. case "%c": return "";
  552. default: return specifier;
  553. }
  554. });
  555. for (let arg = args[i]; i < len; arg = args[++i]) if (arg == null || typeof arg !== "object") message += ` ${typeof arg === "symbol" ? arg.toString() : String(arg)}`;
  556. else message += ` ${stringifyConsoleArg(arg)}`;
  557. return message;
  558. }
  559. function stringifyConsoleArg(value) {
  560. if (typeof value === "string") return value;
  561. if (typeof value === "number" || typeof value === "boolean" || typeof value === "undefined") return String(value);
  562. if (typeof value === "symbol") return value.toString();
  563. if (typeof value === "function") return value.name ? `[Function: ${value.name}]` : "[Function]";
  564. if (value instanceof Error) return value.stack || `${value.name}: ${value.message}`;
  565. if (typeof value === "bigint") return `${value}n`;
  566. const seen = /* @__PURE__ */ new WeakSet();
  567. try {
  568. return JSON.stringify(value, (_, nested) => {
  569. if (typeof nested === "bigint") return `${nested}n`;
  570. if (nested instanceof Error) return {
  571. name: nested.name,
  572. message: nested.message,
  573. stack: nested.stack
  574. };
  575. if (nested && typeof nested === "object") {
  576. if (seen.has(nested)) return "[Circular]";
  577. seen.add(nested);
  578. }
  579. return nested;
  580. }) ?? String(value);
  581. } catch {
  582. return String(value);
  583. }
  584. }
  585. //#endregion
  586. //#region src/client/overlay.ts
  587. const hmrConfigName = __HMR_CONFIG_NAME__;
  588. const base$1 = __BASE__ || "/";
  589. const cspNonce = "document" in globalThis ? document.querySelector("meta[property=csp-nonce]")?.nonce : void 0;
  590. function h(e, attrs = {}, ...children) {
  591. const elem = document.createElement(e);
  592. for (const [k, v] of Object.entries(attrs)) if (v !== void 0) elem.setAttribute(k, v);
  593. elem.append(...children);
  594. return elem;
  595. }
  596. const templateStyle = `
  597. :host {
  598. position: fixed;
  599. top: 0;
  600. left: 0;
  601. width: 100%;
  602. height: 100%;
  603. z-index: 99999;
  604. --monospace: 'SFMono-Regular', Consolas,
  605. 'Liberation Mono', Menlo, Courier, monospace;
  606. --red: #ff5555;
  607. --yellow: #e2aa53;
  608. --purple: #cfa4ff;
  609. --cyan: #2dd9da;
  610. --dim: #c9c9c9;
  611. --window-background: #181818;
  612. --window-color: #d8d8d8;
  613. }
  614. .backdrop {
  615. position: fixed;
  616. z-index: 99999;
  617. top: 0;
  618. left: 0;
  619. width: 100%;
  620. height: 100%;
  621. overflow-y: scroll;
  622. margin: 0;
  623. background: rgba(0, 0, 0, 0.66);
  624. }
  625. .window {
  626. font-family: var(--monospace);
  627. line-height: 1.5;
  628. max-width: 80vw;
  629. color: var(--window-color);
  630. box-sizing: border-box;
  631. margin: 30px auto;
  632. padding: 2.5vh 4vw;
  633. position: relative;
  634. background: var(--window-background);
  635. border-radius: 6px 6px 8px 8px;
  636. box-shadow: 0 19px 38px rgba(0,0,0,0.30), 0 15px 12px rgba(0,0,0,0.22);
  637. overflow: hidden;
  638. border-top: 8px solid var(--red);
  639. direction: ltr;
  640. text-align: left;
  641. }
  642. pre {
  643. font-family: var(--monospace);
  644. font-size: 16px;
  645. margin-top: 0;
  646. margin-bottom: 1em;
  647. overflow-x: scroll;
  648. scrollbar-width: none;
  649. }
  650. pre::-webkit-scrollbar {
  651. display: none;
  652. }
  653. pre.frame::-webkit-scrollbar {
  654. display: block;
  655. height: 5px;
  656. }
  657. pre.frame::-webkit-scrollbar-thumb {
  658. background: #999;
  659. border-radius: 5px;
  660. }
  661. pre.frame {
  662. scrollbar-width: thin;
  663. }
  664. .message {
  665. line-height: 1.3;
  666. font-weight: 600;
  667. white-space: pre-wrap;
  668. }
  669. .message-body {
  670. color: var(--red);
  671. }
  672. .plugin {
  673. color: var(--purple);
  674. }
  675. .file {
  676. color: var(--cyan);
  677. margin-bottom: 0;
  678. white-space: pre-wrap;
  679. word-break: break-all;
  680. }
  681. .frame {
  682. color: var(--yellow);
  683. }
  684. .stack {
  685. font-size: 13px;
  686. color: var(--dim);
  687. }
  688. .tip {
  689. font-size: 13px;
  690. color: #999;
  691. border-top: 1px dotted #999;
  692. padding-top: 13px;
  693. line-height: 1.8;
  694. }
  695. code {
  696. font-size: 13px;
  697. font-family: var(--monospace);
  698. color: var(--yellow);
  699. }
  700. .file-link {
  701. text-decoration: underline;
  702. cursor: pointer;
  703. }
  704. kbd {
  705. line-height: 1.5;
  706. font-family: ui-monospace, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
  707. font-size: 0.75rem;
  708. font-weight: 700;
  709. background-color: rgb(38, 40, 44);
  710. color: rgb(166, 167, 171);
  711. padding: 0.15rem 0.3rem;
  712. border-radius: 0.25rem;
  713. border-width: 0.0625rem 0.0625rem 0.1875rem;
  714. border-style: solid;
  715. border-color: rgb(54, 57, 64);
  716. border-image: initial;
  717. }
  718. `;
  719. const createTemplate = () => h("div", {
  720. class: "backdrop",
  721. part: "backdrop"
  722. }, h("div", {
  723. class: "window",
  724. part: "window"
  725. }, h("pre", {
  726. class: "message",
  727. part: "message"
  728. }, h("span", {
  729. class: "plugin",
  730. part: "plugin"
  731. }), h("span", {
  732. class: "message-body",
  733. part: "message-body"
  734. })), h("pre", {
  735. class: "file",
  736. part: "file"
  737. }), h("pre", {
  738. class: "frame",
  739. part: "frame"
  740. }), h("pre", {
  741. class: "stack",
  742. part: "stack"
  743. }), h("div", {
  744. class: "tip",
  745. part: "tip"
  746. }, "Click outside, press ", h("kbd", {}, "Esc"), " key, or fix the code to dismiss.", h("br"), "You can also disable this overlay by setting ", h("code", { part: "config-option-name" }, "server.hmr.overlay"), " to ", h("code", { part: "config-option-value" }, "false"), " in ", h("code", { part: "config-file-name" }, hmrConfigName), ".")), h("style", { nonce: cspNonce }, templateStyle));
  747. const fileRE = /(?:file:\/\/)?(?:[a-zA-Z]:\\|\/).*?:\d+:\d+/g;
  748. const codeframeRE = /^(?:>?\s*\d+\s+\|.*|\s+\|\s*\^.*)\r?\n/gm;
  749. const { HTMLElement = class {} } = globalThis;
  750. var ErrorOverlay = class extends HTMLElement {
  751. constructor(err, links = true) {
  752. super();
  753. this.root = this.attachShadow({ mode: "open" });
  754. this.root.appendChild(createTemplate());
  755. codeframeRE.lastIndex = 0;
  756. const hasFrame = err.frame && codeframeRE.test(err.frame);
  757. const message = hasFrame ? err.message.replace(codeframeRE, "") : err.message;
  758. if (err.plugin) this.text(".plugin", `[plugin:${err.plugin}] `);
  759. this.text(".message-body", message.trim());
  760. const [file] = (err.loc?.file || err.id || "unknown file").split(`?`);
  761. if (err.loc) this.text(".file", `${file}:${err.loc.line}:${err.loc.column}`, links);
  762. else if (err.id) this.text(".file", file);
  763. if (hasFrame) this.text(".frame", err.frame.trim());
  764. this.text(".stack", err.stack, links);
  765. this.root.querySelector(".window").addEventListener("click", (e) => {
  766. e.stopPropagation();
  767. });
  768. this.addEventListener("click", () => {
  769. this.close();
  770. });
  771. this.closeOnEsc = (e) => {
  772. if (e.key === "Escape" || e.code === "Escape") this.close();
  773. };
  774. document.addEventListener("keydown", this.closeOnEsc);
  775. }
  776. text(selector, text, linkFiles = false) {
  777. const el = this.root.querySelector(selector);
  778. if (!linkFiles) el.textContent = text;
  779. else {
  780. let curIndex = 0;
  781. let match;
  782. fileRE.lastIndex = 0;
  783. while (match = fileRE.exec(text)) {
  784. const { 0: file, index } = match;
  785. const frag = text.slice(curIndex, index);
  786. el.appendChild(document.createTextNode(frag));
  787. const link = document.createElement("a");
  788. link.textContent = file;
  789. link.className = "file-link";
  790. link.onclick = () => {
  791. fetch(new URL(`${base$1}__open-in-editor?file=${encodeURIComponent(file)}`, import.meta.url));
  792. };
  793. el.appendChild(link);
  794. curIndex += frag.length + file.length;
  795. }
  796. if (curIndex < text.length) el.appendChild(document.createTextNode(text.slice(curIndex)));
  797. }
  798. }
  799. close() {
  800. this.parentNode?.removeChild(this);
  801. document.removeEventListener("keydown", this.closeOnEsc);
  802. }
  803. };
  804. const overlayId = "vite-error-overlay";
  805. const { customElements } = globalThis;
  806. if (customElements && !customElements.get("vite-error-overlay")) customElements.define(overlayId, ErrorOverlay);
  807. //#endregion
  808. //#region src/client/client.ts
  809. console.debug("[vite] connecting...");
  810. const importMetaUrl = new URL(import.meta.url);
  811. const serverHost = __SERVER_HOST__;
  812. const socketProtocol = __HMR_PROTOCOL__ || (importMetaUrl.protocol === "https:" ? "wss" : "ws");
  813. const hmrPort = __HMR_PORT__;
  814. const socketHost = `${__HMR_HOSTNAME__ || importMetaUrl.hostname}:${hmrPort || importMetaUrl.port}${__HMR_BASE__}`;
  815. const directSocketHost = __HMR_DIRECT_TARGET__;
  816. const base = __BASE__ || "/";
  817. const hmrTimeout = __HMR_TIMEOUT__;
  818. const wsToken = __WS_TOKEN__;
  819. const isBundleMode = __BUNDLED_DEV__;
  820. const forwardConsole = __SERVER_FORWARD_CONSOLE__;
  821. const transport = normalizeModuleRunnerTransport((() => {
  822. let wsTransport = createWebSocketModuleRunnerTransport({
  823. createConnection: () => new WebSocket(`${socketProtocol}://${socketHost}?token=${wsToken}`, "vite-hmr"),
  824. pingInterval: hmrTimeout
  825. });
  826. return {
  827. async connect(handlers) {
  828. try {
  829. await wsTransport.connect(handlers);
  830. } catch (e) {
  831. if (!hmrPort) {
  832. wsTransport = createWebSocketModuleRunnerTransport({
  833. createConnection: () => new WebSocket(`${socketProtocol}://${directSocketHost}?token=${wsToken}`, "vite-hmr"),
  834. pingInterval: hmrTimeout
  835. });
  836. try {
  837. await wsTransport.connect(handlers);
  838. console.info("[vite] Direct websocket connection fallback. Check out https://vite.dev/config/server-options.html#server-hmr to remove the previous connection error.");
  839. } catch (e) {
  840. if (e instanceof Error && e.message.includes("WebSocket closed without opened.")) {
  841. const currentScriptHostURL = new URL(import.meta.url);
  842. const currentScriptHost = currentScriptHostURL.host + currentScriptHostURL.pathname.replace(/@vite\/client$/, "");
  843. console.error(`[vite] failed to connect to websocket.
  844. your current setup:
  845. (browser) ${currentScriptHost} <--[HTTP]--> ${serverHost} (server)\n (browser) ${socketHost} <--[WebSocket (failing)]--> ${directSocketHost} (server)\nCheck out your Vite / network configuration and https://vite.dev/config/server-options.html#server-hmr .`);
  846. }
  847. }
  848. return;
  849. }
  850. console.error(`[vite] failed to connect to websocket (${e}). `);
  851. throw e;
  852. }
  853. },
  854. async disconnect() {
  855. await wsTransport.disconnect();
  856. },
  857. send(data) {
  858. wsTransport.send(data);
  859. }
  860. };
  861. })());
  862. let willUnload = false;
  863. if (typeof window !== "undefined") window.addEventListener?.("beforeunload", () => {
  864. willUnload = true;
  865. });
  866. function cleanUrl(pathname) {
  867. const url = new URL(pathname, "http://vite.dev");
  868. url.searchParams.delete("direct");
  869. return url.pathname + url.search;
  870. }
  871. let isFirstUpdate = true;
  872. const outdatedLinkTags = /* @__PURE__ */ new WeakSet();
  873. const debounceReload = (time) => {
  874. let timer;
  875. return () => {
  876. if (timer) {
  877. clearTimeout(timer);
  878. timer = null;
  879. }
  880. timer = setTimeout(() => {
  881. location.reload();
  882. }, time);
  883. };
  884. };
  885. const pageReload = debounceReload(20);
  886. const hmrClient = new HMRClient({
  887. error: (err) => console.error("[vite]", err),
  888. debug: (...msg) => console.debug("[vite]", ...msg)
  889. }, transport, isBundleMode ? async function importUpdatedModule({ url, acceptedPath, isWithinCircularImport }) {
  890. const importPromise = import(base + url).then(() => globalThis.__rolldown_runtime__.loadExports(acceptedPath));
  891. if (isWithinCircularImport) importPromise.catch(() => {
  892. console.info(`[hmr] ${acceptedPath} failed to apply HMR as it's within a circular import. Reloading page to reset the execution order. To debug and break the circular import, you can run \`vite --debug hmr\` to log the circular dependency path if a file change triggered it.`);
  893. pageReload();
  894. });
  895. return await importPromise;
  896. } : async function importUpdatedModule({ acceptedPath, timestamp, explicitImportRequired, isWithinCircularImport }) {
  897. const [acceptedPathWithoutQuery, query] = acceptedPath.split(`?`);
  898. const importPromise = import(
  899. /* @vite-ignore */
  900. base + acceptedPathWithoutQuery.slice(1) + `?${explicitImportRequired ? "import&" : ""}t=${timestamp}${query ? `&${query}` : ""}`
  901. );
  902. if (isWithinCircularImport) importPromise.catch(() => {
  903. console.info(`[hmr] ${acceptedPath} failed to apply HMR as it's within a circular import. Reloading page to reset the execution order. To debug and break the circular import, you can run \`vite --debug hmr\` to log the circular dependency path if a file change triggered it.`);
  904. pageReload();
  905. });
  906. return await importPromise;
  907. });
  908. transport.connect(createHMRHandler(handleMessage));
  909. setupForwardConsoleHandler(transport, forwardConsole);
  910. async function handleMessage(payload) {
  911. switch (payload.type) {
  912. case "connected":
  913. console.debug(`[vite] connected.`);
  914. break;
  915. case "update":
  916. await hmrClient.notifyListeners("vite:beforeUpdate", payload);
  917. if (hasDocument) if (isFirstUpdate && hasErrorOverlay()) {
  918. location.reload();
  919. return;
  920. } else {
  921. if (enableOverlay) clearErrorOverlay();
  922. isFirstUpdate = false;
  923. }
  924. await Promise.all(payload.updates.map(async (update) => {
  925. if (update.type === "js-update") return hmrClient.queueUpdate(update);
  926. const { path, timestamp } = update;
  927. const searchUrl = cleanUrl(path);
  928. const el = Array.from(document.querySelectorAll("link")).find((e) => !outdatedLinkTags.has(e) && cleanUrl(e.href).includes(searchUrl));
  929. if (!el) return;
  930. const newPath = `${base}${searchUrl.slice(1)}${searchUrl.includes("?") ? "&" : "?"}t=${timestamp}`;
  931. return new Promise((resolve) => {
  932. const newLinkTag = el.cloneNode();
  933. newLinkTag.href = new URL(newPath, el.href).href;
  934. const removeOldEl = () => {
  935. el.remove();
  936. console.debug(`[vite] css hot updated: ${searchUrl}`);
  937. resolve();
  938. };
  939. newLinkTag.addEventListener("load", removeOldEl);
  940. newLinkTag.addEventListener("error", removeOldEl);
  941. outdatedLinkTags.add(el);
  942. el.after(newLinkTag);
  943. });
  944. }));
  945. await hmrClient.notifyListeners("vite:afterUpdate", payload);
  946. break;
  947. case "custom":
  948. await hmrClient.notifyListeners(payload.event, payload.data);
  949. if (payload.event === "vite:ws:disconnect") {
  950. if (hasDocument && !willUnload) {
  951. console.log(`[vite] server connection lost. Polling for restart...`);
  952. const socket = payload.data.webSocket;
  953. const url = new URL(socket.url);
  954. url.search = "";
  955. await waitForSuccessfulPing(url.href);
  956. location.reload();
  957. }
  958. }
  959. break;
  960. case "full-reload":
  961. await hmrClient.notifyListeners("vite:beforeFullReload", payload);
  962. if (hasDocument) if (payload.path && payload.path.endsWith(".html")) {
  963. const pagePath = decodeURI(location.pathname);
  964. const payloadPath = base + payload.path.slice(1);
  965. if (pagePath === payloadPath || payload.path === "/index.html" || pagePath.endsWith("/") && pagePath + "index.html" === payloadPath) pageReload();
  966. return;
  967. } else pageReload();
  968. break;
  969. case "prune":
  970. await hmrClient.notifyListeners("vite:beforePrune", payload);
  971. await hmrClient.prunePaths(payload.paths);
  972. break;
  973. case "error":
  974. await hmrClient.notifyListeners("vite:error", payload);
  975. if (hasDocument) {
  976. const err = payload.err;
  977. if (enableOverlay) createErrorOverlay(err);
  978. else console.error(`[vite] Internal Server Error\n${err.message}\n${err.stack}`);
  979. }
  980. break;
  981. case "ping": break;
  982. default: return payload;
  983. }
  984. }
  985. const enableOverlay = __HMR_ENABLE_OVERLAY__;
  986. const hasDocument = "document" in globalThis;
  987. function createErrorOverlay(err) {
  988. clearErrorOverlay();
  989. const { customElements } = globalThis;
  990. if (customElements) {
  991. const ErrorOverlayConstructor = customElements.get(overlayId);
  992. document.body.appendChild(new ErrorOverlayConstructor(err));
  993. }
  994. }
  995. function clearErrorOverlay() {
  996. document.querySelectorAll(overlayId).forEach((n) => n.close());
  997. }
  998. function hasErrorOverlay() {
  999. return document.querySelectorAll(overlayId).length;
  1000. }
  1001. function waitForSuccessfulPing(socketUrl) {
  1002. if (typeof SharedWorker === "undefined") {
  1003. const visibilityManager = {
  1004. currentState: document.visibilityState,
  1005. listeners: /* @__PURE__ */ new Set()
  1006. };
  1007. const onVisibilityChange = () => {
  1008. visibilityManager.currentState = document.visibilityState;
  1009. for (const listener of visibilityManager.listeners) listener(visibilityManager.currentState);
  1010. };
  1011. document.addEventListener("visibilitychange", onVisibilityChange);
  1012. return waitForSuccessfulPingInternal(socketUrl, visibilityManager);
  1013. }
  1014. const blob = new Blob([
  1015. "\"use strict\";",
  1016. `const waitForSuccessfulPingInternal = ${waitForSuccessfulPingInternal.toString()};`,
  1017. `const fn = ${pingWorkerContentMain.toString()};`,
  1018. `fn(${JSON.stringify(socketUrl)})`
  1019. ], { type: "application/javascript" });
  1020. const objURL = URL.createObjectURL(blob);
  1021. const sharedWorker = new SharedWorker(objURL);
  1022. return new Promise((resolve, reject) => {
  1023. const onVisibilityChange = () => {
  1024. sharedWorker.port.postMessage({ visibility: document.visibilityState });
  1025. };
  1026. document.addEventListener("visibilitychange", onVisibilityChange);
  1027. sharedWorker.port.addEventListener("message", (event) => {
  1028. document.removeEventListener("visibilitychange", onVisibilityChange);
  1029. sharedWorker.port.close();
  1030. const data = event.data;
  1031. if (data.type === "error") {
  1032. reject(data.error);
  1033. return;
  1034. }
  1035. resolve();
  1036. });
  1037. onVisibilityChange();
  1038. sharedWorker.port.start();
  1039. });
  1040. }
  1041. function pingWorkerContentMain(socketUrl) {
  1042. self.addEventListener("connect", (_event) => {
  1043. const port = _event.ports[0];
  1044. if (!socketUrl) {
  1045. port.postMessage({
  1046. type: "error",
  1047. error: /* @__PURE__ */ new Error("socketUrl not found")
  1048. });
  1049. return;
  1050. }
  1051. const visibilityManager = {
  1052. currentState: "visible",
  1053. listeners: /* @__PURE__ */ new Set()
  1054. };
  1055. port.addEventListener("message", (event) => {
  1056. const { visibility } = event.data;
  1057. visibilityManager.currentState = visibility;
  1058. console.debug("[vite] new window visibility", visibility);
  1059. for (const listener of visibilityManager.listeners) listener(visibility);
  1060. });
  1061. port.start();
  1062. console.debug("[vite] connected from window");
  1063. waitForSuccessfulPingInternal(socketUrl, visibilityManager).then(() => {
  1064. console.debug("[vite] ping successful");
  1065. try {
  1066. port.postMessage({ type: "success" });
  1067. } catch (error) {
  1068. port.postMessage({
  1069. type: "error",
  1070. error
  1071. });
  1072. }
  1073. }, (error) => {
  1074. console.debug("[vite] error happened", error);
  1075. try {
  1076. port.postMessage({
  1077. type: "error",
  1078. error
  1079. });
  1080. } catch (error) {
  1081. port.postMessage({
  1082. type: "error",
  1083. error
  1084. });
  1085. }
  1086. });
  1087. });
  1088. }
  1089. async function waitForSuccessfulPingInternal(socketUrl, visibilityManager, ms = 1e3) {
  1090. function wait(ms) {
  1091. return new Promise((resolve) => setTimeout(resolve, ms));
  1092. }
  1093. async function ping() {
  1094. try {
  1095. const socket = new WebSocket(socketUrl, "vite-ping");
  1096. return new Promise((resolve) => {
  1097. function onOpen() {
  1098. resolve(true);
  1099. close();
  1100. }
  1101. function onError() {
  1102. resolve(false);
  1103. close();
  1104. }
  1105. function close() {
  1106. socket.removeEventListener("open", onOpen);
  1107. socket.removeEventListener("error", onError);
  1108. socket.close();
  1109. }
  1110. socket.addEventListener("open", onOpen);
  1111. socket.addEventListener("error", onError);
  1112. });
  1113. } catch {
  1114. return false;
  1115. }
  1116. }
  1117. function waitForWindowShow(visibilityManager) {
  1118. return new Promise((resolve) => {
  1119. const onChange = (newVisibility) => {
  1120. if (newVisibility === "visible") {
  1121. resolve();
  1122. visibilityManager.listeners.delete(onChange);
  1123. }
  1124. };
  1125. visibilityManager.listeners.add(onChange);
  1126. });
  1127. }
  1128. if (await ping()) return;
  1129. await wait(ms);
  1130. while (true) if (visibilityManager.currentState === "visible") {
  1131. if (await ping()) break;
  1132. await wait(ms);
  1133. } else await waitForWindowShow(visibilityManager);
  1134. }
  1135. const sheetsMap = /* @__PURE__ */ new Map();
  1136. const linkSheetsMap = /* @__PURE__ */ new Map();
  1137. if ("document" in globalThis) {
  1138. document.querySelectorAll("style[data-vite-dev-id]").forEach((el) => {
  1139. sheetsMap.set(el.getAttribute("data-vite-dev-id"), el);
  1140. });
  1141. document.querySelectorAll("link[rel=\"stylesheet\"][data-vite-dev-id]").forEach((el) => {
  1142. linkSheetsMap.set(el.getAttribute("data-vite-dev-id"), el);
  1143. });
  1144. }
  1145. let lastInsertedStyle;
  1146. function updateStyle(id, content) {
  1147. if (linkSheetsMap.has(id)) return;
  1148. let style = sheetsMap.get(id);
  1149. if (!style) {
  1150. style = document.createElement("style");
  1151. style.setAttribute("type", "text/css");
  1152. style.setAttribute("data-vite-dev-id", id);
  1153. style.textContent = content;
  1154. if (cspNonce) style.setAttribute("nonce", cspNonce);
  1155. if (!lastInsertedStyle) {
  1156. document.head.appendChild(style);
  1157. setTimeout(() => {
  1158. lastInsertedStyle = void 0;
  1159. }, 0);
  1160. } else lastInsertedStyle.insertAdjacentElement("afterend", style);
  1161. lastInsertedStyle = style;
  1162. } else style.textContent = content;
  1163. sheetsMap.set(id, style);
  1164. }
  1165. function removeStyle(id) {
  1166. if (linkSheetsMap.has(id)) {
  1167. document.querySelectorAll(`link[rel="stylesheet"][data-vite-dev-id]`).forEach((el) => {
  1168. if (el.getAttribute("data-vite-dev-id") === id) el.remove();
  1169. });
  1170. linkSheetsMap.delete(id);
  1171. }
  1172. const style = sheetsMap.get(id);
  1173. if (style) {
  1174. document.head.removeChild(style);
  1175. sheetsMap.delete(id);
  1176. }
  1177. }
  1178. function createHotContext(ownerPath) {
  1179. return new HMRContext(hmrClient, ownerPath);
  1180. }
  1181. /**
  1182. * urls here are dynamic import() urls that couldn't be statically analyzed
  1183. */
  1184. function injectQuery(url, queryToInject) {
  1185. if (url[0] !== "." && url[0] !== "/") return url;
  1186. const pathname = url.replace(/[?#].*$/, "");
  1187. const { search, hash } = new URL(url, "http://vite.dev");
  1188. return `${pathname}?${queryToInject}${search ? `&` + search.slice(1) : ""}${hash || ""}`;
  1189. }
  1190. if (isBundleMode && typeof DevRuntime !== "undefined") {
  1191. var _ref;
  1192. class ViteDevRuntime extends DevRuntime {
  1193. createModuleHotContext(moduleId) {
  1194. const ctx = createHotContext(moduleId);
  1195. ctx._internal = {
  1196. updateStyle,
  1197. removeStyle
  1198. };
  1199. return ctx;
  1200. }
  1201. applyUpdates(_boundaries) {}
  1202. }
  1203. (_ref = globalThis).__rolldown_runtime__ ?? (_ref.__rolldown_runtime__ = new ViteDevRuntime({ send(message) {
  1204. switch (message.type) {
  1205. case "hmr:module-registered":
  1206. transport.send({
  1207. type: "custom",
  1208. event: "vite:module-loaded",
  1209. data: { modules: message.modules.slice() }
  1210. });
  1211. break;
  1212. default: throw new Error(`Unknown message type: ${JSON.stringify(message)}`);
  1213. }
  1214. } }));
  1215. }
  1216. //#endregion
  1217. export { ErrorOverlay, createHotContext, injectQuery, removeStyle, updateStyle };