市场夺宝奇兵
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1092 lines
33 KiB

  1. import "@vite/env";
  2. //#region \0@oxc-project+runtime@0.93.0/helpers/typeof.js
  3. function _typeof(o) {
  4. "@babel/helpers - typeof";
  5. return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(o$1) {
  6. return typeof o$1;
  7. } : function(o$1) {
  8. return o$1 && "function" == typeof Symbol && o$1.constructor === Symbol && o$1 !== Symbol.prototype ? "symbol" : typeof o$1;
  9. }, _typeof(o);
  10. }
  11. //#endregion
  12. //#region \0@oxc-project+runtime@0.93.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.93.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.93.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$1, ownerPath) {
  43. this.hmrClient = hmrClient$1;
  44. this.ownerPath = ownerPath;
  45. _defineProperty(this, "newListeners", void 0);
  46. if (!hmrClient$1.dataMap.has(ownerPath)) hmrClient$1.dataMap.set(ownerPath, {});
  47. const mod = hmrClient$1.hotModulesMap.get(ownerPath);
  48. if (mod) mod.callbacks = [];
  49. const staleListeners = hmrClient$1.ctxToListenersMap.get(ownerPath);
  50. if (staleListeners) for (const [event, staleFns] of staleListeners) {
  51. const listeners = hmrClient$1.customListenersMap.get(event);
  52. if (listeners) hmrClient$1.customListenersMap.set(event, listeners.filter((l) => !staleFns.includes(l)));
  53. }
  54. this.newListeners = /* @__PURE__ */ new Map();
  55. hmrClient$1.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$1, importUpdatedModule) {
  134. this.logger = logger;
  135. this.transport = transport$1;
  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.6/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. //#endregion
  236. //#region src/shared/utils.ts
  237. const isWindows = typeof process !== "undefined" && process.platform === "win32";
  238. const AsyncFunction = async function() {}.constructor;
  239. function promiseWithResolvers() {
  240. let resolve;
  241. let reject;
  242. return {
  243. promise: new Promise((_resolve, _reject) => {
  244. resolve = _resolve;
  245. reject = _reject;
  246. }),
  247. resolve,
  248. reject
  249. };
  250. }
  251. //#endregion
  252. //#region src/shared/moduleRunnerTransport.ts
  253. function reviveInvokeError(e) {
  254. const error = new Error(e.message || "Unknown invoke error");
  255. Object.assign(error, e, { runnerError: /* @__PURE__ */ new Error("RunnerError") });
  256. return error;
  257. }
  258. const createInvokeableTransport = (transport$1) => {
  259. if (transport$1.invoke) return {
  260. ...transport$1,
  261. async invoke(name, data) {
  262. const result = await transport$1.invoke({
  263. type: "custom",
  264. event: "vite:invoke",
  265. data: {
  266. id: "send",
  267. name,
  268. data
  269. }
  270. });
  271. if ("error" in result) throw reviveInvokeError(result.error);
  272. return result.result;
  273. }
  274. };
  275. if (!transport$1.send || !transport$1.connect) throw new Error("transport must implement send and connect when invoke is not implemented");
  276. const rpcPromises = /* @__PURE__ */ new Map();
  277. return {
  278. ...transport$1,
  279. connect({ onMessage, onDisconnection }) {
  280. return transport$1.connect({
  281. onMessage(payload) {
  282. if (payload.type === "custom" && payload.event === "vite:invoke") {
  283. const data = payload.data;
  284. if (data.id.startsWith("response:")) {
  285. const invokeId = data.id.slice(9);
  286. const promise = rpcPromises.get(invokeId);
  287. if (!promise) return;
  288. if (promise.timeoutId) clearTimeout(promise.timeoutId);
  289. rpcPromises.delete(invokeId);
  290. const { error, result } = data.data;
  291. if (error) promise.reject(error);
  292. else promise.resolve(result);
  293. return;
  294. }
  295. }
  296. onMessage(payload);
  297. },
  298. onDisconnection
  299. });
  300. },
  301. disconnect() {
  302. rpcPromises.forEach((promise) => {
  303. promise.reject(/* @__PURE__ */ new Error(`transport was disconnected, cannot call ${JSON.stringify(promise.name)}`));
  304. });
  305. rpcPromises.clear();
  306. return transport$1.disconnect?.();
  307. },
  308. send(data) {
  309. return transport$1.send(data);
  310. },
  311. async invoke(name, data) {
  312. const promiseId = nanoid();
  313. const wrappedData = {
  314. type: "custom",
  315. event: "vite:invoke",
  316. data: {
  317. name,
  318. id: `send:${promiseId}`,
  319. data
  320. }
  321. };
  322. const sendPromise = transport$1.send(wrappedData);
  323. const { promise, resolve, reject } = promiseWithResolvers();
  324. const timeout = transport$1.timeout ?? 6e4;
  325. let timeoutId;
  326. if (timeout > 0) {
  327. timeoutId = setTimeout(() => {
  328. rpcPromises.delete(promiseId);
  329. reject(/* @__PURE__ */ new Error(`transport invoke timed out after ${timeout}ms (data: ${JSON.stringify(wrappedData)})`));
  330. }, timeout);
  331. timeoutId?.unref?.();
  332. }
  333. rpcPromises.set(promiseId, {
  334. resolve,
  335. reject,
  336. name,
  337. timeoutId
  338. });
  339. if (sendPromise) sendPromise.catch((err) => {
  340. clearTimeout(timeoutId);
  341. rpcPromises.delete(promiseId);
  342. reject(err);
  343. });
  344. try {
  345. return await promise;
  346. } catch (err) {
  347. throw reviveInvokeError(err);
  348. }
  349. }
  350. };
  351. };
  352. const normalizeModuleRunnerTransport = (transport$1) => {
  353. const invokeableTransport = createInvokeableTransport(transport$1);
  354. let isConnected = !invokeableTransport.connect;
  355. let connectingPromise;
  356. return {
  357. ...transport$1,
  358. ...invokeableTransport.connect ? { async connect(onMessage) {
  359. if (isConnected) return;
  360. if (connectingPromise) {
  361. await connectingPromise;
  362. return;
  363. }
  364. const maybePromise = invokeableTransport.connect({
  365. onMessage: onMessage ?? (() => {}),
  366. onDisconnection() {
  367. isConnected = false;
  368. }
  369. });
  370. if (maybePromise) {
  371. connectingPromise = maybePromise;
  372. await connectingPromise;
  373. connectingPromise = void 0;
  374. }
  375. isConnected = true;
  376. } } : {},
  377. ...invokeableTransport.disconnect ? { async disconnect() {
  378. if (!isConnected) return;
  379. if (connectingPromise) await connectingPromise;
  380. isConnected = false;
  381. await invokeableTransport.disconnect();
  382. } } : {},
  383. async send(data) {
  384. if (!invokeableTransport.send) return;
  385. if (!isConnected) if (connectingPromise) await connectingPromise;
  386. else throw new Error("send was called before connect");
  387. await invokeableTransport.send(data);
  388. },
  389. async invoke(name, data) {
  390. if (!isConnected) if (connectingPromise) await connectingPromise;
  391. else throw new Error("invoke was called before connect");
  392. return invokeableTransport.invoke(name, data);
  393. }
  394. };
  395. };
  396. const createWebSocketModuleRunnerTransport = (options) => {
  397. const pingInterval = options.pingInterval ?? 3e4;
  398. let ws;
  399. let pingIntervalId;
  400. return {
  401. async connect({ onMessage, onDisconnection }) {
  402. const socket = options.createConnection();
  403. socket.addEventListener("message", async ({ data }) => {
  404. onMessage(JSON.parse(data));
  405. });
  406. let isOpened = socket.readyState === socket.OPEN;
  407. if (!isOpened) await new Promise((resolve, reject) => {
  408. socket.addEventListener("open", () => {
  409. isOpened = true;
  410. resolve();
  411. }, { once: true });
  412. socket.addEventListener("close", async () => {
  413. if (!isOpened) {
  414. reject(/* @__PURE__ */ new Error("WebSocket closed without opened."));
  415. return;
  416. }
  417. onMessage({
  418. type: "custom",
  419. event: "vite:ws:disconnect",
  420. data: { webSocket: socket }
  421. });
  422. onDisconnection();
  423. });
  424. });
  425. onMessage({
  426. type: "custom",
  427. event: "vite:ws:connect",
  428. data: { webSocket: socket }
  429. });
  430. ws = socket;
  431. pingIntervalId = setInterval(() => {
  432. if (socket.readyState === socket.OPEN) socket.send(JSON.stringify({ type: "ping" }));
  433. }, pingInterval);
  434. },
  435. disconnect() {
  436. clearInterval(pingIntervalId);
  437. ws?.close();
  438. },
  439. send(data) {
  440. ws.send(JSON.stringify(data));
  441. }
  442. };
  443. };
  444. //#endregion
  445. //#region src/shared/hmrHandler.ts
  446. function createHMRHandler(handler) {
  447. const queue = new Queue();
  448. return (payload) => queue.enqueue(() => handler(payload));
  449. }
  450. var Queue = class {
  451. constructor() {
  452. _defineProperty(this, "queue", []);
  453. _defineProperty(this, "pending", false);
  454. }
  455. enqueue(promise) {
  456. return new Promise((resolve, reject) => {
  457. this.queue.push({
  458. promise,
  459. resolve,
  460. reject
  461. });
  462. this.dequeue();
  463. });
  464. }
  465. dequeue() {
  466. if (this.pending) return false;
  467. const item = this.queue.shift();
  468. if (!item) return false;
  469. this.pending = true;
  470. item.promise().then(item.resolve).catch(item.reject).finally(() => {
  471. this.pending = false;
  472. this.dequeue();
  473. });
  474. return true;
  475. }
  476. };
  477. //#endregion
  478. //#region src/client/overlay.ts
  479. const hmrConfigName = __HMR_CONFIG_NAME__;
  480. const base$1 = __BASE__ || "/";
  481. const cspNonce = "document" in globalThis ? document.querySelector("meta[property=csp-nonce]")?.nonce : void 0;
  482. function h(e, attrs = {}, ...children) {
  483. const elem = document.createElement(e);
  484. for (const [k, v] of Object.entries(attrs)) if (v !== void 0) elem.setAttribute(k, v);
  485. elem.append(...children);
  486. return elem;
  487. }
  488. const templateStyle = `
  489. :host {
  490. position: fixed;
  491. top: 0;
  492. left: 0;
  493. width: 100%;
  494. height: 100%;
  495. z-index: 99999;
  496. --monospace: 'SFMono-Regular', Consolas,
  497. 'Liberation Mono', Menlo, Courier, monospace;
  498. --red: #ff5555;
  499. --yellow: #e2aa53;
  500. --purple: #cfa4ff;
  501. --cyan: #2dd9da;
  502. --dim: #c9c9c9;
  503. --window-background: #181818;
  504. --window-color: #d8d8d8;
  505. }
  506. .backdrop {
  507. position: fixed;
  508. z-index: 99999;
  509. top: 0;
  510. left: 0;
  511. width: 100%;
  512. height: 100%;
  513. overflow-y: scroll;
  514. margin: 0;
  515. background: rgba(0, 0, 0, 0.66);
  516. }
  517. .window {
  518. font-family: var(--monospace);
  519. line-height: 1.5;
  520. max-width: 80vw;
  521. color: var(--window-color);
  522. box-sizing: border-box;
  523. margin: 30px auto;
  524. padding: 2.5vh 4vw;
  525. position: relative;
  526. background: var(--window-background);
  527. border-radius: 6px 6px 8px 8px;
  528. box-shadow: 0 19px 38px rgba(0,0,0,0.30), 0 15px 12px rgba(0,0,0,0.22);
  529. overflow: hidden;
  530. border-top: 8px solid var(--red);
  531. direction: ltr;
  532. text-align: left;
  533. }
  534. pre {
  535. font-family: var(--monospace);
  536. font-size: 16px;
  537. margin-top: 0;
  538. margin-bottom: 1em;
  539. overflow-x: scroll;
  540. scrollbar-width: none;
  541. }
  542. pre::-webkit-scrollbar {
  543. display: none;
  544. }
  545. pre.frame::-webkit-scrollbar {
  546. display: block;
  547. height: 5px;
  548. }
  549. pre.frame::-webkit-scrollbar-thumb {
  550. background: #999;
  551. border-radius: 5px;
  552. }
  553. pre.frame {
  554. scrollbar-width: thin;
  555. }
  556. .message {
  557. line-height: 1.3;
  558. font-weight: 600;
  559. white-space: pre-wrap;
  560. }
  561. .message-body {
  562. color: var(--red);
  563. }
  564. .plugin {
  565. color: var(--purple);
  566. }
  567. .file {
  568. color: var(--cyan);
  569. margin-bottom: 0;
  570. white-space: pre-wrap;
  571. word-break: break-all;
  572. }
  573. .frame {
  574. color: var(--yellow);
  575. }
  576. .stack {
  577. font-size: 13px;
  578. color: var(--dim);
  579. }
  580. .tip {
  581. font-size: 13px;
  582. color: #999;
  583. border-top: 1px dotted #999;
  584. padding-top: 13px;
  585. line-height: 1.8;
  586. }
  587. code {
  588. font-size: 13px;
  589. font-family: var(--monospace);
  590. color: var(--yellow);
  591. }
  592. .file-link {
  593. text-decoration: underline;
  594. cursor: pointer;
  595. }
  596. kbd {
  597. line-height: 1.5;
  598. font-family: ui-monospace, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
  599. font-size: 0.75rem;
  600. font-weight: 700;
  601. background-color: rgb(38, 40, 44);
  602. color: rgb(166, 167, 171);
  603. padding: 0.15rem 0.3rem;
  604. border-radius: 0.25rem;
  605. border-width: 0.0625rem 0.0625rem 0.1875rem;
  606. border-style: solid;
  607. border-color: rgb(54, 57, 64);
  608. border-image: initial;
  609. }
  610. `;
  611. const createTemplate = () => h("div", {
  612. class: "backdrop",
  613. part: "backdrop"
  614. }, h("div", {
  615. class: "window",
  616. part: "window"
  617. }, h("pre", {
  618. class: "message",
  619. part: "message"
  620. }, h("span", {
  621. class: "plugin",
  622. part: "plugin"
  623. }), h("span", {
  624. class: "message-body",
  625. part: "message-body"
  626. })), h("pre", {
  627. class: "file",
  628. part: "file"
  629. }), h("pre", {
  630. class: "frame",
  631. part: "frame"
  632. }), h("pre", {
  633. class: "stack",
  634. part: "stack"
  635. }), h("div", {
  636. class: "tip",
  637. part: "tip"
  638. }, "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));
  639. const fileRE = /(?:file:\/\/)?(?:[a-zA-Z]:\\|\/).*?:\d+:\d+/g;
  640. const codeframeRE = /^(?:>?\s*\d+\s+\|.*|\s+\|\s*\^.*)\r?\n/gm;
  641. const { HTMLElement = class {} } = globalThis;
  642. var ErrorOverlay = class extends HTMLElement {
  643. constructor(err, links = true) {
  644. super();
  645. _defineProperty(this, "root", void 0);
  646. _defineProperty(this, "closeOnEsc", void 0);
  647. this.root = this.attachShadow({ mode: "open" });
  648. this.root.appendChild(createTemplate());
  649. codeframeRE.lastIndex = 0;
  650. const hasFrame = err.frame && codeframeRE.test(err.frame);
  651. const message = hasFrame ? err.message.replace(codeframeRE, "") : err.message;
  652. if (err.plugin) this.text(".plugin", `[plugin:${err.plugin}] `);
  653. this.text(".message-body", message.trim());
  654. const [file] = (err.loc?.file || err.id || "unknown file").split(`?`);
  655. if (err.loc) this.text(".file", `${file}:${err.loc.line}:${err.loc.column}`, links);
  656. else if (err.id) this.text(".file", file);
  657. if (hasFrame) this.text(".frame", err.frame.trim());
  658. this.text(".stack", err.stack, links);
  659. this.root.querySelector(".window").addEventListener("click", (e) => {
  660. e.stopPropagation();
  661. });
  662. this.addEventListener("click", () => {
  663. this.close();
  664. });
  665. this.closeOnEsc = (e) => {
  666. if (e.key === "Escape" || e.code === "Escape") this.close();
  667. };
  668. document.addEventListener("keydown", this.closeOnEsc);
  669. }
  670. text(selector, text, linkFiles = false) {
  671. const el = this.root.querySelector(selector);
  672. if (!linkFiles) el.textContent = text;
  673. else {
  674. let curIndex = 0;
  675. let match;
  676. fileRE.lastIndex = 0;
  677. while (match = fileRE.exec(text)) {
  678. const { 0: file, index } = match;
  679. const frag = text.slice(curIndex, index);
  680. el.appendChild(document.createTextNode(frag));
  681. const link = document.createElement("a");
  682. link.textContent = file;
  683. link.className = "file-link";
  684. link.onclick = () => {
  685. fetch(new URL(`${base$1}__open-in-editor?file=${encodeURIComponent(file)}`, import.meta.url));
  686. };
  687. el.appendChild(link);
  688. curIndex += frag.length + file.length;
  689. }
  690. if (curIndex < text.length) el.appendChild(document.createTextNode(text.slice(curIndex)));
  691. }
  692. }
  693. close() {
  694. this.parentNode?.removeChild(this);
  695. document.removeEventListener("keydown", this.closeOnEsc);
  696. }
  697. };
  698. const overlayId = "vite-error-overlay";
  699. const { customElements } = globalThis;
  700. if (customElements && !customElements.get(overlayId)) customElements.define(overlayId, ErrorOverlay);
  701. //#endregion
  702. //#region src/client/client.ts
  703. console.debug("[vite] connecting...");
  704. const importMetaUrl = new URL(import.meta.url);
  705. const serverHost = __SERVER_HOST__;
  706. const socketProtocol = __HMR_PROTOCOL__ || (importMetaUrl.protocol === "https:" ? "wss" : "ws");
  707. const hmrPort = __HMR_PORT__;
  708. const socketHost = `${__HMR_HOSTNAME__ || importMetaUrl.hostname}:${hmrPort || importMetaUrl.port}${__HMR_BASE__}`;
  709. const directSocketHost = __HMR_DIRECT_TARGET__;
  710. const base = __BASE__ || "/";
  711. const hmrTimeout = __HMR_TIMEOUT__;
  712. const wsToken = __WS_TOKEN__;
  713. const transport = normalizeModuleRunnerTransport((() => {
  714. let wsTransport = createWebSocketModuleRunnerTransport({
  715. createConnection: () => new WebSocket(`${socketProtocol}://${socketHost}?token=${wsToken}`, "vite-hmr"),
  716. pingInterval: hmrTimeout
  717. });
  718. return {
  719. async connect(handlers) {
  720. try {
  721. await wsTransport.connect(handlers);
  722. } catch (e) {
  723. if (!hmrPort) {
  724. wsTransport = createWebSocketModuleRunnerTransport({
  725. createConnection: () => new WebSocket(`${socketProtocol}://${directSocketHost}?token=${wsToken}`, "vite-hmr"),
  726. pingInterval: hmrTimeout
  727. });
  728. try {
  729. await wsTransport.connect(handlers);
  730. console.info("[vite] Direct websocket connection fallback. Check out https://vite.dev/config/server-options.html#server-hmr to remove the previous connection error.");
  731. } catch (e$1) {
  732. if (e$1 instanceof Error && e$1.message.includes("WebSocket closed without opened.")) {
  733. const currentScriptHostURL = new URL(import.meta.url);
  734. const currentScriptHost = currentScriptHostURL.host + currentScriptHostURL.pathname.replace(/@vite\/client$/, "");
  735. console.error(`[vite] failed to connect to websocket.
  736. your current setup:
  737. (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 .`);
  738. }
  739. }
  740. return;
  741. }
  742. console.error(`[vite] failed to connect to websocket (${e}). `);
  743. throw e;
  744. }
  745. },
  746. async disconnect() {
  747. await wsTransport.disconnect();
  748. },
  749. send(data) {
  750. wsTransport.send(data);
  751. }
  752. };
  753. })());
  754. let willUnload = false;
  755. if (typeof window !== "undefined") window.addEventListener?.("beforeunload", () => {
  756. willUnload = true;
  757. });
  758. function cleanUrl(pathname) {
  759. const url = new URL(pathname, "http://vite.dev");
  760. url.searchParams.delete("direct");
  761. return url.pathname + url.search;
  762. }
  763. let isFirstUpdate = true;
  764. const outdatedLinkTags = /* @__PURE__ */ new WeakSet();
  765. const debounceReload = (time) => {
  766. let timer;
  767. return () => {
  768. if (timer) {
  769. clearTimeout(timer);
  770. timer = null;
  771. }
  772. timer = setTimeout(() => {
  773. location.reload();
  774. }, time);
  775. };
  776. };
  777. const pageReload = debounceReload(20);
  778. const hmrClient = new HMRClient({
  779. error: (err) => console.error("[vite]", err),
  780. debug: (...msg) => console.debug("[vite]", ...msg)
  781. }, transport, async function importUpdatedModule({ acceptedPath, timestamp, explicitImportRequired, isWithinCircularImport }) {
  782. const [acceptedPathWithoutQuery, query] = acceptedPath.split(`?`);
  783. const importPromise = import(
  784. /* @vite-ignore */
  785. base + acceptedPathWithoutQuery.slice(1) + `?${explicitImportRequired ? "import&" : ""}t=${timestamp}${query ? `&${query}` : ""}`
  786. );
  787. if (isWithinCircularImport) importPromise.catch(() => {
  788. 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.`);
  789. pageReload();
  790. });
  791. return await importPromise;
  792. });
  793. transport.connect(createHMRHandler(handleMessage));
  794. async function handleMessage(payload) {
  795. switch (payload.type) {
  796. case "connected":
  797. console.debug(`[vite] connected.`);
  798. break;
  799. case "update":
  800. await hmrClient.notifyListeners("vite:beforeUpdate", payload);
  801. if (hasDocument) if (isFirstUpdate && hasErrorOverlay()) {
  802. location.reload();
  803. return;
  804. } else {
  805. if (enableOverlay) clearErrorOverlay();
  806. isFirstUpdate = false;
  807. }
  808. await Promise.all(payload.updates.map(async (update) => {
  809. if (update.type === "js-update") return hmrClient.queueUpdate(update);
  810. const { path, timestamp } = update;
  811. const searchUrl = cleanUrl(path);
  812. const el = Array.from(document.querySelectorAll("link")).find((e) => !outdatedLinkTags.has(e) && cleanUrl(e.href).includes(searchUrl));
  813. if (!el) return;
  814. const newPath = `${base}${searchUrl.slice(1)}${searchUrl.includes("?") ? "&" : "?"}t=${timestamp}`;
  815. return new Promise((resolve) => {
  816. const newLinkTag = el.cloneNode();
  817. newLinkTag.href = new URL(newPath, el.href).href;
  818. const removeOldEl = () => {
  819. el.remove();
  820. console.debug(`[vite] css hot updated: ${searchUrl}`);
  821. resolve();
  822. };
  823. newLinkTag.addEventListener("load", removeOldEl);
  824. newLinkTag.addEventListener("error", removeOldEl);
  825. outdatedLinkTags.add(el);
  826. el.after(newLinkTag);
  827. });
  828. }));
  829. await hmrClient.notifyListeners("vite:afterUpdate", payload);
  830. break;
  831. case "custom":
  832. await hmrClient.notifyListeners(payload.event, payload.data);
  833. if (payload.event === "vite:ws:disconnect") {
  834. if (hasDocument && !willUnload) {
  835. console.log(`[vite] server connection lost. Polling for restart...`);
  836. const socket = payload.data.webSocket;
  837. const url = new URL(socket.url);
  838. url.search = "";
  839. await waitForSuccessfulPing(url.href);
  840. location.reload();
  841. }
  842. }
  843. break;
  844. case "full-reload":
  845. await hmrClient.notifyListeners("vite:beforeFullReload", payload);
  846. if (hasDocument) if (payload.path && payload.path.endsWith(".html")) {
  847. const pagePath = decodeURI(location.pathname);
  848. const payloadPath = base + payload.path.slice(1);
  849. if (pagePath === payloadPath || payload.path === "/index.html" || pagePath.endsWith("/") && pagePath + "index.html" === payloadPath) pageReload();
  850. return;
  851. } else pageReload();
  852. break;
  853. case "prune":
  854. await hmrClient.notifyListeners("vite:beforePrune", payload);
  855. await hmrClient.prunePaths(payload.paths);
  856. break;
  857. case "error":
  858. await hmrClient.notifyListeners("vite:error", payload);
  859. if (hasDocument) {
  860. const err = payload.err;
  861. if (enableOverlay) createErrorOverlay(err);
  862. else console.error(`[vite] Internal Server Error\n${err.message}\n${err.stack}`);
  863. }
  864. break;
  865. case "ping": break;
  866. default: return payload;
  867. }
  868. }
  869. const enableOverlay = __HMR_ENABLE_OVERLAY__;
  870. const hasDocument = "document" in globalThis;
  871. function createErrorOverlay(err) {
  872. clearErrorOverlay();
  873. const { customElements: customElements$1 } = globalThis;
  874. if (customElements$1) {
  875. const ErrorOverlayConstructor = customElements$1.get(overlayId);
  876. document.body.appendChild(new ErrorOverlayConstructor(err));
  877. }
  878. }
  879. function clearErrorOverlay() {
  880. document.querySelectorAll(overlayId).forEach((n) => n.close());
  881. }
  882. function hasErrorOverlay() {
  883. return document.querySelectorAll(overlayId).length;
  884. }
  885. function waitForSuccessfulPing(socketUrl) {
  886. if (typeof SharedWorker === "undefined") {
  887. const visibilityManager = {
  888. currentState: document.visibilityState,
  889. listeners: /* @__PURE__ */ new Set()
  890. };
  891. const onVisibilityChange = () => {
  892. visibilityManager.currentState = document.visibilityState;
  893. for (const listener of visibilityManager.listeners) listener(visibilityManager.currentState);
  894. };
  895. document.addEventListener("visibilitychange", onVisibilityChange);
  896. return waitForSuccessfulPingInternal(socketUrl, visibilityManager);
  897. }
  898. const blob = new Blob([
  899. "\"use strict\";",
  900. `const waitForSuccessfulPingInternal = ${waitForSuccessfulPingInternal.toString()};`,
  901. `const fn = ${pingWorkerContentMain.toString()};`,
  902. `fn(${JSON.stringify(socketUrl)})`
  903. ], { type: "application/javascript" });
  904. const objURL = URL.createObjectURL(blob);
  905. const sharedWorker = new SharedWorker(objURL);
  906. return new Promise((resolve, reject) => {
  907. const onVisibilityChange = () => {
  908. sharedWorker.port.postMessage({ visibility: document.visibilityState });
  909. };
  910. document.addEventListener("visibilitychange", onVisibilityChange);
  911. sharedWorker.port.addEventListener("message", (event) => {
  912. document.removeEventListener("visibilitychange", onVisibilityChange);
  913. sharedWorker.port.close();
  914. const data = event.data;
  915. if (data.type === "error") {
  916. reject(data.error);
  917. return;
  918. }
  919. resolve();
  920. });
  921. onVisibilityChange();
  922. sharedWorker.port.start();
  923. });
  924. }
  925. function pingWorkerContentMain(socketUrl) {
  926. self.addEventListener("connect", (_event) => {
  927. const port = _event.ports[0];
  928. if (!socketUrl) {
  929. port.postMessage({
  930. type: "error",
  931. error: /* @__PURE__ */ new Error("socketUrl not found")
  932. });
  933. return;
  934. }
  935. const visibilityManager = {
  936. currentState: "visible",
  937. listeners: /* @__PURE__ */ new Set()
  938. };
  939. port.addEventListener("message", (event) => {
  940. const { visibility } = event.data;
  941. visibilityManager.currentState = visibility;
  942. console.debug("[vite] new window visibility", visibility);
  943. for (const listener of visibilityManager.listeners) listener(visibility);
  944. });
  945. port.start();
  946. console.debug("[vite] connected from window");
  947. waitForSuccessfulPingInternal(socketUrl, visibilityManager).then(() => {
  948. console.debug("[vite] ping successful");
  949. try {
  950. port.postMessage({ type: "success" });
  951. } catch (error) {
  952. port.postMessage({
  953. type: "error",
  954. error
  955. });
  956. }
  957. }, (error) => {
  958. console.debug("[vite] error happened", error);
  959. try {
  960. port.postMessage({
  961. type: "error",
  962. error
  963. });
  964. } catch (error$1) {
  965. port.postMessage({
  966. type: "error",
  967. error: error$1
  968. });
  969. }
  970. });
  971. });
  972. }
  973. async function waitForSuccessfulPingInternal(socketUrl, visibilityManager, ms = 1e3) {
  974. function wait(ms$1) {
  975. return new Promise((resolve) => setTimeout(resolve, ms$1));
  976. }
  977. async function ping() {
  978. try {
  979. const socket = new WebSocket(socketUrl, "vite-ping");
  980. return new Promise((resolve) => {
  981. function onOpen() {
  982. resolve(true);
  983. close();
  984. }
  985. function onError() {
  986. resolve(false);
  987. close();
  988. }
  989. function close() {
  990. socket.removeEventListener("open", onOpen);
  991. socket.removeEventListener("error", onError);
  992. socket.close();
  993. }
  994. socket.addEventListener("open", onOpen);
  995. socket.addEventListener("error", onError);
  996. });
  997. } catch {
  998. return false;
  999. }
  1000. }
  1001. function waitForWindowShow(visibilityManager$1) {
  1002. return new Promise((resolve) => {
  1003. const onChange = (newVisibility) => {
  1004. if (newVisibility === "visible") {
  1005. resolve();
  1006. visibilityManager$1.listeners.delete(onChange);
  1007. }
  1008. };
  1009. visibilityManager$1.listeners.add(onChange);
  1010. });
  1011. }
  1012. if (await ping()) return;
  1013. await wait(ms);
  1014. while (true) if (visibilityManager.currentState === "visible") {
  1015. if (await ping()) break;
  1016. await wait(ms);
  1017. } else await waitForWindowShow(visibilityManager);
  1018. }
  1019. const sheetsMap = /* @__PURE__ */ new Map();
  1020. if ("document" in globalThis) document.querySelectorAll("style[data-vite-dev-id]").forEach((el) => {
  1021. sheetsMap.set(el.getAttribute("data-vite-dev-id"), el);
  1022. });
  1023. let lastInsertedStyle;
  1024. function updateStyle(id, content) {
  1025. let style = sheetsMap.get(id);
  1026. if (!style) {
  1027. style = document.createElement("style");
  1028. style.setAttribute("type", "text/css");
  1029. style.setAttribute("data-vite-dev-id", id);
  1030. style.textContent = content;
  1031. if (cspNonce) style.setAttribute("nonce", cspNonce);
  1032. if (!lastInsertedStyle) {
  1033. document.head.appendChild(style);
  1034. setTimeout(() => {
  1035. lastInsertedStyle = void 0;
  1036. }, 0);
  1037. } else lastInsertedStyle.insertAdjacentElement("afterend", style);
  1038. lastInsertedStyle = style;
  1039. } else style.textContent = content;
  1040. sheetsMap.set(id, style);
  1041. }
  1042. function removeStyle(id) {
  1043. const style = sheetsMap.get(id);
  1044. if (style) {
  1045. document.head.removeChild(style);
  1046. sheetsMap.delete(id);
  1047. }
  1048. }
  1049. function createHotContext(ownerPath) {
  1050. return new HMRContext(hmrClient, ownerPath);
  1051. }
  1052. /**
  1053. * urls here are dynamic import() urls that couldn't be statically analyzed
  1054. */
  1055. function injectQuery(url, queryToInject) {
  1056. if (url[0] !== "." && url[0] !== "/") return url;
  1057. const pathname = url.replace(/[?#].*$/, "");
  1058. const { search, hash } = new URL(url, "http://vite.dev");
  1059. return `${pathname}?${queryToInject}${search ? `&` + search.slice(1) : ""}${hash || ""}`;
  1060. }
  1061. //#endregion
  1062. export { ErrorOverlay, createHotContext, injectQuery, removeStyle, updateStyle };