# deps.py — 対象ファイルの「呼び出し側」と「依存先」を列挙する# 使い方: python3 deps.py src/lib/content.tsimport os, re, sysROOT = "src"EXTS = (".ts", ".tsx")CANDIDATES = (".ts", ".tsx", "/index.ts", "/index.tsx")files = [ os.path.join(d, f).replace("\\", "/") for d, _, fs in os.walk(ROOT) for f in fs if f.endswith(EXTS)]def resolve(spec, frm): """import 文の指定を実ファイルへ解決する。'@/' は src/ 別名、'.' は相対パス。""" if spec.startswith("@/"): base = "src/" + spec[2:] elif spec.startswith("."): base = os.path.normpath(os.path.join(os.path.dirname(frm), spec)).replace("\\", "/") else: return None # 外部パッケージは添付しない for ext in CANDIDATES: if base + ext in files: return base + ext return base if base in files else Noneout = {f: set() for f in files} # f が import しているファイルinn = {f: set() for f in files} # f を import しているファイルfor f in files: src = open(f, encoding="utf-8", errors="ignore").read() for spec in re.findall(r'from\s+["\']([^"\']+)["\']', src): r = resolve(spec, f) if r and r != f: out[f].add(r) inn[r].add(f)target = sys.argv[1]kb = lambda fs: round(sum(os.path.getsize(x) for x in fs) / 1024, 1)callers, deps = sorted(inn[target]), sorted(out[target])print(f"呼び出し側 {len(callers)} 件 / {kb(callers)} KB")for f in callers: print(" <-", f)print(f"依存先 {len(deps)} 件 / {kb(deps)} KB")for f in deps: print(" ->", f)