#!/usr/bin/env python3 # /// script # requires-python = ">=3.11" # /// """stamp `/static/?v=` references in static/index.html with each file's content hash. cloudflare hands browsers a 4 hour cache lifetime for /static/*.js regardless of the origin header, so a changed script is invisible until its url changes. index.html is not edge cached, so a stamped url takes effect within its own 5 minute max-age. uv run scripts/stamp_static.py rewrite stale stamps uv run scripts/stamp_static.py --check exit 1 if any stamp is stale """ import hashlib import re import sys from pathlib import Path STATIC = Path(__file__).resolve().parent.parent / "static" REF = re.compile(r'(/static/([A-Za-z0-9._\'-]+)\?v=)([0-9a-f]*)') def digest(name: str) -> str: return hashlib.sha256((STATIC / name).read_bytes()).hexdigest()[:10] def stamped(html: str) -> str: return REF.sub(lambda m: m.group(1) + digest(m.group(2)), html) def main() -> int: index = STATIC / "index.html" html = index.read_text() fresh = stamped(html) if fresh == html: return 0 if "--check" in sys.argv[1:]: print("static/index.html has stale ?v= stamps; run: uv run scripts/stamp_static.py", file=sys.stderr) return 1 index.write_text(fresh) print("stamped static/index.html") return 0 if __name__ == "__main__": sys.exit(main())