client.mjs 39 KB

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