"""Serve shared UI assets from lib/common/static under /static/*.""" from __future__ import annotations import os from flask import Flask, Response, send_file from lib.paths import common_static_dir # mime by extension; listed names are served from lib/common/static _COMMON_STATIC_ASSETS: dict[str, str] = { "instance_theme.js": "application/javascript; charset=utf-8", "instance_theme_early.css": "text/css; charset=utf-8", "instance_theme.css": "text/css; charset=utf-8", "account_risk_badge.css": "text/css; charset=utf-8", "account_risk_badge.js": "application/javascript; charset=utf-8", "instance_ui.js": "application/javascript; charset=utf-8", "instance_records_mobile.js": "application/javascript; charset=utf-8", "records_review_page.js": "application/javascript; charset=utf-8", "form_submit_guard.js": "application/javascript; charset=utf-8", "autofill_guard.js": "application/javascript; charset=utf-8", "open_submit_gate.js": "application/javascript; charset=utf-8", "key_monitor_form.js": "application/javascript; charset=utf-8", "time_close_ui.js": "application/javascript; charset=utf-8", "manual_order_rr_preview.js": "application/javascript; charset=utf-8", "symbol_live_price.js": "application/javascript; charset=utf-8", "journal_upload_slots.js": "application/javascript; charset=utf-8", "journal_form_save.js": "application/javascript; charset=utf-8", "instance_page.css": "text/css; charset=utf-8", "instance_embed.js": "application/javascript; charset=utf-8", "instance_mobile_nav.js": "application/javascript; charset=utf-8", "instance_stats.js": "application/javascript; charset=utf-8", "instance_live.js": "application/javascript; charset=utf-8", "instance_settings_prefs.js": "application/javascript; charset=utf-8", "instance_dashboard.js": "application/javascript; charset=utf-8", "account_ledger.js": "application/javascript; charset=utf-8", "options_expiry_countdown.js": "application/javascript; charset=utf-8", "nav_spot_tickers.js": "application/javascript; charset=utf-8", "options_panel.js": "application/javascript; charset=utf-8", "options_settings.js": "application/javascript; charset=utf-8", "options_position_cards.js": "application/javascript; charset=utf-8", "options_review.js": "application/javascript; charset=utf-8", "hedge_plan.js": "application/javascript; charset=utf-8", "order_entry_model.js": "application/javascript; charset=utf-8", "focus_chart_page.js": "application/javascript; charset=utf-8", "focus_chart_page.css": "text/css; charset=utf-8", "trade_stats_calendar.js": "application/javascript; charset=utf-8", "trade_stats_calendar.css": "text/css; charset=utf-8", } def install_common_static(app: Flask, repo_root: str | None = None) -> None: """Register /static/ for shared CSS/JS (replaces hub_bridge mount).""" repo_static = common_static_dir(repo_root) for name, mime in _COMMON_STATIC_ASSETS.items(): path = os.path.join(repo_static, name) def _view(p: str = path, m: str = mime): if not os.path.isfile(p): return Response("not found", status=404, mimetype="text/plain; charset=utf-8") return send_file(p, mimetype=m) endpoint = f"common_static_{name.replace('.', '_').replace('-', '_')}" # 覆盖同名旧路由(若有),确保样式一定从 lib/common/static 提供 try: app.add_url_rule(f"/static/{name}", endpoint=endpoint, view_func=_view) except AssertionError: # endpoint 已存在时替换 view app.view_functions[endpoint] = _view