import json
import os
import shutil
import subprocess
import sys
import tempfile
from pathlib import Path
ROOT = Path(__file__).resolve().parent.parent
APP = "app"
MANIFEST = ".spa-routes"
ROUTES = ["map", "menu", "cities"]
def run(cmd, **kw):
print("โ", " ".join(cmd))
subprocess.run(cmd, check=True, **kw)
def main() -> int:
if len(sys.argv) != 2:
print(__doc__)
return 2
pages = Path(sys.argv[1]).expanduser().resolve()
if not (pages / ".git").exists():
print(f"{pages} is not a git clone of cyberia-to/cyberia.my")
return 1
env = dict(os.environ, PATH=f"{Path.home()}/.cargo/bin:{os.environ['PATH']}")
with tempfile.TemporaryDirectory() as tmp:
run(
["trunk", "build", "--release", "--public-url", f"/{APP}/", "--dist", tmp],
cwd=ROOT,
env=env,
)
app = pages / APP
shutil.rmtree(app, ignore_errors=True)
shutil.copytree(tmp, app)
manifest = pages / MANIFEST
if manifest.exists():
for rel in manifest.read_text().split():
p = pages / rel
if p.is_symlink() or p.is_file():
p.unlink()
for top in {r.split("/")[0] for r in (manifest.read_text().split() if manifest.exists() else [])}:
d = pages / top
if d.is_dir():
for sub in sorted(d.rglob("*"), key=lambda x: -len(x.parts)):
if sub.is_dir() and not any(sub.iterdir()):
sub.rmdir()
if d.is_dir() and not any(d.iterdir()):
d.rmdir()
plots = json.load(open(ROOT / "src" / "cyberia_map.json"))["phase0"]
routes = list(ROUTES)
for p in plots:
routes += [f"plot/{p['id']}", f"plot/{p['id']}/lease"]
for f in json.load(open(ROOT / "src" / "friend_sales.json")):
slug = "".join(c if c.isascii() and c.isalnum() else "-" for c in f["name"].lower())
routes.append(f"friend/{slug}")
written = []
for r in routes:
d = pages / r
d.mkdir(parents=True, exist_ok=True)
link = d / "index.html"
if link.exists() or link.is_symlink():
link.unlink()
target = os.path.relpath(pages / APP / "index.html", d)
link.symlink_to(target)
written.append(f"{r}/index.html")
manifest.write_text("\n".join(written) + "\n")
print(f"{len(written)} routes โ {APP}/index.html ยท build in {APP}/")
return 0
if __name__ == "__main__":
sys.exit(main())