 85bf1341f3
			
		
	
	85bf1341f3
	
	
	
		
			
			Frontend Enhancements: - Complete React TypeScript frontend with modern UI components - Distributed workflows management interface with real-time updates - Socket.IO integration for live agent status monitoring - Agent management dashboard with cluster visualization - Project management interface with metrics and task tracking - Responsive design with proper error handling and loading states Backend Infrastructure: - Distributed coordinator for multi-agent workflow orchestration - Cluster management API with comprehensive agent operations - Enhanced database models for agents and projects - Project service for filesystem-based project discovery - Performance monitoring and metrics collection - Comprehensive API documentation and error handling Documentation: - Complete distributed development guide (README_DISTRIBUTED.md) - Comprehensive development report with architecture insights - System configuration templates and deployment guides The platform now provides a complete web interface for managing the distributed AI cluster with real-time monitoring, workflow orchestration, and agent coordination capabilities. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
		
			
				
	
	
		
			1067 lines
		
	
	
		
			44 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			1067 lines
		
	
	
		
			44 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| const VALID_ID_PREFIX = "/@id/", NULL_BYTE_PLACEHOLDER = "__x00__";
 | |
| let SOURCEMAPPING_URL = "sourceMa";
 | |
| SOURCEMAPPING_URL += "ppingURL";
 | |
| const isWindows = typeof process < "u" && process.platform === "win32";
 | |
| function wrapId(id) {
 | |
|   return id.startsWith(VALID_ID_PREFIX) ? id : VALID_ID_PREFIX + id.replace("\0", NULL_BYTE_PLACEHOLDER);
 | |
| }
 | |
| function unwrapId(id) {
 | |
|   return id.startsWith(VALID_ID_PREFIX) ? id.slice(VALID_ID_PREFIX.length).replace(NULL_BYTE_PLACEHOLDER, "\0") : id;
 | |
| }
 | |
| const windowsSlashRE = /\\/g;
 | |
| function slash(p) {
 | |
|   return p.replace(windowsSlashRE, "/");
 | |
| }
 | |
| const postfixRE = /[?#].*$/;
 | |
| function cleanUrl(url) {
 | |
|   return url.replace(postfixRE, "");
 | |
| }
 | |
| function isPrimitive(value) {
 | |
|   return !value || typeof value != "object" && typeof value != "function";
 | |
| }
 | |
| function withTrailingSlash(path) {
 | |
|   return path[path.length - 1] !== "/" ? `${path}/` : path;
 | |
| }
 | |
| const AsyncFunction = async function() {
 | |
| }.constructor, _DRIVE_LETTER_START_RE = /^[A-Za-z]:\//;
 | |
| function normalizeWindowsPath(input = "") {
 | |
|   return input && input.replace(/\\/g, "/").replace(_DRIVE_LETTER_START_RE, (r) => r.toUpperCase());
 | |
| }
 | |
| const _IS_ABSOLUTE_RE = /^[/\\](?![/\\])|^[/\\]{2}(?!\.)|^[A-Za-z]:[/\\]/, _DRIVE_LETTER_RE = /^[A-Za-z]:$/;
 | |
| function cwd() {
 | |
|   return typeof process < "u" && typeof process.cwd == "function" ? process.cwd().replace(/\\/g, "/") : "/";
 | |
| }
 | |
| const resolve = function(...arguments_) {
 | |
|   arguments_ = arguments_.map((argument) => normalizeWindowsPath(argument));
 | |
|   let resolvedPath = "", resolvedAbsolute = !1;
 | |
|   for (let index = arguments_.length - 1; index >= -1 && !resolvedAbsolute; index--) {
 | |
|     const path = index >= 0 ? arguments_[index] : cwd();
 | |
|     !path || path.length === 0 || (resolvedPath = `${path}/${resolvedPath}`, resolvedAbsolute = isAbsolute(path));
 | |
|   }
 | |
|   return resolvedPath = normalizeString(resolvedPath, !resolvedAbsolute), resolvedAbsolute && !isAbsolute(resolvedPath) ? `/${resolvedPath}` : resolvedPath.length > 0 ? resolvedPath : ".";
 | |
| };
 | |
| function normalizeString(path, allowAboveRoot) {
 | |
|   let res = "", lastSegmentLength = 0, lastSlash = -1, dots = 0, char = null;
 | |
|   for (let index = 0; index <= path.length; ++index) {
 | |
|     if (index < path.length)
 | |
|       char = path[index];
 | |
|     else {
 | |
|       if (char === "/")
 | |
|         break;
 | |
|       char = "/";
 | |
|     }
 | |
|     if (char === "/") {
 | |
|       if (!(lastSlash === index - 1 || dots === 1)) if (dots === 2) {
 | |
|         if (res.length < 2 || lastSegmentLength !== 2 || res[res.length - 1] !== "." || res[res.length - 2] !== ".") {
 | |
|           if (res.length > 2) {
 | |
|             const lastSlashIndex = res.lastIndexOf("/");
 | |
|             lastSlashIndex === -1 ? (res = "", lastSegmentLength = 0) : (res = res.slice(0, lastSlashIndex), lastSegmentLength = res.length - 1 - res.lastIndexOf("/")), lastSlash = index, dots = 0;
 | |
|             continue;
 | |
|           } else if (res.length > 0) {
 | |
|             res = "", lastSegmentLength = 0, lastSlash = index, dots = 0;
 | |
|             continue;
 | |
|           }
 | |
|         }
 | |
|         allowAboveRoot && (res += res.length > 0 ? "/.." : "..", lastSegmentLength = 2);
 | |
|       } else
 | |
|         res.length > 0 ? res += `/${path.slice(lastSlash + 1, index)}` : res = path.slice(lastSlash + 1, index), lastSegmentLength = index - lastSlash - 1;
 | |
|       lastSlash = index, dots = 0;
 | |
|     } else char === "." && dots !== -1 ? ++dots : dots = -1;
 | |
|   }
 | |
|   return res;
 | |
| }
 | |
| const isAbsolute = function(p) {
 | |
|   return _IS_ABSOLUTE_RE.test(p);
 | |
| }, dirname = function(p) {
 | |
|   const segments = normalizeWindowsPath(p).replace(/\/$/, "").split("/").slice(0, -1);
 | |
|   return segments.length === 1 && _DRIVE_LETTER_RE.test(segments[0]) && (segments[0] += "/"), segments.join("/") || (isAbsolute(p) ? "/" : ".");
 | |
| }, decodeBase64 = typeof atob < "u" ? atob : (str) => Buffer.from(str, "base64").toString("utf-8"), CHAR_FORWARD_SLASH = 47, CHAR_BACKWARD_SLASH = 92, percentRegEx = /%/g, backslashRegEx = /\\/g, newlineRegEx = /\n/g, carriageReturnRegEx = /\r/g, tabRegEx = /\t/g, questionRegex = /\?/g, hashRegex = /#/g;
 | |
| function encodePathChars(filepath) {
 | |
|   return filepath.indexOf("%") !== -1 && (filepath = filepath.replace(percentRegEx, "%25")), !isWindows && filepath.indexOf("\\") !== -1 && (filepath = filepath.replace(backslashRegEx, "%5C")), filepath.indexOf(`
 | |
| `) !== -1 && (filepath = filepath.replace(newlineRegEx, "%0A")), filepath.indexOf("\r") !== -1 && (filepath = filepath.replace(carriageReturnRegEx, "%0D")), filepath.indexOf("	") !== -1 && (filepath = filepath.replace(tabRegEx, "%09")), filepath;
 | |
| }
 | |
| const posixDirname = dirname, posixResolve = resolve;
 | |
| function posixPathToFileHref(posixPath) {
 | |
|   let resolved = posixResolve(posixPath);
 | |
|   const filePathLast = posixPath.charCodeAt(posixPath.length - 1);
 | |
|   return (filePathLast === CHAR_FORWARD_SLASH || isWindows && filePathLast === CHAR_BACKWARD_SLASH) && resolved[resolved.length - 1] !== "/" && (resolved += "/"), resolved = encodePathChars(resolved), resolved.indexOf("?") !== -1 && (resolved = resolved.replace(questionRegex, "%3F")), resolved.indexOf("#") !== -1 && (resolved = resolved.replace(hashRegex, "%23")), new URL(`file://${resolved}`).href;
 | |
| }
 | |
| function toWindowsPath(path) {
 | |
|   return path.replace(/\//g, "\\");
 | |
| }
 | |
| const comma = 44, chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", intToChar = new Uint8Array(64), charToInt = new Uint8Array(128);
 | |
| for (let i = 0; i < chars.length; i++) {
 | |
|   const c = chars.charCodeAt(i);
 | |
|   intToChar[i] = c, charToInt[c] = i;
 | |
| }
 | |
| function decodeInteger(reader, relative) {
 | |
|   let value = 0, shift = 0, integer = 0;
 | |
|   do {
 | |
|     const c = reader.next();
 | |
|     integer = charToInt[c], value |= (integer & 31) << shift, shift += 5;
 | |
|   } while (integer & 32);
 | |
|   const shouldNegate = value & 1;
 | |
|   return value >>>= 1, shouldNegate && (value = -2147483648 | -value), relative + value;
 | |
| }
 | |
| function hasMoreVlq(reader, max) {
 | |
|   return reader.pos >= max ? !1 : reader.peek() !== comma;
 | |
| }
 | |
| class StringReader {
 | |
|   constructor(buffer) {
 | |
|     this.pos = 0, this.buffer = buffer;
 | |
|   }
 | |
|   next() {
 | |
|     return this.buffer.charCodeAt(this.pos++);
 | |
|   }
 | |
|   peek() {
 | |
|     return this.buffer.charCodeAt(this.pos);
 | |
|   }
 | |
|   indexOf(char) {
 | |
|     const { buffer, pos } = this, idx = buffer.indexOf(char, pos);
 | |
|     return idx === -1 ? buffer.length : idx;
 | |
|   }
 | |
| }
 | |
| function decode(mappings) {
 | |
|   const { length } = mappings, reader = new StringReader(mappings), decoded = [];
 | |
|   let genColumn = 0, sourcesIndex = 0, sourceLine = 0, sourceColumn = 0, namesIndex = 0;
 | |
|   do {
 | |
|     const semi = reader.indexOf(";"), line = [];
 | |
|     let sorted = !0, lastCol = 0;
 | |
|     for (genColumn = 0; reader.pos < semi; ) {
 | |
|       let seg;
 | |
|       genColumn = decodeInteger(reader, genColumn), genColumn < lastCol && (sorted = !1), lastCol = genColumn, hasMoreVlq(reader, semi) ? (sourcesIndex = decodeInteger(reader, sourcesIndex), sourceLine = decodeInteger(reader, sourceLine), sourceColumn = decodeInteger(reader, sourceColumn), hasMoreVlq(reader, semi) ? (namesIndex = decodeInteger(reader, namesIndex), seg = [genColumn, sourcesIndex, sourceLine, sourceColumn, namesIndex]) : seg = [genColumn, sourcesIndex, sourceLine, sourceColumn]) : seg = [genColumn], line.push(seg), reader.pos++;
 | |
|     }
 | |
|     sorted || sort(line), decoded.push(line), reader.pos = semi + 1;
 | |
|   } while (reader.pos <= length);
 | |
|   return decoded;
 | |
| }
 | |
| function sort(line) {
 | |
|   line.sort(sortComparator);
 | |
| }
 | |
| function sortComparator(a, b) {
 | |
|   return a[0] - b[0];
 | |
| }
 | |
| const COLUMN = 0, SOURCES_INDEX = 1, SOURCE_LINE = 2, SOURCE_COLUMN = 3, NAMES_INDEX = 4;
 | |
| let found = !1;
 | |
| function binarySearch(haystack, needle, low, high) {
 | |
|   for (; low <= high; ) {
 | |
|     const mid = low + (high - low >> 1), cmp = haystack[mid][COLUMN] - needle;
 | |
|     if (cmp === 0)
 | |
|       return found = !0, mid;
 | |
|     cmp < 0 ? low = mid + 1 : high = mid - 1;
 | |
|   }
 | |
|   return found = !1, low - 1;
 | |
| }
 | |
| function upperBound(haystack, needle, index) {
 | |
|   for (let i = index + 1; i < haystack.length && haystack[i][COLUMN] === needle; index = i++)
 | |
|     ;
 | |
|   return index;
 | |
| }
 | |
| function lowerBound(haystack, needle, index) {
 | |
|   for (let i = index - 1; i >= 0 && haystack[i][COLUMN] === needle; index = i--)
 | |
|     ;
 | |
|   return index;
 | |
| }
 | |
| function memoizedBinarySearch(haystack, needle, state, key) {
 | |
|   const { lastKey, lastNeedle, lastIndex } = state;
 | |
|   let low = 0, high = haystack.length - 1;
 | |
|   if (key === lastKey) {
 | |
|     if (needle === lastNeedle)
 | |
|       return found = lastIndex !== -1 && haystack[lastIndex][COLUMN] === needle, lastIndex;
 | |
|     needle >= lastNeedle ? low = lastIndex === -1 ? 0 : lastIndex : high = lastIndex;
 | |
|   }
 | |
|   return state.lastKey = key, state.lastNeedle = needle, state.lastIndex = binarySearch(haystack, needle, low, high);
 | |
| }
 | |
| const LINE_GTR_ZERO = "`line` must be greater than 0 (lines start at line 1)", COL_GTR_EQ_ZERO = "`column` must be greater than or equal to 0 (columns start at column 0)", LEAST_UPPER_BOUND = -1, GREATEST_LOWER_BOUND = 1;
 | |
| function cast(map) {
 | |
|   return map;
 | |
| }
 | |
| function decodedMappings(map) {
 | |
|   var _a;
 | |
|   return (_a = map)._decoded || (_a._decoded = decode(map._encoded));
 | |
| }
 | |
| function originalPositionFor(map, needle) {
 | |
|   let { line, column, bias } = needle;
 | |
|   if (line--, line < 0)
 | |
|     throw new Error(LINE_GTR_ZERO);
 | |
|   if (column < 0)
 | |
|     throw new Error(COL_GTR_EQ_ZERO);
 | |
|   const decoded = decodedMappings(map);
 | |
|   if (line >= decoded.length)
 | |
|     return OMapping(null, null, null, null);
 | |
|   const segments = decoded[line], index = traceSegmentInternal(segments, map._decodedMemo, line, column, bias || GREATEST_LOWER_BOUND);
 | |
|   if (index === -1)
 | |
|     return OMapping(null, null, null, null);
 | |
|   const segment = segments[index];
 | |
|   if (segment.length === 1)
 | |
|     return OMapping(null, null, null, null);
 | |
|   const { names, resolvedSources } = map;
 | |
|   return OMapping(resolvedSources[segment[SOURCES_INDEX]], segment[SOURCE_LINE] + 1, segment[SOURCE_COLUMN], segment.length === 5 ? names[segment[NAMES_INDEX]] : null);
 | |
| }
 | |
| function OMapping(source, line, column, name) {
 | |
|   return { source, line, column, name };
 | |
| }
 | |
| function traceSegmentInternal(segments, memo, line, column, bias) {
 | |
|   let index = memoizedBinarySearch(segments, column, memo, line);
 | |
|   return found ? index = (bias === LEAST_UPPER_BOUND ? upperBound : lowerBound)(segments, column, index) : bias === LEAST_UPPER_BOUND && index++, index === -1 || index === segments.length ? -1 : index;
 | |
| }
 | |
| class DecodedMap {
 | |
|   constructor(map, from) {
 | |
|     this.map = map;
 | |
|     const { mappings, names, sources } = map;
 | |
|     this.version = map.version, this.names = names || [], this._encoded = mappings || "", this._decodedMemo = memoizedState(), this.url = from, this.resolvedSources = (sources || []).map(
 | |
|       (s) => posixResolve(s || "", from)
 | |
|     );
 | |
|   }
 | |
|   _encoded;
 | |
|   _decoded;
 | |
|   _decodedMemo;
 | |
|   url;
 | |
|   version;
 | |
|   names = [];
 | |
|   resolvedSources;
 | |
| }
 | |
| function memoizedState() {
 | |
|   return {
 | |
|     lastKey: -1,
 | |
|     lastNeedle: -1,
 | |
|     lastIndex: -1
 | |
|   };
 | |
| }
 | |
| function getOriginalPosition(map, needle) {
 | |
|   const result = originalPositionFor(map, needle);
 | |
|   return result.column == null ? null : result;
 | |
| }
 | |
| const VITE_RUNTIME_SOURCEMAPPING_REGEXP = new RegExp(
 | |
|   `//# ${SOURCEMAPPING_URL}=data:application/json;base64,(.+)`
 | |
| );
 | |
| class ModuleCacheMap extends Map {
 | |
|   root;
 | |
|   constructor(root, entries) {
 | |
|     super(entries), this.root = withTrailingSlash(root);
 | |
|   }
 | |
|   normalize(fsPath) {
 | |
|     return normalizeModuleId(fsPath, this.root);
 | |
|   }
 | |
|   /**
 | |
|    * Assign partial data to the map
 | |
|    */
 | |
|   update(fsPath, mod) {
 | |
|     return fsPath = this.normalize(fsPath), super.has(fsPath) ? Object.assign(super.get(fsPath), mod) : this.setByModuleId(fsPath, mod), this;
 | |
|   }
 | |
|   setByModuleId(modulePath, mod) {
 | |
|     return super.set(modulePath, mod);
 | |
|   }
 | |
|   set(fsPath, mod) {
 | |
|     return this.setByModuleId(this.normalize(fsPath), mod);
 | |
|   }
 | |
|   getByModuleId(modulePath) {
 | |
|     super.has(modulePath) || this.setByModuleId(modulePath, {});
 | |
|     const mod = super.get(modulePath);
 | |
|     return mod.imports || Object.assign(mod, {
 | |
|       imports: /* @__PURE__ */ new Set(),
 | |
|       importers: /* @__PURE__ */ new Set()
 | |
|     }), mod;
 | |
|   }
 | |
|   get(fsPath) {
 | |
|     return this.getByModuleId(this.normalize(fsPath));
 | |
|   }
 | |
|   deleteByModuleId(modulePath) {
 | |
|     return super.delete(modulePath);
 | |
|   }
 | |
|   delete(fsPath) {
 | |
|     return this.deleteByModuleId(this.normalize(fsPath));
 | |
|   }
 | |
|   invalidate(id) {
 | |
|     const module = this.get(id);
 | |
|     module.evaluated = !1, module.meta = void 0, module.map = void 0, module.promise = void 0, module.exports = void 0, module.imports?.clear();
 | |
|   }
 | |
|   isImported({
 | |
|     importedId,
 | |
|     importedBy
 | |
|   }, seen = /* @__PURE__ */ new Set()) {
 | |
|     if (importedId = this.normalize(importedId), importedBy = this.normalize(importedBy), importedBy === importedId) return !0;
 | |
|     if (seen.has(importedId)) return !1;
 | |
|     seen.add(importedId);
 | |
|     const importers = this.getByModuleId(importedId)?.importers;
 | |
|     if (!importers) return !1;
 | |
|     if (importers.has(importedBy)) return !0;
 | |
|     for (const importer of importers)
 | |
|       if (this.isImported({
 | |
|         importedBy,
 | |
|         importedId: importer
 | |
|       }))
 | |
|         return !0;
 | |
|     return !1;
 | |
|   }
 | |
|   /**
 | |
|    * Invalidate modules that dependent on the given modules, up to the main entry
 | |
|    */
 | |
|   invalidateDepTree(ids, invalidated = /* @__PURE__ */ new Set()) {
 | |
|     for (const _id of ids) {
 | |
|       const id = this.normalize(_id);
 | |
|       if (invalidated.has(id)) continue;
 | |
|       invalidated.add(id);
 | |
|       const mod = super.get(id);
 | |
|       mod?.importers && this.invalidateDepTree(mod.importers, invalidated), super.delete(id);
 | |
|     }
 | |
|     return invalidated;
 | |
|   }
 | |
|   /**
 | |
|    * Invalidate dependency modules of the given modules, down to the bottom-level dependencies
 | |
|    */
 | |
|   invalidateSubDepTree(ids, invalidated = /* @__PURE__ */ new Set()) {
 | |
|     for (const _id of ids) {
 | |
|       const id = this.normalize(_id);
 | |
|       if (invalidated.has(id)) continue;
 | |
|       invalidated.add(id);
 | |
|       const subIds = Array.from(super.entries()).filter(([, mod]) => mod.importers?.has(id)).map(([key]) => key);
 | |
|       subIds.length && this.invalidateSubDepTree(subIds, invalidated), super.delete(id);
 | |
|     }
 | |
|     return invalidated;
 | |
|   }
 | |
|   getSourceMap(moduleId) {
 | |
|     const mod = this.get(moduleId);
 | |
|     if (mod.map) return mod.map;
 | |
|     if (!mod.meta || !("code" in mod.meta)) return null;
 | |
|     const mapString = VITE_RUNTIME_SOURCEMAPPING_REGEXP.exec(mod.meta.code)?.[1];
 | |
|     if (!mapString) return null;
 | |
|     const baseFile = mod.meta.file || moduleId.split("?")[0];
 | |
|     return mod.map = new DecodedMap(JSON.parse(decodeBase64(mapString)), baseFile), mod.map;
 | |
|   }
 | |
| }
 | |
| const prefixedBuiltins = /* @__PURE__ */ new Set(["node:test"]);
 | |
| function normalizeModuleId(file, root) {
 | |
|   if (prefixedBuiltins.has(file)) return file;
 | |
|   let unixFile = slash(file).replace(/^\/@fs\//, isWindows ? "" : "/").replace(/^node:/, "").replace(/^\/+/, "/");
 | |
|   return unixFile.startsWith(root) && (unixFile = unixFile.slice(root.length - 1)), unixFile.replace(/^file:\//, "/");
 | |
| }
 | |
| class HMRContext {
 | |
|   constructor(hmrClient, ownerPath) {
 | |
|     this.hmrClient = hmrClient, this.ownerPath = ownerPath, hmrClient.dataMap.has(ownerPath) || hmrClient.dataMap.set(ownerPath, {});
 | |
|     const mod = hmrClient.hotModulesMap.get(ownerPath);
 | |
|     mod && (mod.callbacks = []);
 | |
|     const staleListeners = hmrClient.ctxToListenersMap.get(ownerPath);
 | |
|     if (staleListeners)
 | |
|       for (const [event, staleFns] of staleListeners) {
 | |
|         const listeners = hmrClient.customListenersMap.get(event);
 | |
|         listeners && hmrClient.customListenersMap.set(
 | |
|           event,
 | |
|           listeners.filter((l) => !staleFns.includes(l))
 | |
|         );
 | |
|       }
 | |
|     this.newListeners = /* @__PURE__ */ new Map(), hmrClient.ctxToListenersMap.set(ownerPath, this.newListeners);
 | |
|   }
 | |
|   newListeners;
 | |
|   get data() {
 | |
|     return this.hmrClient.dataMap.get(this.ownerPath);
 | |
|   }
 | |
|   accept(deps, callback) {
 | |
|     if (typeof deps == "function" || !deps)
 | |
|       this.acceptDeps([this.ownerPath], ([mod]) => deps?.(mod));
 | |
|     else if (typeof deps == "string")
 | |
|       this.acceptDeps([deps], ([mod]) => callback?.(mod));
 | |
|     else if (Array.isArray(deps))
 | |
|       this.acceptDeps(deps, callback);
 | |
|     else
 | |
|       throw new Error("invalid hot.accept() usage.");
 | |
|   }
 | |
|   // export names (first arg) are irrelevant on the client side, they're
 | |
|   // extracted in the server for propagation
 | |
|   acceptExports(_, callback) {
 | |
|     this.acceptDeps([this.ownerPath], ([mod]) => callback?.(mod));
 | |
|   }
 | |
|   dispose(cb) {
 | |
|     this.hmrClient.disposeMap.set(this.ownerPath, cb);
 | |
|   }
 | |
|   prune(cb) {
 | |
|     this.hmrClient.pruneMap.set(this.ownerPath, cb);
 | |
|   }
 | |
|   // Kept for backward compatibility (#11036)
 | |
|   // eslint-disable-next-line @typescript-eslint/no-empty-function
 | |
|   decline() {
 | |
|   }
 | |
|   invalidate(message) {
 | |
|     this.hmrClient.notifyListeners("vite:invalidate", {
 | |
|       path: this.ownerPath,
 | |
|       message
 | |
|     }), this.send("vite:invalidate", { path: this.ownerPath, message }), this.hmrClient.logger.debug(
 | |
|       `[vite] invalidate ${this.ownerPath}${message ? `: ${message}` : ""}`
 | |
|     );
 | |
|   }
 | |
|   on(event, cb) {
 | |
|     const addToMap = (map) => {
 | |
|       const existing = map.get(event) || [];
 | |
|       existing.push(cb), map.set(event, existing);
 | |
|     };
 | |
|     addToMap(this.hmrClient.customListenersMap), addToMap(this.newListeners);
 | |
|   }
 | |
|   off(event, cb) {
 | |
|     const removeFromMap = (map) => {
 | |
|       const existing = map.get(event);
 | |
|       if (existing === void 0)
 | |
|         return;
 | |
|       const pruned = existing.filter((l) => l !== cb);
 | |
|       if (pruned.length === 0) {
 | |
|         map.delete(event);
 | |
|         return;
 | |
|       }
 | |
|       map.set(event, pruned);
 | |
|     };
 | |
|     removeFromMap(this.hmrClient.customListenersMap), removeFromMap(this.newListeners);
 | |
|   }
 | |
|   send(event, data) {
 | |
|     this.hmrClient.messenger.send(
 | |
|       JSON.stringify({ type: "custom", event, data })
 | |
|     );
 | |
|   }
 | |
|   acceptDeps(deps, callback = () => {
 | |
|   }) {
 | |
|     const mod = this.hmrClient.hotModulesMap.get(this.ownerPath) || {
 | |
|       id: this.ownerPath,
 | |
|       callbacks: []
 | |
|     };
 | |
|     mod.callbacks.push({
 | |
|       deps,
 | |
|       fn: callback
 | |
|     }), this.hmrClient.hotModulesMap.set(this.ownerPath, mod);
 | |
|   }
 | |
| }
 | |
| class HMRMessenger {
 | |
|   constructor(connection) {
 | |
|     this.connection = connection;
 | |
|   }
 | |
|   queue = [];
 | |
|   send(message) {
 | |
|     this.queue.push(message), this.flush();
 | |
|   }
 | |
|   flush() {
 | |
|     this.connection.isReady() && (this.queue.forEach((msg) => this.connection.send(msg)), this.queue = []);
 | |
|   }
 | |
| }
 | |
| class HMRClient {
 | |
|   constructor(logger, connection, importUpdatedModule) {
 | |
|     this.logger = logger, this.importUpdatedModule = importUpdatedModule, this.messenger = new HMRMessenger(connection);
 | |
|   }
 | |
|   hotModulesMap = /* @__PURE__ */ new Map();
 | |
|   disposeMap = /* @__PURE__ */ new Map();
 | |
|   pruneMap = /* @__PURE__ */ new Map();
 | |
|   dataMap = /* @__PURE__ */ new Map();
 | |
|   customListenersMap = /* @__PURE__ */ new Map();
 | |
|   ctxToListenersMap = /* @__PURE__ */ new Map();
 | |
|   messenger;
 | |
|   async notifyListeners(event, data) {
 | |
|     const cbs = this.customListenersMap.get(event);
 | |
|     cbs && await Promise.allSettled(cbs.map((cb) => cb(data)));
 | |
|   }
 | |
|   clear() {
 | |
|     this.hotModulesMap.clear(), this.disposeMap.clear(), this.pruneMap.clear(), this.dataMap.clear(), this.customListenersMap.clear(), this.ctxToListenersMap.clear();
 | |
|   }
 | |
|   // After an HMR update, some modules are no longer imported on the page
 | |
|   // but they may have left behind side effects that need to be cleaned up
 | |
|   // (.e.g style injections)
 | |
|   async prunePaths(paths) {
 | |
|     await Promise.all(
 | |
|       paths.map((path) => {
 | |
|         const disposer = this.disposeMap.get(path);
 | |
|         if (disposer) return disposer(this.dataMap.get(path));
 | |
|       })
 | |
|     ), paths.forEach((path) => {
 | |
|       const fn = this.pruneMap.get(path);
 | |
|       fn && fn(this.dataMap.get(path));
 | |
|     });
 | |
|   }
 | |
|   warnFailedUpdate(err, path) {
 | |
|     err.message.includes("fetch") || this.logger.error(err), this.logger.error(
 | |
|       `[hmr] Failed to reload ${path}. This could be due to syntax errors or importing non-existent modules. (see errors above)`
 | |
|     );
 | |
|   }
 | |
|   updateQueue = [];
 | |
|   pendingUpdateQueue = !1;
 | |
|   /**
 | |
|    * buffer multiple hot updates triggered by the same src change
 | |
|    * so that they are invoked in the same order they were sent.
 | |
|    * (otherwise the order may be inconsistent because of the http request round trip)
 | |
|    */
 | |
|   async queueUpdate(payload) {
 | |
|     if (this.updateQueue.push(this.fetchUpdate(payload)), !this.pendingUpdateQueue) {
 | |
|       this.pendingUpdateQueue = !0, await Promise.resolve(), this.pendingUpdateQueue = !1;
 | |
|       const loading = [...this.updateQueue];
 | |
|       this.updateQueue = [], (await Promise.all(loading)).forEach((fn) => fn && fn());
 | |
|     }
 | |
|   }
 | |
|   async fetchUpdate(update) {
 | |
|     const { path, acceptedPath } = update, mod = this.hotModulesMap.get(path);
 | |
|     if (!mod)
 | |
|       return;
 | |
|     let fetchedModule;
 | |
|     const isSelfUpdate = path === acceptedPath, qualifiedCallbacks = mod.callbacks.filter(
 | |
|       ({ deps }) => deps.includes(acceptedPath)
 | |
|     );
 | |
|     if (isSelfUpdate || qualifiedCallbacks.length > 0) {
 | |
|       const disposer = this.disposeMap.get(acceptedPath);
 | |
|       disposer && await disposer(this.dataMap.get(acceptedPath));
 | |
|       try {
 | |
|         fetchedModule = await this.importUpdatedModule(update);
 | |
|       } catch (e) {
 | |
|         this.warnFailedUpdate(e, acceptedPath);
 | |
|       }
 | |
|     }
 | |
|     return () => {
 | |
|       for (const { deps, fn } of qualifiedCallbacks)
 | |
|         fn(
 | |
|           deps.map((dep) => dep === acceptedPath ? fetchedModule : void 0)
 | |
|         );
 | |
|       const loggedPath = isSelfUpdate ? path : `${acceptedPath} via ${path}`;
 | |
|       this.logger.debug(`[vite] hot updated: ${loggedPath}`);
 | |
|     };
 | |
|   }
 | |
| }
 | |
| function analyzeImportedModDifference(mod, rawId, moduleType, metadata) {
 | |
|   if (!metadata?.isDynamicImport && metadata?.importedNames?.length) {
 | |
|     const missingBindings = metadata.importedNames.filter((s) => !(s in mod));
 | |
|     if (missingBindings.length) {
 | |
|       const lastBinding = missingBindings[missingBindings.length - 1];
 | |
|       throw moduleType === "module" ? new SyntaxError(
 | |
|         `[vite] The requested module '${rawId}' does not provide an export named '${lastBinding}'`
 | |
|       ) : new SyntaxError(`[vite] Named export '${lastBinding}' not found. The requested module '${rawId}' is a CommonJS module, which may not support all module.exports as named exports.
 | |
| CommonJS modules can always be imported via the default export, for example using:
 | |
| 
 | |
| import pkg from '${rawId}';
 | |
| const {${missingBindings.join(", ")}} = pkg;
 | |
| `);
 | |
|     }
 | |
|   }
 | |
| }
 | |
| const ssrModuleExportsKey = "__vite_ssr_exports__", ssrImportKey = "__vite_ssr_import__", ssrDynamicImportKey = "__vite_ssr_dynamic_import__", ssrExportAllKey = "__vite_ssr_exportAll__", ssrImportMetaKey = "__vite_ssr_import_meta__", noop = () => {
 | |
| }, silentConsole = {
 | |
|   debug: noop,
 | |
|   error: noop
 | |
| };
 | |
| function createHMRHandler(runtime) {
 | |
|   const queue = new Queue();
 | |
|   return (payload) => queue.enqueue(() => handleHMRPayload(runtime, payload));
 | |
| }
 | |
| async function handleHMRPayload(runtime, payload) {
 | |
|   const hmrClient = runtime.hmrClient;
 | |
|   if (!(!hmrClient || runtime.isDestroyed()))
 | |
|     switch (payload.type) {
 | |
|       case "connected":
 | |
|         hmrClient.logger.debug("[vite] connected."), hmrClient.messenger.flush();
 | |
|         break;
 | |
|       case "update":
 | |
|         await hmrClient.notifyListeners("vite:beforeUpdate", payload), await Promise.all(
 | |
|           payload.updates.map(async (update) => {
 | |
|             if (update.type === "js-update")
 | |
|               return update.acceptedPath = unwrapId(update.acceptedPath), update.path = unwrapId(update.path), hmrClient.queueUpdate(update);
 | |
|             hmrClient.logger.error(
 | |
|               "[vite] css hmr is not supported in runtime mode."
 | |
|             );
 | |
|           })
 | |
|         ), await hmrClient.notifyListeners("vite:afterUpdate", payload);
 | |
|         break;
 | |
|       case "custom": {
 | |
|         await hmrClient.notifyListeners(payload.event, payload.data);
 | |
|         break;
 | |
|       }
 | |
|       case "full-reload": {
 | |
|         const { triggeredBy } = payload, clearEntrypoints = triggeredBy ? [...runtime.entrypoints].filter(
 | |
|           (entrypoint) => runtime.moduleCache.isImported({
 | |
|             importedId: triggeredBy,
 | |
|             importedBy: entrypoint
 | |
|           })
 | |
|         ) : [...runtime.entrypoints];
 | |
|         if (!clearEntrypoints.length) break;
 | |
|         hmrClient.logger.debug("[vite] program reload"), await hmrClient.notifyListeners("vite:beforeFullReload", payload), runtime.moduleCache.clear();
 | |
|         for (const id of clearEntrypoints)
 | |
|           await runtime.executeUrl(id);
 | |
|         break;
 | |
|       }
 | |
|       case "prune":
 | |
|         await hmrClient.notifyListeners("vite:beforePrune", payload), await hmrClient.prunePaths(payload.paths);
 | |
|         break;
 | |
|       case "error": {
 | |
|         await hmrClient.notifyListeners("vite:error", payload);
 | |
|         const err = payload.err;
 | |
|         hmrClient.logger.error(
 | |
|           `[vite] Internal Server Error
 | |
| ${err.message}
 | |
| ${err.stack}`
 | |
|         );
 | |
|         break;
 | |
|       }
 | |
|       default:
 | |
|         return payload;
 | |
|     }
 | |
| }
 | |
| class Queue {
 | |
|   queue = [];
 | |
|   pending = !1;
 | |
|   enqueue(promise) {
 | |
|     return new Promise((resolve2, reject) => {
 | |
|       this.queue.push({
 | |
|         promise,
 | |
|         resolve: resolve2,
 | |
|         reject
 | |
|       }), this.dequeue();
 | |
|     });
 | |
|   }
 | |
|   dequeue() {
 | |
|     if (this.pending)
 | |
|       return !1;
 | |
|     const item = this.queue.shift();
 | |
|     return item ? (this.pending = !0, item.promise().then(item.resolve).catch(item.reject).finally(() => {
 | |
|       this.pending = !1, this.dequeue();
 | |
|     }), !0) : !1;
 | |
|   }
 | |
| }
 | |
| const sourceMapCache = {}, fileContentsCache = {}, moduleGraphs = /* @__PURE__ */ new Set(), retrieveFileHandlers = /* @__PURE__ */ new Set(), retrieveSourceMapHandlers = /* @__PURE__ */ new Set(), createExecHandlers = (handlers) => (...args) => {
 | |
|   for (const handler of handlers) {
 | |
|     const result = handler(...args);
 | |
|     if (result) return result;
 | |
|   }
 | |
|   return null;
 | |
| }, retrieveFileFromHandlers = createExecHandlers(retrieveFileHandlers), retrieveSourceMapFromHandlers = createExecHandlers(
 | |
|   retrieveSourceMapHandlers
 | |
| );
 | |
| let overridden = !1;
 | |
| const originalPrepare = Error.prepareStackTrace;
 | |
| function resetInterceptor(runtime, options) {
 | |
|   moduleGraphs.delete(runtime.moduleCache), options.retrieveFile && retrieveFileHandlers.delete(options.retrieveFile), options.retrieveSourceMap && retrieveSourceMapHandlers.delete(options.retrieveSourceMap), moduleGraphs.size === 0 && (Error.prepareStackTrace = originalPrepare, overridden = !1);
 | |
| }
 | |
| function interceptStackTrace(runtime, options = {}) {
 | |
|   return overridden || (Error.prepareStackTrace = prepareStackTrace, overridden = !0), moduleGraphs.add(runtime.moduleCache), options.retrieveFile && retrieveFileHandlers.add(options.retrieveFile), options.retrieveSourceMap && retrieveSourceMapHandlers.add(options.retrieveSourceMap), () => resetInterceptor(runtime, options);
 | |
| }
 | |
| function supportRelativeURL(file, url) {
 | |
|   if (!file) return url;
 | |
|   const dir = posixDirname(slash(file)), match = /^\w+:\/\/[^/]*/.exec(dir);
 | |
|   let protocol = match ? match[0] : "";
 | |
|   const startPath = dir.slice(protocol.length);
 | |
|   return protocol && /^\/\w:/.test(startPath) ? (protocol += "/", protocol + slash(posixResolve(startPath, url))) : protocol + posixResolve(startPath, url);
 | |
| }
 | |
| function getRuntimeSourceMap(position) {
 | |
|   for (const moduleCache of moduleGraphs) {
 | |
|     const sourceMap = moduleCache.getSourceMap(position.source);
 | |
|     if (sourceMap)
 | |
|       return {
 | |
|         url: position.source,
 | |
|         map: sourceMap,
 | |
|         vite: !0
 | |
|       };
 | |
|   }
 | |
|   return null;
 | |
| }
 | |
| function retrieveFile(path) {
 | |
|   if (path in fileContentsCache) return fileContentsCache[path];
 | |
|   const content = retrieveFileFromHandlers(path);
 | |
|   return typeof content == "string" ? (fileContentsCache[path] = content, content) : null;
 | |
| }
 | |
| function retrieveSourceMapURL(source) {
 | |
|   const fileData = retrieveFile(source);
 | |
|   if (!fileData) return null;
 | |
|   const re = /\/\/[@#]\s*sourceMappingURL=([^\s'"]+)\s*$|\/\*[@#]\s*sourceMappingURL=[^\s*'"]+\s*\*\/\s*$/gm;
 | |
|   let lastMatch, match;
 | |
|   for (; match = re.exec(fileData); ) lastMatch = match;
 | |
|   return lastMatch ? lastMatch[1] : null;
 | |
| }
 | |
| const reSourceMap = /^data:application\/json[^,]+base64,/;
 | |
| function retrieveSourceMap(source) {
 | |
|   const urlAndMap = retrieveSourceMapFromHandlers(source);
 | |
|   if (urlAndMap) return urlAndMap;
 | |
|   let sourceMappingURL = retrieveSourceMapURL(source);
 | |
|   if (!sourceMappingURL) return null;
 | |
|   let sourceMapData;
 | |
|   if (reSourceMap.test(sourceMappingURL)) {
 | |
|     const rawData = sourceMappingURL.slice(sourceMappingURL.indexOf(",") + 1);
 | |
|     sourceMapData = Buffer.from(rawData, "base64").toString(), sourceMappingURL = source;
 | |
|   } else
 | |
|     sourceMappingURL = supportRelativeURL(source, sourceMappingURL), sourceMapData = retrieveFile(sourceMappingURL);
 | |
|   return sourceMapData ? {
 | |
|     url: sourceMappingURL,
 | |
|     map: sourceMapData
 | |
|   } : null;
 | |
| }
 | |
| function mapSourcePosition(position) {
 | |
|   if (!position.source) return position;
 | |
|   let sourceMap = getRuntimeSourceMap(position);
 | |
|   if (sourceMap || (sourceMap = sourceMapCache[position.source]), !sourceMap) {
 | |
|     const urlAndMap = retrieveSourceMap(position.source);
 | |
|     if (urlAndMap && urlAndMap.map) {
 | |
|       const url = urlAndMap.url;
 | |
|       sourceMap = sourceMapCache[position.source] = {
 | |
|         url,
 | |
|         map: new DecodedMap(
 | |
|           typeof urlAndMap.map == "string" ? JSON.parse(urlAndMap.map) : urlAndMap.map,
 | |
|           url
 | |
|         )
 | |
|       };
 | |
|       const contents = sourceMap.map?.map.sourcesContent;
 | |
|       sourceMap.map && contents && sourceMap.map.resolvedSources.forEach((source, i) => {
 | |
|         const content = contents[i];
 | |
|         if (content && source && url) {
 | |
|           const contentUrl = supportRelativeURL(url, source);
 | |
|           fileContentsCache[contentUrl] = content;
 | |
|         }
 | |
|       });
 | |
|     } else
 | |
|       sourceMap = sourceMapCache[position.source] = {
 | |
|         url: null,
 | |
|         map: null
 | |
|       };
 | |
|   }
 | |
|   if (sourceMap && sourceMap.map && sourceMap.url) {
 | |
|     const originalPosition = getOriginalPosition(sourceMap.map, position);
 | |
|     if (originalPosition && originalPosition.source != null)
 | |
|       return originalPosition.source = supportRelativeURL(
 | |
|         sourceMap.url,
 | |
|         originalPosition.source
 | |
|       ), sourceMap.vite && (originalPosition._vite = !0), originalPosition;
 | |
|   }
 | |
|   return position;
 | |
| }
 | |
| function mapEvalOrigin(origin) {
 | |
|   let match = /^eval at ([^(]+) \((.+):(\d+):(\d+)\)$/.exec(origin);
 | |
|   if (match) {
 | |
|     const position = mapSourcePosition({
 | |
|       name: null,
 | |
|       source: match[2],
 | |
|       line: +match[3],
 | |
|       column: +match[4] - 1
 | |
|     });
 | |
|     return `eval at ${match[1]} (${position.source}:${position.line}:${position.column + 1})`;
 | |
|   }
 | |
|   return match = /^eval at ([^(]+) \((.+)\)$/.exec(origin), match ? `eval at ${match[1]} (${mapEvalOrigin(match[2])})` : origin;
 | |
| }
 | |
| function CallSiteToString() {
 | |
|   let fileName, fileLocation = "";
 | |
|   if (this.isNative())
 | |
|     fileLocation = "native";
 | |
|   else {
 | |
|     fileName = this.getScriptNameOrSourceURL(), !fileName && this.isEval() && (fileLocation = this.getEvalOrigin(), fileLocation += ", "), fileName ? fileLocation += fileName : fileLocation += "<anonymous>";
 | |
|     const lineNumber = this.getLineNumber();
 | |
|     if (lineNumber != null) {
 | |
|       fileLocation += `:${lineNumber}`;
 | |
|       const columnNumber = this.getColumnNumber();
 | |
|       columnNumber && (fileLocation += `:${columnNumber}`);
 | |
|     }
 | |
|   }
 | |
|   let line = "";
 | |
|   const functionName = this.getFunctionName();
 | |
|   let addSuffix = !0;
 | |
|   const isConstructor = this.isConstructor();
 | |
|   if (this.isToplevel() || isConstructor)
 | |
|     isConstructor ? line += `new ${functionName || "<anonymous>"}` : functionName ? line += functionName : (line += fileLocation, addSuffix = !1);
 | |
|   else {
 | |
|     let typeName = this.getTypeName();
 | |
|     typeName === "[object Object]" && (typeName = "null");
 | |
|     const methodName = this.getMethodName();
 | |
|     functionName ? (typeName && functionName.indexOf(typeName) !== 0 && (line += `${typeName}.`), line += functionName, methodName && functionName.indexOf(`.${methodName}`) !== functionName.length - methodName.length - 1 && (line += ` [as ${methodName}]`)) : line += `${typeName}.${methodName || "<anonymous>"}`;
 | |
|   }
 | |
|   return addSuffix && (line += ` (${fileLocation})`), line;
 | |
| }
 | |
| function cloneCallSite(frame) {
 | |
|   const object = {};
 | |
|   return Object.getOwnPropertyNames(Object.getPrototypeOf(frame)).forEach((name) => {
 | |
|     const key = name;
 | |
|     object[key] = /^(?:is|get)/.test(name) ? function() {
 | |
|       return frame[key].call(frame);
 | |
|     } : frame[key];
 | |
|   }), object.toString = CallSiteToString, object;
 | |
| }
 | |
| function wrapCallSite(frame, state) {
 | |
|   if (state === void 0 && (state = { nextPosition: null, curPosition: null }), frame.isNative())
 | |
|     return state.curPosition = null, frame;
 | |
|   const source = frame.getFileName() || frame.getScriptNameOrSourceURL();
 | |
|   if (source) {
 | |
|     const line = frame.getLineNumber();
 | |
|     let column = frame.getColumnNumber() - 1;
 | |
|     const headerLength = 62;
 | |
|     line === 1 && column > headerLength && !frame.isEval() && (column -= headerLength);
 | |
|     const position = mapSourcePosition({
 | |
|       name: null,
 | |
|       source,
 | |
|       line,
 | |
|       column
 | |
|     });
 | |
|     state.curPosition = position, frame = cloneCallSite(frame);
 | |
|     const originalFunctionName = frame.getFunctionName;
 | |
|     return frame.getFunctionName = function() {
 | |
|       const name = state.nextPosition == null ? originalFunctionName() : state.nextPosition.name || originalFunctionName();
 | |
|       return name === "eval" && "_vite" in position ? null : name;
 | |
|     }, frame.getFileName = function() {
 | |
|       return position.source ?? void 0;
 | |
|     }, frame.getLineNumber = function() {
 | |
|       return position.line;
 | |
|     }, frame.getColumnNumber = function() {
 | |
|       return position.column + 1;
 | |
|     }, frame.getScriptNameOrSourceURL = function() {
 | |
|       return position.source;
 | |
|     }, frame;
 | |
|   }
 | |
|   let origin = frame.isEval() && frame.getEvalOrigin();
 | |
|   return origin && (origin = mapEvalOrigin(origin), frame = cloneCallSite(frame), frame.getEvalOrigin = function() {
 | |
|     return origin || void 0;
 | |
|   }), frame;
 | |
| }
 | |
| function prepareStackTrace(error, stack) {
 | |
|   const name = error.name || "Error", message = error.message || "", errorString = `${name}: ${message}`, state = { nextPosition: null, curPosition: null }, processedStack = [];
 | |
|   for (let i = stack.length - 1; i >= 0; i--)
 | |
|     processedStack.push(`
 | |
|     at ${wrapCallSite(stack[i], state)}`), state.nextPosition = state.curPosition;
 | |
|   return state.curPosition = state.nextPosition = null, errorString + processedStack.reverse().join("");
 | |
| }
 | |
| function enableSourceMapSupport(runtime) {
 | |
|   if (runtime.options.sourcemapInterceptor === "node") {
 | |
|     if (typeof process > "u")
 | |
|       throw new TypeError(
 | |
|         `Cannot use "sourcemapInterceptor: 'node'" because global "process" variable is not available.`
 | |
|       );
 | |
|     if (typeof process.setSourceMapsEnabled != "function")
 | |
|       throw new TypeError(
 | |
|         `Cannot use "sourcemapInterceptor: 'node'" because "process.setSourceMapsEnabled" function is not available. Please use Node >= 16.6.0.`
 | |
|       );
 | |
|     const isEnabledAlready = process.sourceMapsEnabled ?? !1;
 | |
|     return process.setSourceMapsEnabled(!0), () => !isEnabledAlready && process.setSourceMapsEnabled(!1);
 | |
|   }
 | |
|   return interceptStackTrace(
 | |
|     runtime,
 | |
|     typeof runtime.options.sourcemapInterceptor == "object" ? runtime.options.sourcemapInterceptor : void 0
 | |
|   );
 | |
| }
 | |
| class ViteRuntime {
 | |
|   constructor(options, runner, debug) {
 | |
|     this.options = options, this.runner = runner, this.debug = debug, this.moduleCache = options.moduleCache ?? new ModuleCacheMap(options.root), typeof options.hmr == "object" && (this.hmrClient = new HMRClient(
 | |
|       options.hmr.logger === !1 ? silentConsole : options.hmr.logger || console,
 | |
|       options.hmr.connection,
 | |
|       ({ acceptedPath, ssrInvalidates }) => (this.moduleCache.invalidate(acceptedPath), ssrInvalidates && this.invalidateFiles(ssrInvalidates), this.executeUrl(acceptedPath))
 | |
|     ), options.hmr.connection.onUpdate(createHMRHandler(this))), options.sourcemapInterceptor !== !1 && (this._resetSourceMapSupport = enableSourceMapSupport(this));
 | |
|   }
 | |
|   /**
 | |
|    * Holds the cache of modules
 | |
|    * Keys of the map are ids
 | |
|    */
 | |
|   moduleCache;
 | |
|   hmrClient;
 | |
|   entrypoints = /* @__PURE__ */ new Set();
 | |
|   idToUrlMap = /* @__PURE__ */ new Map();
 | |
|   fileToIdMap = /* @__PURE__ */ new Map();
 | |
|   envProxy = new Proxy({}, {
 | |
|     get(_, p) {
 | |
|       throw new Error(
 | |
|         `[vite-runtime] Dynamic access of "import.meta.env" is not supported. Please, use "import.meta.env.${String(p)}" instead.`
 | |
|       );
 | |
|     }
 | |
|   });
 | |
|   _destroyed = !1;
 | |
|   _resetSourceMapSupport;
 | |
|   /**
 | |
|    * URL to execute. Accepts file path, server path or id relative to the root.
 | |
|    */
 | |
|   async executeUrl(url) {
 | |
|     url = this.normalizeEntryUrl(url);
 | |
|     const fetchedModule = await this.cachedModule(url);
 | |
|     return await this.cachedRequest(url, fetchedModule);
 | |
|   }
 | |
|   /**
 | |
|    * Entrypoint URL to execute. Accepts file path, server path or id relative to the root.
 | |
|    * In the case of a full reload triggered by HMR, this is the module that will be reloaded.
 | |
|    * If this method is called multiple times, all entrypoints will be reloaded one at a time.
 | |
|    */
 | |
|   async executeEntrypoint(url) {
 | |
|     url = this.normalizeEntryUrl(url);
 | |
|     const fetchedModule = await this.cachedModule(url);
 | |
|     return await this.cachedRequest(url, fetchedModule, [], {
 | |
|       entrypoint: !0
 | |
|     });
 | |
|   }
 | |
|   /**
 | |
|    * Clear all caches including HMR listeners.
 | |
|    */
 | |
|   clearCache() {
 | |
|     this.moduleCache.clear(), this.idToUrlMap.clear(), this.entrypoints.clear(), this.hmrClient?.clear();
 | |
|   }
 | |
|   /**
 | |
|    * Clears all caches, removes all HMR listeners, and resets source map support.
 | |
|    * This method doesn't stop the HMR connection.
 | |
|    */
 | |
|   async destroy() {
 | |
|     this._resetSourceMapSupport?.(), this.clearCache(), this.hmrClient = void 0, this._destroyed = !0;
 | |
|   }
 | |
|   /**
 | |
|    * Returns `true` if the runtime has been destroyed by calling `destroy()` method.
 | |
|    */
 | |
|   isDestroyed() {
 | |
|     return this._destroyed;
 | |
|   }
 | |
|   invalidateFiles(files) {
 | |
|     files.forEach((file) => {
 | |
|       const ids = this.fileToIdMap.get(file);
 | |
|       ids && ids.forEach((id) => this.moduleCache.invalidate(id));
 | |
|     });
 | |
|   }
 | |
|   // we don't use moduleCache.normalize because this URL doesn't have to follow the same rules
 | |
|   // this URL is something that user passes down manually, and is later resolved by fetchModule
 | |
|   // moduleCache.normalize is used on resolved "file" property
 | |
|   normalizeEntryUrl(url) {
 | |
|     if (url[0] === ".")
 | |
|       return url;
 | |
|     url.startsWith("file://") && (url = url.slice(isWindows ? 8 : 7)), url = slash(url);
 | |
|     const _root = this.options.root, root = _root[_root.length - 1] === "/" ? _root : `${_root}/`;
 | |
|     return url.startsWith(root) ? url.slice(root.length - 1) : url[0] === "/" ? url : wrapId(url);
 | |
|   }
 | |
|   processImport(exports, fetchResult, metadata) {
 | |
|     if (!("externalize" in fetchResult))
 | |
|       return exports;
 | |
|     const { id, type } = fetchResult;
 | |
|     return type !== "module" && type !== "commonjs" || analyzeImportedModDifference(exports, id, type, metadata), exports;
 | |
|   }
 | |
|   async cachedRequest(id, fetchedModule, callstack = [], metadata) {
 | |
|     const moduleId = fetchedModule.id;
 | |
|     metadata?.entrypoint && this.entrypoints.add(moduleId);
 | |
|     const mod = this.moduleCache.getByModuleId(moduleId), { imports, importers } = mod, importee = callstack[callstack.length - 1];
 | |
|     if (importee && importers.add(importee), (callstack.includes(moduleId) || Array.from(imports.values()).some((i) => importers.has(i))) && mod.exports)
 | |
|       return this.processImport(mod.exports, fetchedModule, metadata);
 | |
|     let debugTimer;
 | |
|     this.debug && (debugTimer = setTimeout(() => {
 | |
|       const getStack = () => `stack:
 | |
| ${[...callstack, moduleId].reverse().map((p) => `  - ${p}`).join(`
 | |
| `)}`;
 | |
|       this.debug(
 | |
|         `[vite-runtime] module ${moduleId} takes over 2s to load.
 | |
| ${getStack()}`
 | |
|       );
 | |
|     }, 2e3));
 | |
|     try {
 | |
|       if (mod.promise)
 | |
|         return this.processImport(await mod.promise, fetchedModule, metadata);
 | |
|       const promise = this.directRequest(id, fetchedModule, callstack);
 | |
|       return mod.promise = promise, mod.evaluated = !1, this.processImport(await promise, fetchedModule, metadata);
 | |
|     } finally {
 | |
|       mod.evaluated = !0, debugTimer && clearTimeout(debugTimer);
 | |
|     }
 | |
|   }
 | |
|   async cachedModule(id, importer) {
 | |
|     if (this._destroyed)
 | |
|       throw new Error("[vite] Vite runtime has been destroyed.");
 | |
|     const normalized = this.idToUrlMap.get(id);
 | |
|     if (normalized) {
 | |
|       const mod2 = this.moduleCache.getByModuleId(normalized);
 | |
|       if (mod2.meta)
 | |
|         return mod2.meta;
 | |
|     }
 | |
|     this.debug?.("[vite-runtime] fetching", id);
 | |
|     const fetchedModule = id.startsWith("data:") ? { externalize: id, type: "builtin" } : await this.options.fetchModule(id, importer), idQuery = id.split("?")[1], query = idQuery ? `?${idQuery}` : "", file = "file" in fetchedModule ? fetchedModule.file : void 0, fullFile = file ? `${file}${query}` : id, moduleId = this.moduleCache.normalize(fullFile), mod = this.moduleCache.getByModuleId(moduleId);
 | |
|     if (fetchedModule.id = moduleId, mod.meta = fetchedModule, file) {
 | |
|       const fileModules = this.fileToIdMap.get(file) || [];
 | |
|       fileModules.push(moduleId), this.fileToIdMap.set(file, fileModules);
 | |
|     }
 | |
|     return this.idToUrlMap.set(id, moduleId), this.idToUrlMap.set(unwrapId(id), moduleId), fetchedModule;
 | |
|   }
 | |
|   // override is allowed, consider this a public API
 | |
|   async directRequest(id, fetchResult, _callstack) {
 | |
|     const moduleId = fetchResult.id, callstack = [..._callstack, moduleId], mod = this.moduleCache.getByModuleId(moduleId), request = async (dep, metadata) => {
 | |
|       const fetchedModule = await this.cachedModule(dep, moduleId);
 | |
|       return this.moduleCache.getByModuleId(fetchedModule.id).importers.add(moduleId), mod.imports.add(fetchedModule.id), this.cachedRequest(dep, fetchedModule, callstack, metadata);
 | |
|     }, dynamicRequest = async (dep) => (dep = String(dep), dep[0] === "." && (dep = posixResolve(posixDirname(id), dep)), request(dep, { isDynamicImport: !0 }));
 | |
|     if ("externalize" in fetchResult) {
 | |
|       const { externalize } = fetchResult;
 | |
|       this.debug?.("[vite-runtime] externalizing", externalize);
 | |
|       const exports2 = await this.runner.runExternalModule(externalize);
 | |
|       return mod.exports = exports2, exports2;
 | |
|     }
 | |
|     const { code, file } = fetchResult;
 | |
|     if (code == null) {
 | |
|       const importer = callstack[callstack.length - 2];
 | |
|       throw new Error(
 | |
|         `[vite-runtime] Failed to load "${id}"${importer ? ` imported from ${importer}` : ""}`
 | |
|       );
 | |
|     }
 | |
|     const modulePath = cleanUrl(file || moduleId), href = posixPathToFileHref(modulePath), filename = modulePath, dirname2 = posixDirname(modulePath), meta = {
 | |
|       filename: isWindows ? toWindowsPath(filename) : filename,
 | |
|       dirname: isWindows ? toWindowsPath(dirname2) : dirname2,
 | |
|       url: href,
 | |
|       env: this.envProxy,
 | |
|       resolve(id2, parent) {
 | |
|         throw new Error(
 | |
|           '[vite-runtime] "import.meta.resolve" is not supported.'
 | |
|         );
 | |
|       },
 | |
|       // should be replaced during transformation
 | |
|       glob() {
 | |
|         throw new Error('[vite-runtime] "import.meta.glob" is not supported.');
 | |
|       }
 | |
|     }, exports = /* @__PURE__ */ Object.create(null);
 | |
|     Object.defineProperty(exports, Symbol.toStringTag, {
 | |
|       value: "Module",
 | |
|       enumerable: !1,
 | |
|       configurable: !1
 | |
|     }), mod.exports = exports;
 | |
|     let hotContext;
 | |
|     this.hmrClient && Object.defineProperty(meta, "hot", {
 | |
|       enumerable: !0,
 | |
|       get: () => {
 | |
|         if (!this.hmrClient)
 | |
|           throw new Error("[vite-runtime] HMR client was destroyed.");
 | |
|         return this.debug?.("[vite-runtime] creating hmr context for", moduleId), hotContext ||= new HMRContext(this.hmrClient, moduleId), hotContext;
 | |
|       },
 | |
|       set: (value) => {
 | |
|         hotContext = value;
 | |
|       }
 | |
|     });
 | |
|     const context = {
 | |
|       [ssrImportKey]: request,
 | |
|       [ssrDynamicImportKey]: dynamicRequest,
 | |
|       [ssrModuleExportsKey]: exports,
 | |
|       [ssrExportAllKey]: (obj) => exportAll(exports, obj),
 | |
|       [ssrImportMetaKey]: meta
 | |
|     };
 | |
|     return this.debug?.("[vite-runtime] executing", href), await this.runner.runViteModule(context, code, id), exports;
 | |
|   }
 | |
| }
 | |
| function exportAll(exports, sourceModule) {
 | |
|   if (exports !== sourceModule && !(isPrimitive(sourceModule) || Array.isArray(sourceModule) || sourceModule instanceof Promise)) {
 | |
|     for (const key in sourceModule)
 | |
|       if (key !== "default" && key !== "__esModule")
 | |
|         try {
 | |
|           Object.defineProperty(exports, key, {
 | |
|             enumerable: !0,
 | |
|             configurable: !0,
 | |
|             get: () => sourceModule[key]
 | |
|           });
 | |
|         } catch {
 | |
|         }
 | |
|   }
 | |
| }
 | |
| class ESModulesRunner {
 | |
|   async runViteModule(context, code) {
 | |
|     await new AsyncFunction(
 | |
|       ssrModuleExportsKey,
 | |
|       ssrImportMetaKey,
 | |
|       ssrImportKey,
 | |
|       ssrDynamicImportKey,
 | |
|       ssrExportAllKey,
 | |
|       // source map should already be inlined by Vite
 | |
|       '"use strict";' + code
 | |
|     )(
 | |
|       context[ssrModuleExportsKey],
 | |
|       context[ssrImportMetaKey],
 | |
|       context[ssrImportKey],
 | |
|       context[ssrDynamicImportKey],
 | |
|       context[ssrExportAllKey]
 | |
|     ), Object.seal(context[ssrModuleExportsKey]);
 | |
|   }
 | |
|   runExternalModule(filepath) {
 | |
|     return import(filepath);
 | |
|   }
 | |
| }
 | |
| export {
 | |
|   ESModulesRunner,
 | |
|   ModuleCacheMap,
 | |
|   ViteRuntime,
 | |
|   ssrDynamicImportKey,
 | |
|   ssrExportAllKey,
 | |
|   ssrImportKey,
 | |
|   ssrImportMetaKey,
 | |
|   ssrModuleExportsKey
 | |
| };
 |