diff --git a/docs/source/about/changelog.rst b/docs/source/about/changelog.rst index feecbd1f0..c0f7d77e9 100644 --- a/docs/source/about/changelog.rst +++ b/docs/source/about/changelog.rst @@ -27,6 +27,7 @@ Unreleased - :pull:`1118` - `module_from_template` is broken with a recent release of `requests` - :pull:`1131` - `module_from_template` did not work when using Flask backend +- :pull:`1183` - Fix broken source distributions due to missing JavaScript client source code **Added** diff --git a/docs/source/about/contributor-guide.rst b/docs/source/about/contributor-guide.rst index 73ae3f23d..5ab695936 100644 --- a/docs/source/about/contributor-guide.rst +++ b/docs/source/about/contributor-guide.rst @@ -131,8 +131,8 @@ This repository is set up to be able to manage many applications and libraries w in a variety of languages. All projects can be found under the ``src`` directory: - ``src/py/{project}`` - Python packages -- ``src/js/app`` - ReactPy's built-in JS client -- ``src/js/packages/{project}`` - JS packages +- ``src/py/reactpy/js/app`` - ReactPy's built-in JS client +- ``src/py/reactpy/js/packages/{project}`` - JS packages At the root of the repository is a ``pyproject.toml`` file that contains scripts and their respective dependencies for managing all other projects. Most of these global @@ -162,7 +162,7 @@ For Javascript, you'd do: .. code-block:: bash - cd src/js/packages/event-to-object + cd src/py/reactpy/js/packages/event-to-object npm run check:tests diff --git a/src/py/reactpy/.gitignore b/src/py/reactpy/.gitignore index 0499d7590..b971c193a 100644 --- a/src/py/reactpy/.gitignore +++ b/src/py/reactpy/.gitignore @@ -1,4 +1,22 @@ .coverage.* +# --- External gitignores --- +# For hatch, this is the only .gitignore that matters! +# Changes to another .gitignore may need to be reflected here +# if it is necessary to exclude them from the source distribution, +# such as build artifacts. +# +# When duplicating patterns, keep in mind that their meaning changes +# between .gitignore locations: +# https://git-scm.com/docs/gitignore#_pattern_format + +# /.gitignore +node_modules + +# /src/py/reactpy/js/.gitignore +js/**/tsconfig.tsbuildinfo +js/packages/**/package-lock.json +js/**/dist + # --- Build Artifacts --- reactpy/_static diff --git a/src/py/reactpy/hatch_build_sdist.py b/src/py/reactpy/hatch_build_sdist.py new file mode 100644 index 000000000..6984af705 --- /dev/null +++ b/src/py/reactpy/hatch_build_sdist.py @@ -0,0 +1,30 @@ +"""Custom sdist build hook for reactpy. + +As defined in pyproject.toml, this script should automatically be executed +when creating a source (.tar.gz) distribution. + +See also: https://hatch.pypa.io/1.9/plugins/build-hook/custom/ + +""" +import shutil +from pathlib import Path +from typing import Any + +from hatchling.builders.hooks.plugin.interface import BuildHookInterface + + +class CustomBuildHook(BuildHookInterface): + def initialize(self, version: str, build_data: dict[str, Any]) -> None: + # https://github.com/pypa/hatch/issues/1197 + # As a workaround, delete js/node_modules/ so hatchling does not + # mistakenly omit js/packages/ from the source distribution. + # + # If only the source distribution is built, i.e. by running one of: + # - `hatch build --target sdist` + # - `python -m build --sdist` + # then node_modules/ will be missing. Developers that later want to run + # `npm run build` will also need to reinstall with `npm ci`. + modules = Path(self.root) / "js" / "node_modules" + if modules.is_dir(): + print("Removing", modules) + shutil.rmtree(modules) diff --git a/src/js/.eslintrc.json b/src/py/reactpy/js/.eslintrc.json similarity index 100% rename from src/js/.eslintrc.json rename to src/py/reactpy/js/.eslintrc.json diff --git a/src/js/.gitignore b/src/py/reactpy/js/.gitignore similarity index 100% rename from src/js/.gitignore rename to src/py/reactpy/js/.gitignore diff --git a/src/js/README.md b/src/py/reactpy/js/README.md similarity index 100% rename from src/js/README.md rename to src/py/reactpy/js/README.md diff --git a/src/js/app/.eslintrc.json b/src/py/reactpy/js/app/.eslintrc.json similarity index 100% rename from src/js/app/.eslintrc.json rename to src/py/reactpy/js/app/.eslintrc.json diff --git a/src/js/app/index.html b/src/py/reactpy/js/app/index.html similarity index 100% rename from src/js/app/index.html rename to src/py/reactpy/js/app/index.html diff --git a/src/js/app/package-lock.json b/src/py/reactpy/js/app/package-lock.json similarity index 100% rename from src/js/app/package-lock.json rename to src/py/reactpy/js/app/package-lock.json diff --git a/src/js/app/package.json b/src/py/reactpy/js/app/package.json similarity index 100% rename from src/js/app/package.json rename to src/py/reactpy/js/app/package.json diff --git a/src/js/app/public/assets/reactpy-logo.ico b/src/py/reactpy/js/app/public/assets/reactpy-logo.ico similarity index 100% rename from src/js/app/public/assets/reactpy-logo.ico rename to src/py/reactpy/js/app/public/assets/reactpy-logo.ico diff --git a/src/js/app/src/index.ts b/src/py/reactpy/js/app/src/index.ts similarity index 100% rename from src/js/app/src/index.ts rename to src/py/reactpy/js/app/src/index.ts diff --git a/src/js/app/tsconfig.json b/src/py/reactpy/js/app/tsconfig.json similarity index 100% rename from src/js/app/tsconfig.json rename to src/py/reactpy/js/app/tsconfig.json diff --git a/src/js/app/vite.config.js b/src/py/reactpy/js/app/vite.config.js similarity index 100% rename from src/js/app/vite.config.js rename to src/py/reactpy/js/app/vite.config.js diff --git a/src/js/package-lock.json b/src/py/reactpy/js/package-lock.json similarity index 100% rename from src/js/package-lock.json rename to src/py/reactpy/js/package-lock.json diff --git a/src/js/package.json b/src/py/reactpy/js/package.json similarity index 100% rename from src/js/package.json rename to src/py/reactpy/js/package.json diff --git a/src/js/packages/@reactpy/client/.gitignore b/src/py/reactpy/js/packages/@reactpy/client/.gitignore similarity index 100% rename from src/js/packages/@reactpy/client/.gitignore rename to src/py/reactpy/js/packages/@reactpy/client/.gitignore diff --git a/src/js/packages/@reactpy/client/README.md b/src/py/reactpy/js/packages/@reactpy/client/README.md similarity index 100% rename from src/js/packages/@reactpy/client/README.md rename to src/py/reactpy/js/packages/@reactpy/client/README.md diff --git a/src/js/packages/@reactpy/client/package.json b/src/py/reactpy/js/packages/@reactpy/client/package.json similarity index 100% rename from src/js/packages/@reactpy/client/package.json rename to src/py/reactpy/js/packages/@reactpy/client/package.json diff --git a/src/js/packages/@reactpy/client/src/components.tsx b/src/py/reactpy/js/packages/@reactpy/client/src/components.tsx similarity index 100% rename from src/js/packages/@reactpy/client/src/components.tsx rename to src/py/reactpy/js/packages/@reactpy/client/src/components.tsx diff --git a/src/js/packages/@reactpy/client/src/index.ts b/src/py/reactpy/js/packages/@reactpy/client/src/index.ts similarity index 100% rename from src/js/packages/@reactpy/client/src/index.ts rename to src/py/reactpy/js/packages/@reactpy/client/src/index.ts diff --git a/src/js/packages/@reactpy/client/src/logger.ts b/src/py/reactpy/js/packages/@reactpy/client/src/logger.ts similarity index 100% rename from src/js/packages/@reactpy/client/src/logger.ts rename to src/py/reactpy/js/packages/@reactpy/client/src/logger.ts diff --git a/src/js/packages/@reactpy/client/src/messages.ts b/src/py/reactpy/js/packages/@reactpy/client/src/messages.ts similarity index 100% rename from src/js/packages/@reactpy/client/src/messages.ts rename to src/py/reactpy/js/packages/@reactpy/client/src/messages.ts diff --git a/src/js/packages/@reactpy/client/src/mount.tsx b/src/py/reactpy/js/packages/@reactpy/client/src/mount.tsx similarity index 100% rename from src/js/packages/@reactpy/client/src/mount.tsx rename to src/py/reactpy/js/packages/@reactpy/client/src/mount.tsx diff --git a/src/js/packages/@reactpy/client/src/reactpy-client.ts b/src/py/reactpy/js/packages/@reactpy/client/src/reactpy-client.ts similarity index 100% rename from src/js/packages/@reactpy/client/src/reactpy-client.ts rename to src/py/reactpy/js/packages/@reactpy/client/src/reactpy-client.ts diff --git a/src/js/packages/@reactpy/client/src/reactpy-vdom.tsx b/src/py/reactpy/js/packages/@reactpy/client/src/reactpy-vdom.tsx similarity index 100% rename from src/js/packages/@reactpy/client/src/reactpy-vdom.tsx rename to src/py/reactpy/js/packages/@reactpy/client/src/reactpy-vdom.tsx diff --git a/src/js/packages/@reactpy/client/tsconfig.json b/src/py/reactpy/js/packages/@reactpy/client/tsconfig.json similarity index 100% rename from src/js/packages/@reactpy/client/tsconfig.json rename to src/py/reactpy/js/packages/@reactpy/client/tsconfig.json diff --git a/src/js/packages/event-to-object/package.json b/src/py/reactpy/js/packages/event-to-object/package.json similarity index 100% rename from src/js/packages/event-to-object/package.json rename to src/py/reactpy/js/packages/event-to-object/package.json diff --git a/src/js/packages/event-to-object/src/events.ts b/src/py/reactpy/js/packages/event-to-object/src/events.ts similarity index 100% rename from src/js/packages/event-to-object/src/events.ts rename to src/py/reactpy/js/packages/event-to-object/src/events.ts diff --git a/src/js/packages/event-to-object/src/index.ts b/src/py/reactpy/js/packages/event-to-object/src/index.ts similarity index 100% rename from src/js/packages/event-to-object/src/index.ts rename to src/py/reactpy/js/packages/event-to-object/src/index.ts diff --git a/src/js/packages/event-to-object/tests/event-to-object.test.ts b/src/py/reactpy/js/packages/event-to-object/tests/event-to-object.test.ts similarity index 100% rename from src/js/packages/event-to-object/tests/event-to-object.test.ts rename to src/py/reactpy/js/packages/event-to-object/tests/event-to-object.test.ts diff --git a/src/js/packages/event-to-object/tests/tooling/check.ts b/src/py/reactpy/js/packages/event-to-object/tests/tooling/check.ts similarity index 100% rename from src/js/packages/event-to-object/tests/tooling/check.ts rename to src/py/reactpy/js/packages/event-to-object/tests/tooling/check.ts diff --git a/src/js/packages/event-to-object/tests/tooling/mock.ts b/src/py/reactpy/js/packages/event-to-object/tests/tooling/mock.ts similarity index 100% rename from src/js/packages/event-to-object/tests/tooling/mock.ts rename to src/py/reactpy/js/packages/event-to-object/tests/tooling/mock.ts diff --git a/src/js/packages/event-to-object/tests/tooling/setup.js b/src/py/reactpy/js/packages/event-to-object/tests/tooling/setup.js similarity index 100% rename from src/js/packages/event-to-object/tests/tooling/setup.js rename to src/py/reactpy/js/packages/event-to-object/tests/tooling/setup.js diff --git a/src/js/packages/event-to-object/tsconfig.json b/src/py/reactpy/js/packages/event-to-object/tsconfig.json similarity index 100% rename from src/js/packages/event-to-object/tsconfig.json rename to src/py/reactpy/js/packages/event-to-object/tsconfig.json diff --git a/src/js/packages/event-to-object/tsconfig.tests.json b/src/py/reactpy/js/packages/event-to-object/tsconfig.tests.json similarity index 100% rename from src/js/packages/event-to-object/tsconfig.tests.json rename to src/py/reactpy/js/packages/event-to-object/tsconfig.tests.json diff --git a/src/js/tsconfig.package.json b/src/py/reactpy/js/tsconfig.package.json similarity index 100% rename from src/js/tsconfig.package.json rename to src/py/reactpy/js/tsconfig.package.json diff --git a/src/py/reactpy/pyproject.toml b/src/py/reactpy/pyproject.toml index 309248507..6d1d1d9bf 100644 --- a/src/py/reactpy/pyproject.toml +++ b/src/py/reactpy/pyproject.toml @@ -124,8 +124,17 @@ dependencies = [ types = "mypy --strict reactpy" all = ["types"] -[[tool.hatch.build.hooks.build-scripts.scripts]] -work_dir = "../../js" +[tool.hatch.build.targets.sdist] +only-include = ["js", "reactpy"] + +[tool.hatch.build.targets.wheel.force-include] +"reactpy/_static" = "reactpy/_static" # bypass .gitignore + +[tool.hatch.build.targets.sdist.hooks.custom] +path = "hatch_build_sdist.py" + +[[tool.hatch.build.targets.wheel.hooks.build-scripts.scripts]] +work_dir = "js" out_dir = "reactpy/_static" commands = [ "npm ci", diff --git a/tasks.py b/tasks.py index 65f75b208..dbe4500f5 100644 --- a/tasks.py +++ b/tasks.py @@ -50,7 +50,7 @@ def __call__( ROOT = Path(__file__).parent DOCS_DIR = ROOT / "docs" SRC_DIR = ROOT / "src" -JS_DIR = SRC_DIR / "js" +JS_DIR = SRC_DIR / "py" / "reactpy" / "js" PY_DIR = SRC_DIR / "py" PY_PROJECTS = [p for p in PY_DIR.iterdir() if (p / "pyproject.toml").exists()] TAG_PATTERN = re.compile(