"""浏览器场景变量替换与 base URL 解析。""" from __future__ import annotations import re from urllib.parse import urlparse import env_config _VAR_PATTERN = re.compile(r"\{\{([A-Z0-9_]+)\}\}") def interpolate(value: str) -> str: def repl(match: re.Match[str]) -> str: key = match.group(1) resolved = env_config.env(key) if resolved is None: raise RuntimeError(f"场景变量未配置:{key}") return resolved return _VAR_PATTERN.sub(repl, value) def default_base_url() -> str: explicit = (env_config.env("PREVIEW_BASE_URL") or "").strip() if explicit: return interpolate(explicit.rstrip("/")) preview = (env_config.env("PREVIEW_URL") or "").strip() if preview: parsed = urlparse(preview) scheme = parsed.scheme or "http" host = parsed.hostname or "127.0.0.1" port = parsed.port if port and port not in (80, 443): return f"{scheme}://{host}:{port}" return f"{scheme}://{host}" port = env_config.env("PREVIEW_PORT", "5173") or "5173" return f"http://127.0.0.1:{port}" def resolve_url(base_url: str, target: str) -> str: target = interpolate(target.strip()) if target.startswith("http://") or target.startswith("https://"): return target if not target.startswith("/"): target = "/" + target return base_url.rstrip("/") + target