#!/usr/bin/env python3 """Rebuild redmini/src/data.js from backend mock data (offline snapshot).""" from __future__ import annotations import json import sys from pathlib import Path ROOT = Path(__file__).resolve().parents[2] BACKEND = ROOT / "backend" OUT = ROOT / "redmini" / "src" / "data.js" sys.path.insert(0, str(BACKEND)) from app.data import community_data as c # noqa: E402 from app.data import digital_content as d # noqa: E402 from app.data import mock_data as m # noqa: E402 def main() -> int: meetups = [ {k: v for k, v in x.items() if k not in ("mirotalkRoom", "loungeChannel", "meetingUrl")} for x in c.MEETUPS ] details = getattr(c, "DISCUSSION_DETAILS", {}) or {} payload = { "brand": "nomadro", "tagline": "用一行代码环游世界", "offlineNote": "小红书小程序无法联网。本包为官网内容离线镜像,收藏/计划仅保存在本机。完整互动请打开 nomadweb.nomadro.com", "site": "https://nomadweb.nomadro.com", "stats": { "destinations": len(m.DESTINATIONS), "visas": len(m.VISAS), "meetups": len(meetups), "blog": len(m.BLOG_POSTS), "faqs": len(m.FAQS), }, "ticker": [ "🌏 全球数字游民正在路上", "📋 签证政策实时整理(离线快照)", "🎉 同城活动与社区讨论可先浏览", "🎓 游民学院免费课时可学", ], "rings": { "explore": [ {"id": "destinations", "emoji": "🌴", "title": "目的地", "desc": "发现下一座城市"}, {"id": "visas", "emoji": "📋", "title": "签证指南", "desc": "远程友好签证"}, {"id": "matcher", "emoji": "🎯", "title": "智能匹配", "desc": "按预算气候排序"}, {"id": "compare", "emoji": "⚖️", "title": "城市对比", "desc": "并排看成本网速"}, ], "connect": [ {"id": "meetups", "emoji": "🎉", "title": "游民活动", "desc": "同城与线上"}, {"id": "community", "emoji": "💬", "title": "社区讨论", "desc": "签证住宿经验"}, {"id": "voices", "emoji": "🗣️", "title": "游民心声", "desc": "真实旅居评价"}, ], "grow": [ {"id": "digital", "emoji": "🎓", "title": "游民学院", "desc": "远程工作课程"}, {"id": "blog", "emoji": "📝", "title": "博客", "desc": "指南与攻略"}, {"id": "tools", "emoji": "🧰", "title": "工具箱", "desc": "费用估算等"}, {"id": "faq", "emoji": "❓", "title": "常见问题", "desc": "启动资金与保险"}, ], }, "lifestyle": [ {"key": "morning", "emoji": "🌅", "title": "清晨", "body": "咖啡馆开机,时区对齐,列出今日三件交付。"}, {"key": "work", "emoji": "💻", "title": "深度工作", "body": "联合办公或家中安静角落,异步协作优先。"}, {"key": "explore", "emoji": "🚶", "title": "探索城市", "body": "傍晚散步、夜市与同城 meetup。"}, {"key": "collab", "emoji": "🤝", "title": "协作", "body": "和同行交换签证与住宿情报。"}, {"key": "social", "emoji": "🌙", "title": "社交", "body": "社区圆桌、兴趣局,或安静充电。"}, ], "planChecklist": [ {"id": "visa", "label": "确认签证/停留天数"}, {"id": "flight", "label": "预订机票"}, {"id": "housing", "label": "首周短租/酒店"}, {"id": "sim", "label": "当地 SIM / eSIM"}, {"id": "cowork", "label": "踩点联合办公"}, {"id": "insurance", "label": "国际医疗保险"}, {"id": "budget", "label": "写下月预算"}, {"id": "meetup", "label": "报名一场同城活动"}, ], "destinations": m.DESTINATIONS, "visas": m.VISAS, "faqs": m.FAQS, "testimonials": m.TESTIMONIALS, "tools": m.TOOLS, "blog": m.BLOG_POSTS, "blogContent": m.BLOG_CONTENT, "meetups": meetups, "discussions": c.DISCUSSIONS, "discussionDetails": details if isinstance(details, dict) else {}, "course": d.COURSE_MODULES, "lessons": d.LESSONS, "jobs": (d.JOBS[:8] if getattr(d, "JOBS", None) else []), } OUT.write_text( "window.NOMADRO_DATA = " + json.dumps(payload, ensure_ascii=False, default=str) + ";\n", encoding="utf-8", ) print(f"wrote {OUT} ({OUT.stat().st_size} bytes)") return 0 if __name__ == "__main__": raise SystemExit(main())