from __future__ import annotations import shutil import pathlib from typing import Any from hatchling.builders.hooks.plugin.interface import BuildHookInterface def copy_js_code(root: str | pathlib.Path): NOT_COMPONENT = [ "app", "node_modules", "storybook", "playwright-report", "workbench", "tooltils", ] for entry in (pathlib.Path(root) / "js").iterdir(): if ( entry.is_dir() and not str(entry.name).startswith("_") and not str(entry.name) in NOT_COMPONENT ): def ignore(s, names): ignored = [] for n in names: if ( n.startswith("CHANGELOG") or n.startswith("README.md") or n.startswith("node_modules") or ".test." in n or ".stories." in n or ".spec." in n ): ignored.append(n) return ignored shutil.copytree( str(entry), str(pathlib.Path("gradio") / "_frontend_code" / entry.name), ignore=ignore, dirs_exist_ok=True, ) shutil.copytree( str(pathlib.Path(root) / "client" / "js"), str(pathlib.Path("gradio") / "_frontend_code" / "client"), ignore=lambda d, names: ["node_modules"], dirs_exist_ok=True, ) class BuildHook(BuildHookInterface): def initialize(self, version: str, build_data: dict[str, Any]) -> None: copy_js_code(self.root) if __name__ == "__main__": copy_js_code(pathlib.Path("..").resolve())