reactpy 1.0.0__tar.gz → 1.0.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. reactpy-1.0.2/.gitignore +4 -0
  2. reactpy-1.0.2/PKG-INFO +73 -0
  3. reactpy-1.0.2/README.md +23 -0
  4. reactpy-1.0.2/pyproject.toml +176 -0
  5. {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/__init__.py +1 -2
  6. {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/_console/ast_utils.py +11 -10
  7. {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/_console/rewrite_camel_case_props.py +3 -3
  8. {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/_console/rewrite_keys.py +4 -3
  9. {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/_option.py +42 -20
  10. reactpy-1.0.2/reactpy/_static/app/dist/assets/index.a1f87a11.js +1 -0
  11. {reactpy-1.0.0/src/reactpy/_client → reactpy-1.0.2/reactpy/_static/app/dist}/index.html +3 -3
  12. {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/_warnings.py +3 -2
  13. reactpy-1.0.2/reactpy/backend/__init__.py +22 -0
  14. {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/backend/_common.py +47 -35
  15. {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/backend/default.py +18 -11
  16. {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/backend/fastapi.py +1 -2
  17. {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/backend/flask.py +19 -19
  18. {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/backend/hooks.py +9 -6
  19. {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/backend/sanic.py +16 -24
  20. {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/backend/starlette.py +19 -23
  21. {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/backend/tornado.py +21 -18
  22. {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/backend/types.py +2 -4
  23. {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/backend/utils.py +9 -12
  24. reactpy-1.0.2/reactpy/config.py +82 -0
  25. {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/core/_f_back.py +4 -3
  26. {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/core/_thread_local.py +0 -1
  27. {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/core/component.py +8 -9
  28. {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/core/events.py +11 -11
  29. {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/core/hooks.py +19 -24
  30. {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/core/layout.py +44 -50
  31. {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/core/serve.py +21 -7
  32. {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/core/types.py +18 -18
  33. {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/core/vdom.py +19 -20
  34. {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/html.py +63 -12
  35. {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/logging.py +1 -2
  36. {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/sample.py +3 -3
  37. {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/svg.py +2 -3
  38. {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/testing/__init__.py +9 -5
  39. {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/testing/backend.py +20 -23
  40. {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/testing/common.py +8 -8
  41. {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/testing/display.py +4 -4
  42. {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/testing/logs.py +3 -2
  43. {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/types.py +4 -5
  44. {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/utils.py +18 -23
  45. {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/web/__init__.py +1 -2
  46. {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/web/module.py +20 -20
  47. {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/web/templates/react.js +1 -1
  48. {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/web/utils.py +6 -8
  49. {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/widgets.py +10 -12
  50. reactpy-1.0.2/tests/__init__.py +0 -0
  51. reactpy-1.0.2/tests/conftest.py +80 -0
  52. reactpy-1.0.2/tests/test__console/__init__.py +0 -0
  53. reactpy-1.0.2/tests/test__console/test_rewrite_camel_case_props.py +118 -0
  54. reactpy-1.0.2/tests/test__console/test_rewrite_keys.py +237 -0
  55. {reactpy-1.0.0 → reactpy-1.0.2}/tests/test__option.py +29 -3
  56. reactpy-1.0.2/tests/test_backend/__init__.py +0 -0
  57. reactpy-1.0.2/tests/test_backend/test__common.py +70 -0
  58. reactpy-1.0.2/tests/test_backend/test_all.py +174 -0
  59. reactpy-1.0.2/tests/test_backend/test_utils.py +46 -0
  60. {reactpy-1.0.0 → reactpy-1.0.2}/tests/test_client.py +2 -3
  61. {reactpy-1.0.0 → reactpy-1.0.2}/tests/test_config.py +24 -0
  62. reactpy-1.0.2/tests/test_core/__init__.py +0 -0
  63. reactpy-1.0.2/tests/test_core/test_component.py +73 -0
  64. reactpy-1.0.2/tests/test_core/test_events.py +223 -0
  65. reactpy-1.0.2/tests/test_core/test_hooks.py +1259 -0
  66. reactpy-1.0.2/tests/test_core/test_layout.py +1252 -0
  67. reactpy-1.0.2/tests/test_core/test_serve.py +139 -0
  68. reactpy-1.0.2/tests/test_core/test_vdom.py +315 -0
  69. {reactpy-1.0.0 → reactpy-1.0.2}/tests/test_sample.py +0 -1
  70. {reactpy-1.0.0 → reactpy-1.0.2}/tests/test_testing.py +16 -9
  71. {reactpy-1.0.0 → reactpy-1.0.2}/tests/test_utils.py +1 -5
  72. reactpy-1.0.2/tests/test_web/__init__.py +0 -0
  73. reactpy-1.0.2/tests/test_web/js_fixtures/component-can-have-child.js +27 -0
  74. reactpy-1.0.2/tests/test_web/js_fixtures/export-resolution/index.js +2 -0
  75. reactpy-1.0.2/tests/test_web/js_fixtures/export-resolution/one.js +5 -0
  76. reactpy-1.0.2/tests/test_web/js_fixtures/export-resolution/two.js +2 -0
  77. reactpy-1.0.2/tests/test_web/js_fixtures/exports-syntax.js +23 -0
  78. reactpy-1.0.2/tests/test_web/js_fixtures/exports-two-components.js +20 -0
  79. reactpy-1.0.2/tests/test_web/js_fixtures/set-flag-when-unmount-is-called.js +31 -0
  80. reactpy-1.0.2/tests/test_web/js_fixtures/simple-button.js +25 -0
  81. reactpy-1.0.2/tests/test_web/test_module.py +235 -0
  82. reactpy-1.0.2/tests/test_web/test_utils.py +152 -0
  83. {reactpy-1.0.0 → reactpy-1.0.2}/tests/test_widgets.py +0 -1
  84. reactpy-1.0.2/tests/tooling/__init__.py +0 -0
  85. reactpy-1.0.2/tests/tooling/asserts.py +5 -0
  86. reactpy-1.0.2/tests/tooling/common.py +14 -0
  87. reactpy-1.0.2/tests/tooling/hooks.py +15 -0
  88. reactpy-1.0.2/tests/tooling/layout.py +44 -0
  89. reactpy-1.0.2/tests/tooling/loop.py +91 -0
  90. reactpy-1.0.2/tests/tooling/select.py +107 -0
  91. reactpy-1.0.0/LICENSE +0 -21
  92. reactpy-1.0.0/PKG-INFO +0 -103
  93. reactpy-1.0.0/README.md +0 -69
  94. reactpy-1.0.0/pyproject.toml +0 -61
  95. reactpy-1.0.0/setup.cfg +0 -4
  96. reactpy-1.0.0/setup.py +0 -203
  97. reactpy-1.0.0/src/reactpy/_client/assets/index.53b29c63.js +0 -9
  98. reactpy-1.0.0/src/reactpy/config.py +0 -62
  99. reactpy-1.0.0/src/reactpy.egg-info/PKG-INFO +0 -103
  100. reactpy-1.0.0/src/reactpy.egg-info/SOURCES.txt +0 -70
  101. reactpy-1.0.0/src/reactpy.egg-info/dependency_links.txt +0 -1
  102. reactpy-1.0.0/src/reactpy.egg-info/entry_points.txt +0 -2
  103. reactpy-1.0.0/src/reactpy.egg-info/not-zip-safe +0 -1
  104. reactpy-1.0.0/src/reactpy.egg-info/requires.txt +0 -47
  105. reactpy-1.0.0/src/reactpy.egg-info/top_level.txt +0 -1
  106. {reactpy-1.0.0 → reactpy-1.0.2}/MANIFEST.in +0 -0
  107. {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/__main__.py +0 -0
  108. {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/_console/__init__.py +0 -0
  109. {reactpy-1.0.0/src/reactpy/_client → reactpy-1.0.2/reactpy/_static/app/dist}/assets/reactpy-logo.ico +0 -0
  110. {reactpy-1.0.0/src/reactpy/backend → reactpy-1.0.2/reactpy/core}/__init__.py +0 -0
  111. /reactpy-1.0.0/src/reactpy/core/__init__.py → /reactpy-1.0.2/reactpy/future.py +0 -0
  112. {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/py.typed +0 -0
  113. {reactpy-1.0.0 → reactpy-1.0.2}/tests/test_html.py +0 -0
@@ -0,0 +1,4 @@
1
+ .coverage.*
2
+
3
+ # --- Build Artifacts ---
4
+ reactpy/_static
reactpy-1.0.2/PKG-INFO ADDED
@@ -0,0 +1,73 @@
1
+ Metadata-Version: 2.1
2
+ Name: reactpy
3
+ Version: 1.0.2
4
+ Summary: Reactive user interfaces with pure Python
5
+ Project-URL: Source, https://github.com/reactive-python/reactpy
6
+ Project-URL: Documentation, https://github.com/reactive-python/reactpy#readme
7
+ Project-URL: Issues, https://github.com/reactive-python/reactpy/discussions
8
+ Author-email: Ryan Morshead <ryan.morshead@gmail.com>
9
+ License-Expression: MIT
10
+ Keywords: component,javascript,react,reactpy
11
+ Classifier: Development Status :: 4 - Beta
12
+ Classifier: Programming Language :: Python
13
+ Classifier: Programming Language :: Python :: 3.9
14
+ Classifier: Programming Language :: Python :: 3.10
15
+ Classifier: Programming Language :: Python :: 3.11
16
+ Classifier: Programming Language :: Python :: Implementation :: CPython
17
+ Classifier: Programming Language :: Python :: Implementation :: PyPy
18
+ Requires-Python: >=3.9
19
+ Requires-Dist: anyio>=3
20
+ Requires-Dist: asgiref>=3
21
+ Requires-Dist: colorlog>=6
22
+ Requires-Dist: fastjsonschema>=2.14.5
23
+ Requires-Dist: jsonpatch>=1.32
24
+ Requires-Dist: lxml>=4
25
+ Requires-Dist: mypy-extensions>=0.4.3
26
+ Requires-Dist: requests>=2
27
+ Requires-Dist: typing-extensions>=3.10
28
+ Provides-Extra: all
29
+ Requires-Dist: reactpy[fastapi,flask,sanic,starlette,testing,tornado]; extra == 'all'
30
+ Provides-Extra: fastapi
31
+ Requires-Dist: fastapi>=0.63.0; extra == 'fastapi'
32
+ Requires-Dist: uvicorn[standard]>=0.19.0; extra == 'fastapi'
33
+ Provides-Extra: flask
34
+ Requires-Dist: flask; extra == 'flask'
35
+ Requires-Dist: flask-cors; extra == 'flask'
36
+ Requires-Dist: flask-sock; extra == 'flask'
37
+ Requires-Dist: markupsafe<2.1,>=1.1.1; extra == 'flask'
38
+ Provides-Extra: sanic
39
+ Requires-Dist: sanic-cors; extra == 'sanic'
40
+ Requires-Dist: sanic>=21; extra == 'sanic'
41
+ Requires-Dist: uvicorn[standard]>=0.19.0; extra == 'sanic'
42
+ Provides-Extra: starlette
43
+ Requires-Dist: starlette>=0.13.6; extra == 'starlette'
44
+ Requires-Dist: uvicorn[standard]>=0.19.0; extra == 'starlette'
45
+ Provides-Extra: testing
46
+ Requires-Dist: playwright; extra == 'testing'
47
+ Provides-Extra: tornado
48
+ Requires-Dist: tornado; extra == 'tornado'
49
+ Description-Content-Type: text/markdown
50
+
51
+ # <img src="https://raw.githubusercontent.com/reactive-python/reactpy/main/branding/svg/reactpy-logo-square.svg" align="left" height="45"/> ReactPy
52
+
53
+ <p>
54
+ <a href="https://github.com/reactive-python/reactpy/actions">
55
+ <img src="https://github.com/reactive-python/reactpy/workflows/test/badge.svg?event=push">
56
+ </a>
57
+ <a href="https://pypi.org/project/reactpy/">
58
+ <img src="https://img.shields.io/pypi/v/reactpy.svg?label=PyPI">
59
+ </a>
60
+ <a href="https://github.com/reactive-python/reactpy/blob/main/LICENSE">
61
+ <img src="https://img.shields.io/badge/License-MIT-purple.svg">
62
+ </a>
63
+ <a href="https://reactpy.dev/">
64
+ <img src="https://img.shields.io/website?down_message=offline&label=Docs&logo=read-the-docs&logoColor=white&up_message=online&url=https%3A%2F%2Freactpy.dev%2Fdocs%2Findex.html">
65
+ </a>
66
+ <a href="https://discord.gg/uNb5P4hA9X">
67
+ <img src="https://img.shields.io/discord/1111078259854168116?label=Discord&logo=discord">
68
+ </a>
69
+ </p>
70
+
71
+ ---
72
+
73
+ [ReactPy](https://reactpy.dev/) is a library for building user interfaces in Python without Javascript. ReactPy interfaces are made from components that look and behave similar to those found in [ReactJS](https://reactjs.org/). Designed with simplicity in mind, ReactPy can be used by those without web development experience while also being powerful enough to grow with your ambitions.
@@ -0,0 +1,23 @@
1
+ # <img src="https://raw.githubusercontent.com/reactive-python/reactpy/main/branding/svg/reactpy-logo-square.svg" align="left" height="45"/> ReactPy
2
+
3
+ <p>
4
+ <a href="https://github.com/reactive-python/reactpy/actions">
5
+ <img src="https://github.com/reactive-python/reactpy/workflows/test/badge.svg?event=push">
6
+ </a>
7
+ <a href="https://pypi.org/project/reactpy/">
8
+ <img src="https://img.shields.io/pypi/v/reactpy.svg?label=PyPI">
9
+ </a>
10
+ <a href="https://github.com/reactive-python/reactpy/blob/main/LICENSE">
11
+ <img src="https://img.shields.io/badge/License-MIT-purple.svg">
12
+ </a>
13
+ <a href="https://reactpy.dev/">
14
+ <img src="https://img.shields.io/website?down_message=offline&label=Docs&logo=read-the-docs&logoColor=white&up_message=online&url=https%3A%2F%2Freactpy.dev%2Fdocs%2Findex.html">
15
+ </a>
16
+ <a href="https://discord.gg/uNb5P4hA9X">
17
+ <img src="https://img.shields.io/discord/1111078259854168116?label=Discord&logo=discord">
18
+ </a>
19
+ </p>
20
+
21
+ ---
22
+
23
+ [ReactPy](https://reactpy.dev/) is a library for building user interfaces in Python without Javascript. ReactPy interfaces are made from components that look and behave similar to those found in [ReactJS](https://reactjs.org/). Designed with simplicity in mind, ReactPy can be used by those without web development experience while also being powerful enough to grow with your ambitions.
@@ -0,0 +1,176 @@
1
+ [build-system]
2
+ requires = ["hatchling", "hatch-build-scripts>=0.0.4"]
3
+ build-backend = "hatchling.build"
4
+
5
+ # --- Project --------------------------------------------------------------------------
6
+
7
+ [project]
8
+ name = "reactpy"
9
+ dynamic = ["version"]
10
+ description = 'Reactive user interfaces with pure Python'
11
+ readme = "README.md"
12
+ requires-python = ">=3.9"
13
+ license = "MIT"
14
+ keywords = ["react", "javascript", "reactpy", "component"]
15
+ authors = [
16
+ { name = "Ryan Morshead", email = "ryan.morshead@gmail.com" },
17
+ ]
18
+ classifiers = [
19
+ "Development Status :: 4 - Beta",
20
+ "Programming Language :: Python",
21
+ "Programming Language :: Python :: 3.9",
22
+ "Programming Language :: Python :: 3.10",
23
+ "Programming Language :: Python :: 3.11",
24
+ "Programming Language :: Python :: Implementation :: CPython",
25
+ "Programming Language :: Python :: Implementation :: PyPy",
26
+ ]
27
+ dependencies = [
28
+ "typing-extensions >=3.10",
29
+ "mypy-extensions >=0.4.3",
30
+ "anyio >=3",
31
+ "jsonpatch >=1.32",
32
+ "fastjsonschema >=2.14.5",
33
+ "requests >=2",
34
+ "colorlog >=6",
35
+ "asgiref >=3",
36
+ "lxml >=4",
37
+ ]
38
+ [project.optional-dependencies]
39
+ all = ["reactpy[starlette,sanic,fastapi,flask,tornado,testing]"]
40
+
41
+ starlette = [
42
+ "starlette >=0.13.6",
43
+ "uvicorn[standard] >=0.19.0",
44
+ ]
45
+ sanic = [
46
+ "sanic >=21",
47
+ "sanic-cors",
48
+ "uvicorn[standard] >=0.19.0",
49
+ ]
50
+ fastapi = [
51
+ "fastapi >=0.63.0",
52
+ "uvicorn[standard] >=0.19.0",
53
+ ]
54
+ flask = [
55
+ "flask",
56
+ "markupsafe>=1.1.1,<2.1",
57
+ "flask-cors",
58
+ "flask-sock",
59
+ ]
60
+ tornado = [
61
+ "tornado",
62
+ ]
63
+ testing = [
64
+ "playwright",
65
+ ]
66
+
67
+ [project.urls]
68
+ Source = "https://github.com/reactive-python/reactpy"
69
+ Documentation = "https://github.com/reactive-python/reactpy#readme"
70
+ Issues = "https://github.com/reactive-python/reactpy/discussions"
71
+
72
+ # --- Hatch ----------------------------------------------------------------------------
73
+
74
+ [tool.hatch.version]
75
+ path = "reactpy/__init__.py"
76
+
77
+ [tool.hatch.envs.default]
78
+ features = ["all"]
79
+ pre-install-command = "hatch build --hooks-only"
80
+ dependencies = [
81
+ "coverage[toml]>=6.5",
82
+ "pytest",
83
+ "pytest-asyncio>=0.17",
84
+ "pytest-mock",
85
+ "pytest-rerunfailures",
86
+ "pytest-timeout",
87
+ "responses",
88
+ "playwright",
89
+ # I'm not quite sure why this needs to be installed for tests with Sanic to pass
90
+ "sanic-testing",
91
+ # Used to generate model changes from layout update messages
92
+ "jsonpointer",
93
+ ]
94
+ [tool.hatch.envs.default.scripts]
95
+ test = "playwright install && pytest {args:tests}"
96
+ test-cov = "playwright install && coverage run -m pytest {args:tests}"
97
+ cov-report = [
98
+ # "- coverage combine",
99
+ "coverage report",
100
+ ]
101
+ cov = [
102
+ "test-cov {args}",
103
+ "cov-report",
104
+ ]
105
+
106
+ [tool.hatch.envs.default.env-vars]
107
+ REACTPY_DEBUG_MODE="1"
108
+
109
+ [tool.hatch.envs.lint]
110
+ features = ["all"]
111
+ dependencies = [
112
+ "mypy>=1.0.0",
113
+ "types-click",
114
+ "types-tornado",
115
+ "types-pkg-resources",
116
+ "types-flask",
117
+ "types-requests",
118
+ ]
119
+
120
+ [tool.hatch.envs.lint.scripts]
121
+ types = "mypy --strict reactpy"
122
+ all = ["types"]
123
+
124
+ [[tool.hatch.build.hooks.build-scripts.scripts]]
125
+ work_dir = "../../js"
126
+ out_dir = "reactpy/_static"
127
+ commands = [
128
+ "npm ci",
129
+ "npm run build"
130
+ ]
131
+ artifacts = [
132
+ "app/dist/"
133
+ ]
134
+
135
+ # --- Pytest ---------------------------------------------------------------------------
136
+
137
+ [tool.pytest.ini_options]
138
+ testpaths = "tests"
139
+ xfail_strict = true
140
+ python_files = "*asserts.py test_*.py"
141
+ asyncio_mode = "auto"
142
+ log_cli_level = "INFO"
143
+
144
+ # --- MyPy -----------------------------------------------------------------------------
145
+
146
+ [tool.mypy]
147
+ incremental = false
148
+ ignore_missing_imports = true
149
+ warn_unused_configs = true
150
+ warn_redundant_casts = true
151
+ warn_unused_ignores = true
152
+
153
+ # --- Coverage -------------------------------------------------------------------------
154
+
155
+ [tool.coverage.run]
156
+ source_pkgs = ["reactpy"]
157
+ branch = false
158
+ parallel = false
159
+ omit = [
160
+ "reactpy/__init__.py",
161
+ ]
162
+
163
+ [tool.coverage.report]
164
+ fail_under = 100
165
+ show_missing = true
166
+ skip_covered = true
167
+ sort = "Name"
168
+ exclude_lines = [
169
+ "no ?cov",
170
+ '\.\.\.',
171
+ "if __name__ == .__main__.:",
172
+ "if TYPE_CHECKING:",
173
+ ]
174
+ omit = [
175
+ "reactpy/__main__.py",
176
+ ]
@@ -20,9 +20,8 @@ from reactpy.core.serve import Stop
20
20
  from reactpy.core.vdom import vdom
21
21
  from reactpy.utils import Ref, html_to_vdom, vdom_to_html
22
22
 
23
-
24
23
  __author__ = "The Reactive Python Team"
25
- __version__ = "1.0.0" # DO NOT MODIFY
24
+ __version__ = "1.0.2" # DO NOT MODIFY
26
25
 
27
26
  __all__ = [
28
27
  "backend",
@@ -1,13 +1,13 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import ast
4
- from collections.abc import Sequence
4
+ from collections.abc import Iterator, Sequence
5
5
  from dataclasses import dataclass
6
6
  from pathlib import Path
7
7
  from textwrap import indent
8
8
  from tokenize import COMMENT as COMMENT_TOKEN
9
9
  from tokenize import generate_tokens
10
- from typing import Any, Iterator
10
+ from typing import Any
11
11
 
12
12
  import click
13
13
 
@@ -37,12 +37,13 @@ def rewrite_changed_nodes(
37
37
  ):
38
38
  nodes_to_unparse.append(current_node)
39
39
  break
40
- else: # pragma: no cover
41
- raise RuntimeError("Failed to change code")
40
+ else: # nocov
41
+ msg = "Failed to change code"
42
+ raise RuntimeError(msg)
42
43
 
43
- # check if an nodes to rewrite contain eachother, pick outermost nodes
44
- current_outermost_node, *sorted_nodes_to_unparse = list(
45
- sorted(nodes_to_unparse, key=lambda n: n.lineno)
44
+ # check if an nodes to rewrite contain each other, pick outermost nodes
45
+ current_outermost_node, *sorted_nodes_to_unparse = sorted(
46
+ nodes_to_unparse, key=lambda n: n.lineno
46
47
  )
47
48
  outermost_nodes_to_unparse = [current_outermost_node]
48
49
  for node in sorted_nodes_to_unparse:
@@ -80,7 +81,7 @@ def rewrite_changed_nodes(
80
81
  if comments:
81
82
  moved_comment_lines_from_end.append(len(lines) - node.lineno)
82
83
 
83
- for lineno_from_end in sorted(list(set(moved_comment_lines_from_end))):
84
+ for lineno_from_end in sorted(set(moved_comment_lines_from_end)):
84
85
  click.echo(f"Moved comments to {file}:{len(lines) - lineno_from_end}")
85
86
 
86
87
  return "\n".join(lines)
@@ -128,7 +129,7 @@ def find_element_constructor_usages(
128
129
  node.args.insert(1, maybe_attr_dict_node)
129
130
  else:
130
131
  continue
131
- elif len(node.args) >= 2:
132
+ elif len(node.args) >= 2: # noqa: PLR2004
132
133
  maybe_attr_dict_node = node.args[1]
133
134
  elif hasattr(html, name):
134
135
  if len(node.args) == 0:
@@ -179,7 +180,7 @@ def _find_comments(lines: list[str]) -> list[str]:
179
180
  def _walk_with_parent(
180
181
  node: ast.AST, parents: tuple[ast.AST, ...] = ()
181
182
  ) -> Iterator[tuple[tuple[ast.AST, ...], ast.AST]]:
182
- parents = (node,) + parents
183
+ parents = (node, *parents)
183
184
  for child in ast.iter_child_nodes(node):
184
185
  yield parents, child
185
186
  yield from _walk_with_parent(child, parents)
@@ -16,7 +16,6 @@ from reactpy._console.ast_utils import (
16
16
  rewrite_changed_nodes,
17
17
  )
18
18
 
19
-
20
19
  CAMEL_CASE_SUB_PATTERN = re.compile(r"(?<!^)(?=[A-Z])")
21
20
 
22
21
 
@@ -24,8 +23,9 @@ CAMEL_CASE_SUB_PATTERN = re.compile(r"(?<!^)(?=[A-Z])")
24
23
  @click.argument("paths", nargs=-1, type=click.Path(exists=True))
25
24
  def rewrite_camel_case_props(paths: list[str]) -> None:
26
25
  """Rewrite camelCase props to snake_case"""
27
- if sys.version_info < (3, 9): # pragma: no cover
28
- raise RuntimeError("This command requires Python>=3.9")
26
+ if sys.version_info < (3, 9): # nocov
27
+ msg = "This command requires Python>=3.9"
28
+ raise RuntimeError(msg)
29
29
 
30
30
  for p in map(Path, paths):
31
31
  for f in [p] if p.is_file() else p.rglob("*.py"):
@@ -40,13 +40,14 @@ def rewrite_keys(paths: list[str]) -> None:
40
40
  recommend running your code formatter like Black against your code after executing
41
41
  this command.
42
42
 
43
- Additionally, We are unable to perserve the location of comments that lie within any
43
+ Additionally, We are unable to preserve the location of comments that lie within any
44
44
  rewritten code. This command will place the comments in the code it plans to rewrite
45
45
  just above its changes. As such it requires manual intervention to put those
46
46
  comments back in their original location.
47
47
  """
48
- if sys.version_info < (3, 9): # pragma: no cover
49
- raise RuntimeError("This command requires Python>=3.9")
48
+ if sys.version_info < (3, 9): # nocov
49
+ msg = "This command requires Python>=3.9"
50
+ raise RuntimeError(msg)
50
51
 
51
52
  for p in map(Path, paths):
52
53
  for f in [p] if p.is_file() else p.rglob("*.py"):
@@ -6,9 +6,9 @@ from typing import Any, Callable, Generic, TypeVar, cast
6
6
 
7
7
  from reactpy._warnings import warn
8
8
 
9
-
10
9
  _O = TypeVar("_O")
11
10
  logger = getLogger(__name__)
11
+ UNDEFINED = cast(Any, object())
12
12
 
13
13
 
14
14
  class Option(Generic[_O]):
@@ -17,8 +17,9 @@ class Option(Generic[_O]):
17
17
  def __init__(
18
18
  self,
19
19
  name: str,
20
- default: _O | Option[_O],
20
+ default: _O = UNDEFINED,
21
21
  mutable: bool = True,
22
+ parent: Option[_O] | None = None,
22
23
  validator: Callable[[Any], _O] = lambda x: cast(_O, x),
23
24
  ) -> None:
24
25
  self._name = name
@@ -29,12 +30,15 @@ class Option(Generic[_O]):
29
30
  if name in os.environ:
30
31
  self._current = validator(os.environ[name])
31
32
 
32
- self._default: _O
33
- if isinstance(default, Option):
34
- self._default = default.default
35
- default.subscribe(lambda value: setattr(self, "_default", value))
36
- else:
33
+ if parent is not None:
34
+ if not (parent.mutable and self.mutable):
35
+ raise TypeError("Parent and child options must be mutable")
36
+ self._default = parent.default
37
+ parent.subscribe(self.set_current)
38
+ elif default is not UNDEFINED:
37
39
  self._default = default
40
+ else:
41
+ raise TypeError("Must specify either a default or a parent option")
38
42
 
39
43
  logger.debug(f"{self._name}={self.current}")
40
44
 
@@ -63,12 +67,12 @@ class Option(Generic[_O]):
63
67
  @current.setter
64
68
  def current(self, new: _O) -> None:
65
69
  self.set_current(new)
66
- return None
67
70
 
68
71
  def subscribe(self, handler: Callable[[_O], None]) -> Callable[[_O], None]:
69
72
  """Register a callback that will be triggered when this option changes"""
70
73
  if not self.mutable:
71
- raise TypeError("Immutable options cannot be subscribed to.")
74
+ msg = "Immutable options cannot be subscribed to."
75
+ raise TypeError(msg)
72
76
  self._subscribers.append(handler)
73
77
  handler(self.current)
74
78
  return handler
@@ -82,10 +86,19 @@ class Option(Generic[_O]):
82
86
 
83
87
  Raises a ``TypeError`` if this option is not :attr:`Option.mutable`.
84
88
  """
85
- if not self._mutable:
86
- raise TypeError(f"{self} cannot be modified after initial load")
87
89
  old = self.current
88
- new = self._current = self._validator(new)
90
+ if new is old:
91
+ return None
92
+
93
+ if not self._mutable:
94
+ msg = f"{self} cannot be modified after initial load"
95
+ raise TypeError(msg)
96
+
97
+ try:
98
+ new = self._current = self._validator(new)
99
+ except ValueError as error:
100
+ raise ValueError(f"Invalid value for {self._name}: {new!r}") from error
101
+
89
102
  logger.debug(f"{self._name}={self._current}")
90
103
  if new != old:
91
104
  for sub_func in self._subscribers:
@@ -107,7 +120,8 @@ class Option(Generic[_O]):
107
120
  def unset(self) -> None:
108
121
  """Remove the current value, the default will be used until it is set again."""
109
122
  if not self._mutable:
110
- raise TypeError(f"{self} cannot be modified after initial load")
123
+ msg = f"{self} cannot be modified after initial load"
124
+ raise TypeError(msg)
111
125
  old = self.current
112
126
  delattr(self, "_current")
113
127
  if self.current != old:
@@ -118,15 +132,23 @@ class Option(Generic[_O]):
118
132
  return f"Option({self._name}={self.current!r})"
119
133
 
120
134
 
121
- class DeprecatedOption(Option[_O]): # pragma: no cover
122
- def __init__(self, message: str, *args: Any, **kwargs: Any) -> None:
123
- self._deprecation_message = message
135
+ class DeprecatedOption(Option[_O]):
136
+ """An option that will warn when it is accessed"""
137
+
138
+ def __init__(self, *args: Any, message: str, **kwargs: Any) -> None:
124
139
  super().__init__(*args, **kwargs)
140
+ self._deprecation_message = message
125
141
 
126
142
  @Option.current.getter # type: ignore
127
143
  def current(self) -> _O:
128
- warn(
129
- self._deprecation_message,
130
- DeprecationWarning,
131
- )
144
+ try:
145
+ # we access the current value during init to debug log it
146
+ # no need to warn unless it's actually used. since this attr
147
+ # is only set after super().__init__ is called, we can check
148
+ # for it to determine if it's being accessed by a user.
149
+ msg = self._deprecation_message
150
+ except AttributeError:
151
+ pass
152
+ else:
153
+ warn(msg, DeprecationWarning)
132
154
  return super().current
@@ -0,0 +1 @@
1
+ var we=Object.defineProperty;var Pe=(ee,te,ne)=>te in ee?we(ee,te,{enumerable:!0,configurable:!0,writable:!0,value:ne}):ee[te]=ne;var ge=(ee,te,ne)=>(Pe(ee,typeof te!="symbol"?te+"":te,ne),ne);(function(){const te=document.createElement("link").relList;if(te&&te.supports&&te.supports("modulepreload"))return;for(const ie of document.querySelectorAll('link[rel="modulepreload"]'))re(ie);new MutationObserver(ie=>{for(const oe of ie)if(oe.type==="childList")for(const le of oe.addedNodes)le.tagName==="LINK"&&le.rel==="modulepreload"&&re(le)}).observe(document,{childList:!0,subtree:!0});function ne(ie){const oe={};return ie.integrity&&(oe.integrity=ie.integrity),ie.referrerpolicy&&(oe.referrerPolicy=ie.referrerpolicy),ie.crossorigin==="use-credentials"?oe.credentials="include":ie.crossorigin==="anonymous"?oe.credentials="omit":oe.credentials="same-origin",oe}function re(ie){if(ie.ep)return;ie.ep=!0;const oe=ne(ie);fetch(ie.href,oe)}})();var n,l$1,u$1,t$1,o$1,r$1,f$1,e$1,c$1={},s$1=[],a$1=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,v$1=Array.isArray;function h$1(ee,te){for(var ne in te)ee[ne]=te[ne];return ee}function p$1(ee){var te=ee.parentNode;te&&te.removeChild(ee)}function y$1(ee,te,ne){var re,ie,oe,le={};for(oe in te)oe=="key"?re=te[oe]:oe=="ref"?ie=te[oe]:le[oe]=te[oe];if(arguments.length>2&&(le.children=arguments.length>3?n.call(arguments,2):ne),typeof ee=="function"&&ee.defaultProps!=null)for(oe in ee.defaultProps)le[oe]===void 0&&(le[oe]=ee.defaultProps[oe]);return d$1(ee,le,re,ie,null)}function d$1(ee,te,ne,re,ie){var oe={type:ee,props:te,key:ne,ref:re,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,__h:null,constructor:void 0,__v:ie==null?++u$1:ie};return ie==null&&l$1.vnode!=null&&l$1.vnode(oe),oe}function _$1(){return{current:null}}function k$2(ee){return ee.children}function b$1(ee,te){this.props=ee,this.context=te}function g$2(ee,te){if(te==null)return ee.__?g$2(ee.__,ee.__.__k.indexOf(ee)+1):null;for(var ne;te<ee.__k.length;te++)if((ne=ee.__k[te])!=null&&ne.__e!=null)return ne.__e;return typeof ee.type=="function"?g$2(ee):null}function m$1(ee){var te,ne;if((ee=ee.__)!=null&&ee.__c!=null){for(ee.__e=ee.__c.base=null,te=0;te<ee.__k.length;te++)if((ne=ee.__k[te])!=null&&ne.__e!=null){ee.__e=ee.__c.base=ne.__e;break}return m$1(ee)}}function w$2(ee){(!ee.__d&&(ee.__d=!0)&&t$1.push(ee)&&!x$2.__r++||o$1!==l$1.debounceRendering)&&((o$1=l$1.debounceRendering)||r$1)(x$2)}function x$2(){var ee,te,ne,re,ie,oe,le,ue;for(t$1.sort(f$1);ee=t$1.shift();)ee.__d&&(te=t$1.length,re=void 0,ie=void 0,le=(oe=(ne=ee).__v).__e,(ue=ne.__P)&&(re=[],(ie=h$1({},oe)).__v=oe.__v+1,L$1(ue,oe,ie,ne.__n,ue.ownerSVGElement!==void 0,oe.__h!=null?[le]:null,re,le==null?g$2(oe):le,oe.__h),M$1(re,oe),oe.__e!=le&&m$1(oe)),t$1.length>te&&t$1.sort(f$1));x$2.__r=0}function P$1(ee,te,ne,re,ie,oe,le,ue,se,fe){var ce,pe,_e,ae,de,$e,ve,me=re&&re.__k||s$1,ye=me.length;for(ne.__k=[],ce=0;ce<te.length;ce++)if((ae=ne.__k[ce]=(ae=te[ce])==null||typeof ae=="boolean"||typeof ae=="function"?null:typeof ae=="string"||typeof ae=="number"||typeof ae=="bigint"?d$1(null,ae,null,null,ae):v$1(ae)?d$1(k$2,{children:ae},null,null,null):ae.__b>0?d$1(ae.type,ae.props,ae.key,ae.ref?ae.ref:null,ae.__v):ae)!=null){if(ae.__=ne,ae.__b=ne.__b+1,(_e=me[ce])===null||_e&&ae.key==_e.key&&ae.type===_e.type)me[ce]=void 0;else for(pe=0;pe<ye;pe++){if((_e=me[pe])&&ae.key==_e.key&&ae.type===_e.type){me[pe]=void 0;break}_e=null}L$1(ee,ae,_e=_e||c$1,ie,oe,le,ue,se,fe),de=ae.__e,(pe=ae.ref)&&_e.ref!=pe&&(ve||(ve=[]),_e.ref&&ve.push(_e.ref,null,ae),ve.push(pe,ae.__c||de,ae)),de!=null?($e==null&&($e=de),typeof ae.type=="function"&&ae.__k===_e.__k?ae.__d=se=C$1(ae,se,ee):se=$$1(ee,ae,_e,me,de,se),typeof ne.type=="function"&&(ne.__d=se)):se&&_e.__e==se&&se.parentNode!=ee&&(se=g$2(_e))}for(ne.__e=$e,ce=ye;ce--;)me[ce]!=null&&(typeof ne.type=="function"&&me[ce].__e!=null&&me[ce].__e==ne.__d&&(ne.__d=A$2(re).nextSibling),q$2(me[ce],me[ce]));if(ve)for(ce=0;ce<ve.length;ce++)O$1(ve[ce],ve[++ce],ve[++ce])}function C$1(ee,te,ne){for(var re,ie=ee.__k,oe=0;ie&&oe<ie.length;oe++)(re=ie[oe])&&(re.__=ee,te=typeof re.type=="function"?C$1(re,te,ne):$$1(ne,re,re,ie,re.__e,te));return te}function S(ee,te){return te=te||[],ee==null||typeof ee=="boolean"||(v$1(ee)?ee.some(function(ne){S(ne,te)}):te.push(ee)),te}function $$1(ee,te,ne,re,ie,oe){var le,ue,se;if(te.__d!==void 0)le=te.__d,te.__d=void 0;else if(ne==null||ie!=oe||ie.parentNode==null)e:if(oe==null||oe.parentNode!==ee)ee.appendChild(ie),le=null;else{for(ue=oe,se=0;(ue=ue.nextSibling)&&se<re.length;se+=1)if(ue==ie)break e;ee.insertBefore(ie,oe),le=oe}return le!==void 0?le:ie.nextSibling}function A$2(ee){var te,ne,re;if(ee.type==null||typeof ee.type=="string")return ee.__e;if(ee.__k){for(te=ee.__k.length-1;te>=0;te--)if((ne=ee.__k[te])&&(re=A$2(ne)))return re}return null}function H$1(ee,te,ne,re,ie){var oe;for(oe in ne)oe==="children"||oe==="key"||oe in te||T$2(ee,oe,null,ne[oe],re);for(oe in te)ie&&typeof te[oe]!="function"||oe==="children"||oe==="key"||oe==="value"||oe==="checked"||ne[oe]===te[oe]||T$2(ee,oe,te[oe],ne[oe],re)}function I$1(ee,te,ne){te[0]==="-"?ee.setProperty(te,ne==null?"":ne):ee[te]=ne==null?"":typeof ne!="number"||a$1.test(te)?ne:ne+"px"}function T$2(ee,te,ne,re,ie){var oe;e:if(te==="style")if(typeof ne=="string")ee.style.cssText=ne;else{if(typeof re=="string"&&(ee.style.cssText=re=""),re)for(te in re)ne&&te in ne||I$1(ee.style,te,"");if(ne)for(te in ne)re&&ne[te]===re[te]||I$1(ee.style,te,ne[te])}else if(te[0]==="o"&&te[1]==="n")oe=te!==(te=te.replace(/Capture$/,"")),te=te.toLowerCase()in ee?te.toLowerCase().slice(2):te.slice(2),ee.l||(ee.l={}),ee.l[te+oe]=ne,ne?re||ee.addEventListener(te,oe?z$2:j$2,oe):ee.removeEventListener(te,oe?z$2:j$2,oe);else if(te!=="dangerouslySetInnerHTML"){if(ie)te=te.replace(/xlink(H|:h)/,"h").replace(/sName$/,"s");else if(te!=="width"&&te!=="height"&&te!=="href"&&te!=="list"&&te!=="form"&&te!=="tabIndex"&&te!=="download"&&te!=="rowSpan"&&te!=="colSpan"&&te in ee)try{ee[te]=ne==null?"":ne;break e}catch{}typeof ne=="function"||(ne==null||ne===!1&&te[4]!=="-"?ee.removeAttribute(te):ee.setAttribute(te,ne))}}function j$2(ee){return this.l[ee.type+!1](l$1.event?l$1.event(ee):ee)}function z$2(ee){return this.l[ee.type+!0](l$1.event?l$1.event(ee):ee)}function L$1(ee,te,ne,re,ie,oe,le,ue,se){var fe,ce,pe,_e,ae,de,$e,ve,me,ye,be,Ee,ke,Ce,Te,he=te.type;if(te.constructor!==void 0)return null;ne.__h!=null&&(se=ne.__h,ue=te.__e=ne.__e,te.__h=null,oe=[ue]),(fe=l$1.__b)&&fe(te);try{e:if(typeof he=="function"){if(ve=te.props,me=(fe=he.contextType)&&re[fe.__c],ye=fe?me?me.props.value:fe.__:re,ne.__c?$e=(ce=te.__c=ne.__c).__=ce.__E:("prototype"in he&&he.prototype.render?te.__c=ce=new he(ve,ye):(te.__c=ce=new b$1(ve,ye),ce.constructor=he,ce.render=B$2),me&&me.sub(ce),ce.props=ve,ce.state||(ce.state={}),ce.context=ye,ce.__n=re,pe=ce.__d=!0,ce.__h=[],ce._sb=[]),ce.__s==null&&(ce.__s=ce.state),he.getDerivedStateFromProps!=null&&(ce.__s==ce.state&&(ce.__s=h$1({},ce.__s)),h$1(ce.__s,he.getDerivedStateFromProps(ve,ce.__s))),_e=ce.props,ae=ce.state,ce.__v=te,pe)he.getDerivedStateFromProps==null&&ce.componentWillMount!=null&&ce.componentWillMount(),ce.componentDidMount!=null&&ce.__h.push(ce.componentDidMount);else{if(he.getDerivedStateFromProps==null&&ve!==_e&&ce.componentWillReceiveProps!=null&&ce.componentWillReceiveProps(ve,ye),!ce.__e&&ce.shouldComponentUpdate!=null&&ce.shouldComponentUpdate(ve,ce.__s,ye)===!1||te.__v===ne.__v){for(te.__v!==ne.__v&&(ce.props=ve,ce.state=ce.__s,ce.__d=!1),ce.__e=!1,te.__e=ne.__e,te.__k=ne.__k,te.__k.forEach(function(Se){Se&&(Se.__=te)}),be=0;be<ce._sb.length;be++)ce.__h.push(ce._sb[be]);ce._sb=[],ce.__h.length&&le.push(ce);break e}ce.componentWillUpdate!=null&&ce.componentWillUpdate(ve,ce.__s,ye),ce.componentDidUpdate!=null&&ce.__h.push(function(){ce.componentDidUpdate(_e,ae,de)})}if(ce.context=ye,ce.props=ve,ce.__P=ee,Ee=l$1.__r,ke=0,"prototype"in he&&he.prototype.render){for(ce.state=ce.__s,ce.__d=!1,Ee&&Ee(te),fe=ce.render(ce.props,ce.state,ce.context),Ce=0;Ce<ce._sb.length;Ce++)ce.__h.push(ce._sb[Ce]);ce._sb=[]}else do ce.__d=!1,Ee&&Ee(te),fe=ce.render(ce.props,ce.state,ce.context),ce.state=ce.__s;while(ce.__d&&++ke<25);ce.state=ce.__s,ce.getChildContext!=null&&(re=h$1(h$1({},re),ce.getChildContext())),pe||ce.getSnapshotBeforeUpdate==null||(de=ce.getSnapshotBeforeUpdate(_e,ae)),P$1(ee,v$1(Te=fe!=null&&fe.type===k$2&&fe.key==null?fe.props.children:fe)?Te:[Te],te,ne,re,ie,oe,le,ue,se),ce.base=te.__e,te.__h=null,ce.__h.length&&le.push(ce),$e&&(ce.__E=ce.__=null),ce.__e=!1}else oe==null&&te.__v===ne.__v?(te.__k=ne.__k,te.__e=ne.__e):te.__e=N$1(ne.__e,te,ne,re,ie,oe,le,se);(fe=l$1.diffed)&&fe(te)}catch(Se){te.__v=null,(se||oe!=null)&&(te.__e=ue,te.__h=!!se,oe[oe.indexOf(ue)]=null),l$1.__e(Se,te,ne)}}function M$1(ee,te){l$1.__c&&l$1.__c(te,ee),ee.some(function(ne){try{ee=ne.__h,ne.__h=[],ee.some(function(re){re.call(ne)})}catch(re){l$1.__e(re,ne.__v)}})}function N$1(ee,te,ne,re,ie,oe,le,ue){var se,fe,ce,pe=ne.props,_e=te.props,ae=te.type,de=0;if(ae==="svg"&&(ie=!0),oe!=null){for(;de<oe.length;de++)if((se=oe[de])&&"setAttribute"in se==!!ae&&(ae?se.localName===ae:se.nodeType===3)){ee=se,oe[de]=null;break}}if(ee==null){if(ae===null)return document.createTextNode(_e);ee=ie?document.createElementNS("http://www.w3.org/2000/svg",ae):document.createElement(ae,_e.is&&_e),oe=null,ue=!1}if(ae===null)pe===_e||ue&&ee.data===_e||(ee.data=_e);else{if(oe=oe&&n.call(ee.childNodes),fe=(pe=ne.props||c$1).dangerouslySetInnerHTML,ce=_e.dangerouslySetInnerHTML,!ue){if(oe!=null)for(pe={},de=0;de<ee.attributes.length;de++)pe[ee.attributes[de].name]=ee.attributes[de].value;(ce||fe)&&(ce&&(fe&&ce.__html==fe.__html||ce.__html===ee.innerHTML)||(ee.innerHTML=ce&&ce.__html||""))}if(H$1(ee,_e,pe,ie,ue),ce)te.__k=[];else if(P$1(ee,v$1(de=te.props.children)?de:[de],te,ne,re,ie&&ae!=="foreignObject",oe,le,oe?oe[0]:ne.__k&&g$2(ne,0),ue),oe!=null)for(de=oe.length;de--;)oe[de]!=null&&p$1(oe[de]);ue||("value"in _e&&(de=_e.value)!==void 0&&(de!==ee.value||ae==="progress"&&!de||ae==="option"&&de!==pe.value)&&T$2(ee,"value",de,pe.value,!1),"checked"in _e&&(de=_e.checked)!==void 0&&de!==ee.checked&&T$2(ee,"checked",de,pe.checked,!1))}return ee}function O$1(ee,te,ne){try{typeof ee=="function"?ee(te):ee.current=te}catch(re){l$1.__e(re,ne)}}function q$2(ee,te,ne){var re,ie;if(l$1.unmount&&l$1.unmount(ee),(re=ee.ref)&&(re.current&&re.current!==ee.__e||O$1(re,null,te)),(re=ee.__c)!=null){if(re.componentWillUnmount)try{re.componentWillUnmount()}catch(oe){l$1.__e(oe,te)}re.base=re.__P=null,ee.__c=void 0}if(re=ee.__k)for(ie=0;ie<re.length;ie++)re[ie]&&q$2(re[ie],te,ne||typeof ee.type!="function");ne||ee.__e==null||p$1(ee.__e),ee.__=ee.__e=ee.__d=void 0}function B$2(ee,te,ne){return this.constructor(ee,ne)}function D$1(ee,te,ne){var re,ie,oe;l$1.__&&l$1.__(ee,te),ie=(re=typeof ne=="function")?null:ne&&ne.__k||te.__k,oe=[],L$1(te,ee=(!re&&ne||te).__k=y$1(k$2,null,[ee]),ie||c$1,c$1,te.ownerSVGElement!==void 0,!re&&ne?[ne]:ie?null:te.firstChild?n.call(te.childNodes):null,oe,!re&&ne?ne:ie?ie.__e:te.firstChild,re),M$1(oe,ee)}function E$1(ee,te){D$1(ee,te,E$1)}function F$2(ee,te,ne){var re,ie,oe,le,ue=h$1({},ee.props);for(oe in ee.type&&ee.type.defaultProps&&(le=ee.type.defaultProps),te)oe=="key"?re=te[oe]:oe=="ref"?ie=te[oe]:ue[oe]=te[oe]===void 0&&le!==void 0?le[oe]:te[oe];return arguments.length>2&&(ue.children=arguments.length>3?n.call(arguments,2):ne),d$1(ee.type,ue,re||ee.key,ie||ee.ref,null)}function G$1(ee,te){var ne={__c:te="__cC"+e$1++,__:ee,Consumer:function(re,ie){return re.children(ie)},Provider:function(re){var ie,oe;return this.getChildContext||(ie=[],(oe={})[te]=this,this.getChildContext=function(){return oe},this.shouldComponentUpdate=function(le){this.props.value!==le.value&&ie.some(function(ue){ue.__e=!0,w$2(ue)})},this.sub=function(le){ie.push(le);var ue=le.componentWillUnmount;le.componentWillUnmount=function(){ie.splice(ie.indexOf(le),1),ue&&ue.call(le)}}),re.children}};return ne.Provider.__=ne.Consumer.contextType=ne}n=s$1.slice,l$1={__e:function(ee,te,ne,re){for(var ie,oe,le;te=te.__;)if((ie=te.__c)&&!ie.__)try{if((oe=ie.constructor)&&oe.getDerivedStateFromError!=null&&(ie.setState(oe.getDerivedStateFromError(ee)),le=ie.__d),ie.componentDidCatch!=null&&(ie.componentDidCatch(ee,re||{}),le=ie.__d),le)return ie.__E=ie}catch(ue){ee=ue}throw ee}},u$1=0,b$1.prototype.setState=function(ee,te){var ne;ne=this.__s!=null&&this.__s!==this.state?this.__s:this.__s=h$1({},this.state),typeof ee=="function"&&(ee=ee(h$1({},ne),this.props)),ee&&h$1(ne,ee),ee!=null&&this.__v&&(te&&this._sb.push(te),w$2(this))},b$1.prototype.forceUpdate=function(ee){this.__v&&(this.__e=!0,ee&&this.__h.push(ee),w$2(this))},b$1.prototype.render=k$2,t$1=[],r$1=typeof Promise=="function"?Promise.prototype.then.bind(Promise.resolve()):setTimeout,f$1=function(ee,te){return ee.__v.__b-te.__v.__b},x$2.__r=0,e$1=0;var t,r,u,i,o=0,f=[],c=[],e=l$1.__b,a=l$1.__r,v=l$1.diffed,l=l$1.__c,m=l$1.unmount;function d(ee,te){l$1.__h&&l$1.__h(r,ee,o||te),o=0;var ne=r.__H||(r.__H={__:[],__h:[]});return ee>=ne.__.length&&ne.__.push({__V:c}),ne.__[ee]}function h(ee){return o=1,s(B$1,ee)}function s(ee,te,ne){var re=d(t++,2);if(re.t=ee,!re.__c&&(re.__=[ne?ne(te):B$1(void 0,te),function(ue){var se=re.__N?re.__N[0]:re.__[0],fe=re.t(se,ue);se!==fe&&(re.__N=[fe,re.__[1]],re.__c.setState({}))}],re.__c=r,!r.u)){var ie=function(ue,se,fe){if(!re.__c.__H)return!0;var ce=re.__c.__H.__.filter(function(_e){return _e.__c});if(ce.every(function(_e){return!_e.__N}))return!oe||oe.call(this,ue,se,fe);var pe=!1;return ce.forEach(function(_e){if(_e.__N){var ae=_e.__[0];_e.__=_e.__N,_e.__N=void 0,ae!==_e.__[0]&&(pe=!0)}}),!(!pe&&re.__c.props===ue)&&(!oe||oe.call(this,ue,se,fe))};r.u=!0;var oe=r.shouldComponentUpdate,le=r.componentWillUpdate;r.componentWillUpdate=function(ue,se,fe){if(this.__e){var ce=oe;oe=void 0,ie(ue,se,fe),oe=ce}le&&le.call(this,ue,se,fe)},r.shouldComponentUpdate=ie}return re.__N||re.__}function p(ee,te){var ne=d(t++,3);!l$1.__s&&z$1(ne.__H,te)&&(ne.__=ee,ne.i=te,r.__H.__h.push(ne))}function y(ee,te){var ne=d(t++,4);!l$1.__s&&z$1(ne.__H,te)&&(ne.__=ee,ne.i=te,r.__h.push(ne))}function _(ee){return o=5,F$1(function(){return{current:ee}},[])}function A$1(ee,te,ne){o=6,y(function(){return typeof ee=="function"?(ee(te()),function(){return ee(null)}):ee?(ee.current=te(),function(){return ee.current=null}):void 0},ne==null?ne:ne.concat(ee))}function F$1(ee,te){var ne=d(t++,7);return z$1(ne.__H,te)?(ne.__V=ee(),ne.i=te,ne.__h=ee,ne.__V):ne.__}function T$1(ee,te){return o=8,F$1(function(){return ee},te)}function q$1(ee){var te=r.context[ee.__c],ne=d(t++,9);return ne.c=ee,te?(ne.__==null&&(ne.__=!0,te.sub(r)),te.props.value):ee.__}function x$1(ee,te){l$1.useDebugValue&&l$1.useDebugValue(te?te(ee):ee)}function V$1(){var ee=d(t++,11);if(!ee.__){for(var te=r.__v;te!==null&&!te.__m&&te.__!==null;)te=te.__;var ne=te.__m||(te.__m=[0,0]);ee.__="P"+ne[0]+"-"+ne[1]++}return ee.__}function b(){for(var ee;ee=f.shift();)if(ee.__P&&ee.__H)try{ee.__H.__h.forEach(k$1),ee.__H.__h.forEach(w$1),ee.__H.__h=[]}catch(te){ee.__H.__h=[],l$1.__e(te,ee.__v)}}l$1.__b=function(ee){r=null,e&&e(ee)},l$1.__r=function(ee){a&&a(ee),t=0;var te=(r=ee.__c).__H;te&&(u===r?(te.__h=[],r.__h=[],te.__.forEach(function(ne){ne.__N&&(ne.__=ne.__N),ne.__V=c,ne.__N=ne.i=void 0})):(te.__h.forEach(k$1),te.__h.forEach(w$1),te.__h=[],t=0)),u=r},l$1.diffed=function(ee){v&&v(ee);var te=ee.__c;te&&te.__H&&(te.__H.__h.length&&(f.push(te)!==1&&i===l$1.requestAnimationFrame||((i=l$1.requestAnimationFrame)||j$1)(b)),te.__H.__.forEach(function(ne){ne.i&&(ne.__H=ne.i),ne.__V!==c&&(ne.__=ne.__V),ne.i=void 0,ne.__V=c})),u=r=null},l$1.__c=function(ee,te){te.some(function(ne){try{ne.__h.forEach(k$1),ne.__h=ne.__h.filter(function(re){return!re.__||w$1(re)})}catch(re){te.some(function(ie){ie.__h&&(ie.__h=[])}),te=[],l$1.__e(re,ne.__v)}}),l&&l(ee,te)},l$1.unmount=function(ee){m&&m(ee);var te,ne=ee.__c;ne&&ne.__H&&(ne.__H.__.forEach(function(re){try{k$1(re)}catch(ie){te=ie}}),ne.__H=void 0,te&&l$1.__e(te,ne.__v))};var g$1=typeof requestAnimationFrame=="function";function j$1(ee){var te,ne=function(){clearTimeout(re),g$1&&cancelAnimationFrame(te),setTimeout(ee)},re=setTimeout(ne,100);g$1&&(te=requestAnimationFrame(ne))}function k$1(ee){var te=r,ne=ee.__c;typeof ne=="function"&&(ee.__c=void 0,ne()),r=te}function w$1(ee){var te=r;ee.__c=ee.__(),r=te}function z$1(ee,te){return!ee||ee.length!==te.length||te.some(function(ne,re){return ne!==ee[re]})}function B$1(ee,te){return typeof te=="function"?te(ee):te}function g(ee,te){for(var ne in te)ee[ne]=te[ne];return ee}function C(ee,te){for(var ne in ee)if(ne!=="__source"&&!(ne in te))return!0;for(var re in te)if(re!=="__source"&&ee[re]!==te[re])return!0;return!1}function E(ee,te){return ee===te&&(ee!==0||1/ee==1/te)||ee!=ee&&te!=te}function w(ee){this.props=ee}function x(ee,te){function ne(ie){var oe=this.props.ref,le=oe==ie.ref;return!le&&oe&&(oe.call?oe(null):oe.current=null),te?!te(this.props,ie)||!le:C(this.props,ie)}function re(ie){return this.shouldComponentUpdate=ne,y$1(ee,ie)}return re.displayName="Memo("+(ee.displayName||ee.name)+")",re.prototype.isReactComponent=!0,re.__f=!0,re}(w.prototype=new b$1).isPureReactComponent=!0,w.prototype.shouldComponentUpdate=function(ee,te){return C(this.props,ee)||C(this.state,te)};var R=l$1.__b;l$1.__b=function(ee){ee.type&&ee.type.__f&&ee.ref&&(ee.props.ref=ee.ref,ee.ref=null),R&&R(ee)};var N=typeof Symbol<"u"&&Symbol.for&&Symbol.for("react.forward_ref")||3911;function k(ee){function te(ne){var re=g({},ne);return delete re.ref,ee(re,ne.ref||null)}return te.$$typeof=N,te.render=te,te.prototype.isReactComponent=te.__f=!0,te.displayName="ForwardRef("+(ee.displayName||ee.name)+")",te}var A=function(ee,te){return ee==null?null:S(S(ee).map(te))},O={map:A,forEach:A,count:function(ee){return ee?S(ee).length:0},only:function(ee){var te=S(ee);if(te.length!==1)throw"Children.only";return te[0]},toArray:S},T=l$1.__e;l$1.__e=function(ee,te,ne,re){if(ee.then){for(var ie,oe=te;oe=oe.__;)if((ie=oe.__c)&&ie.__c)return te.__e==null&&(te.__e=ne.__e,te.__k=ne.__k),ie.__c(ee,te)}T(ee,te,ne,re)};var I=l$1.unmount;function L(ee,te,ne){return ee&&(ee.__c&&ee.__c.__H&&(ee.__c.__H.__.forEach(function(re){typeof re.__c=="function"&&re.__c()}),ee.__c.__H=null),(ee=g({},ee)).__c!=null&&(ee.__c.__P===ne&&(ee.__c.__P=te),ee.__c=null),ee.__k=ee.__k&&ee.__k.map(function(re){return L(re,te,ne)})),ee}function U(ee,te,ne){return ee&&(ee.__v=null,ee.__k=ee.__k&&ee.__k.map(function(re){return U(re,te,ne)}),ee.__c&&ee.__c.__P===te&&(ee.__e&&ne.insertBefore(ee.__e,ee.__d),ee.__c.__e=!0,ee.__c.__P=ne)),ee}function D(){this.__u=0,this.t=null,this.__b=null}function F(ee){var te=ee.__.__c;return te&&te.__a&&te.__a(ee)}function M(ee){var te,ne,re;function ie(oe){if(te||(te=ee()).then(function(le){ne=le.default||le},function(le){re=le}),re)throw re;if(!ne)throw te;return y$1(ne,oe)}return ie.displayName="Lazy",ie.__f=!0,ie}function V(){this.u=null,this.o=null}l$1.unmount=function(ee){var te=ee.__c;te&&te.__R&&te.__R(),te&&ee.__h===!0&&(ee.type=null),I&&I(ee)},(D.prototype=new b$1).__c=function(ee,te){var ne=te.__c,re=this;re.t==null&&(re.t=[]),re.t.push(ne);var ie=F(re.__v),oe=!1,le=function(){oe||(oe=!0,ne.__R=null,ie?ie(ue):ue())};ne.__R=le;var ue=function(){if(!--re.__u){if(re.state.__a){var fe=re.state.__a;re.__v.__k[0]=U(fe,fe.__c.__P,fe.__c.__O)}var ce;for(re.setState({__a:re.__b=null});ce=re.t.pop();)ce.forceUpdate()}},se=te.__h===!0;re.__u++||se||re.setState({__a:re.__b=re.__v.__k[0]}),ee.then(le,le)},D.prototype.componentWillUnmount=function(){this.t=[]},D.prototype.render=function(ee,te){if(this.__b){if(this.__v.__k){var ne=document.createElement("div"),re=this.__v.__k[0].__c;this.__v.__k[0]=L(this.__b,ne,re.__O=re.__P)}this.__b=null}var ie=te.__a&&y$1(k$2,null,ee.fallback);return ie&&(ie.__h=null),[y$1(k$2,null,te.__a?null:ee.children),ie]};var W=function(ee,te,ne){if(++ne[1]===ne[0]&&ee.o.delete(te),ee.props.revealOrder&&(ee.props.revealOrder[0]!=="t"||!ee.o.size))for(ne=ee.u;ne;){for(;ne.length>3;)ne.pop()();if(ne[1]<ne[0])break;ee.u=ne=ne[2]}};function P(ee){return this.getChildContext=function(){return ee.context},ee.children}function j(ee){var te=this,ne=ee.i;te.componentWillUnmount=function(){D$1(null,te.l),te.l=null,te.i=null},te.i&&te.i!==ne&&te.componentWillUnmount(),ee.__v?(te.l||(te.i=ne,te.l={nodeType:1,parentNode:ne,childNodes:[],appendChild:function(re){this.childNodes.push(re),te.i.appendChild(re)},insertBefore:function(re,ie){this.childNodes.push(re),te.i.appendChild(re)},removeChild:function(re){this.childNodes.splice(this.childNodes.indexOf(re)>>>1,1),te.i.removeChild(re)}}),D$1(y$1(P,{context:te.context},ee.__v),te.l)):te.l&&te.componentWillUnmount()}function z(ee,te){var ne=y$1(j,{__v:ee,i:te});return ne.containerInfo=te,ne}(V.prototype=new b$1).__a=function(ee){var te=this,ne=F(te.__v),re=te.o.get(ee);return re[0]++,function(ie){var oe=function(){te.props.revealOrder?(re.push(ie),W(te,ee,re)):ie()};ne?ne(oe):oe()}},V.prototype.render=function(ee){this.u=null,this.o=new Map;var te=S(ee.children);ee.revealOrder&&ee.revealOrder[0]==="b"&&te.reverse();for(var ne=te.length;ne--;)this.o.set(te[ne],this.u=[1,0,this.u]);return ee.children},V.prototype.componentDidUpdate=V.prototype.componentDidMount=function(){var ee=this;this.o.forEach(function(te,ne){W(ee,ne,te)})};var B=typeof Symbol<"u"&&Symbol.for&&Symbol.for("react.element")||60103,H=/^(?:accent|alignment|arabic|baseline|cap|clip(?!PathU)|color|dominant|fill|flood|font|glyph(?!R)|horiz|image(!S)|letter|lighting|marker(?!H|W|U)|overline|paint|pointer|shape|stop|strikethrough|stroke|text(?!L)|transform|underline|unicode|units|v|vector|vert|word|writing|x(?!C))[A-Z]/,Z=/^on(Ani|Tra|Tou|BeforeInp|Compo)/,Y=/[A-Z0-9]/g,$=typeof document<"u",q=function(ee){return(typeof Symbol<"u"&&typeof Symbol()=="symbol"?/fil|che|rad/:/fil|che|ra/).test(ee)};function G(ee,te,ne){return te.__k==null&&(te.textContent=""),D$1(ee,te),typeof ne=="function"&&ne(),ee?ee.__c:null}function J(ee,te,ne){return E$1(ee,te),typeof ne=="function"&&ne(),ee?ee.__c:null}b$1.prototype.isReactComponent={},["componentWillMount","componentWillReceiveProps","componentWillUpdate"].forEach(function(ee){Object.defineProperty(b$1.prototype,ee,{configurable:!0,get:function(){return this["UNSAFE_"+ee]},set:function(te){Object.defineProperty(this,ee,{configurable:!0,writable:!0,value:te})}})});var K=l$1.event;function Q(){}function X(){return this.cancelBubble}function nn(){return this.defaultPrevented}l$1.event=function(ee){return K&&(ee=K(ee)),ee.persist=Q,ee.isPropagationStopped=X,ee.isDefaultPrevented=nn,ee.nativeEvent=ee};var tn,en={enumerable:!1,configurable:!0,get:function(){return this.class}},rn=l$1.vnode;l$1.vnode=function(ee){typeof ee.type=="string"&&function(te){var ne=te.props,re=te.type,ie={};for(var oe in ne){var le=ne[oe];if(!(oe==="value"&&"defaultValue"in ne&&le==null||$&&oe==="children"&&re==="noscript"||oe==="class"||oe==="className")){var ue=oe.toLowerCase();oe==="defaultValue"&&"value"in ne&&ne.value==null?oe="value":oe==="download"&&le===!0?le="":ue==="ondoubleclick"?oe="ondblclick":ue!=="onchange"||re!=="input"&&re!=="textarea"||q(ne.type)?ue==="onfocus"?oe="onfocusin":ue==="onblur"?oe="onfocusout":Z.test(oe)?oe=ue:re.indexOf("-")===-1&&H.test(oe)?oe=oe.replace(Y,"-$&").toLowerCase():le===null&&(le=void 0):ue=oe="oninput",ue==="oninput"&&ie[oe=ue]&&(oe="oninputCapture"),ie[oe]=le}}re=="select"&&ie.multiple&&Array.isArray(ie.value)&&(ie.value=S(ne.children).forEach(function(se){se.props.selected=ie.value.indexOf(se.props.value)!=-1})),re=="select"&&ie.defaultValue!=null&&(ie.value=S(ne.children).forEach(function(se){se.props.selected=ie.multiple?ie.defaultValue.indexOf(se.props.value)!=-1:ie.defaultValue==se.props.value})),ne.class&&!ne.className?(ie.class=ne.class,Object.defineProperty(ie,"className",en)):(ne.className&&!ne.class||ne.class&&ne.className)&&(ie.class=ie.className=ne.className),te.props=ie}(ee),ee.$$typeof=B,rn&&rn(ee)};var un=l$1.__r;l$1.__r=function(ee){un&&un(ee),tn=ee.__c};var on=l$1.diffed;l$1.diffed=function(ee){on&&on(ee);var te=ee.props,ne=ee.__e;ne!=null&&ee.type==="textarea"&&"value"in te&&te.value!==ne.value&&(ne.value=te.value==null?"":te.value),tn=null};var ln={ReactCurrentDispatcher:{current:{readContext:function(ee){return tn.__n[ee.__c].props.value}}}};function fn(ee){return y$1.bind(null,ee)}function an(ee){return!!ee&&ee.$$typeof===B}function sn(ee){return an(ee)?F$2.apply(null,arguments):ee}function hn(ee){return!!ee.__k&&(D$1(null,ee),!0)}function vn(ee){return ee&&(ee.base||ee.nodeType===1&&ee)||null}var dn=function(ee,te){return ee(te)},pn=function(ee,te){return ee(te)},mn=k$2;function yn(ee){ee()}function _n(ee){return ee}function bn(){return[!1,yn]}var Sn=y;function gn(ee,te){var ne=te(),re=h({h:{__:ne,v:te}}),ie=re[0].h,oe=re[1];return y(function(){ie.__=ne,ie.v=te,E(ie.__,te())||oe({h:ie})},[ee,ne,te]),p(function(){return E(ie.__,ie.v())||oe({h:ie}),ee(function(){E(ie.__,ie.v())||oe({h:ie})})},[ee]),ne}var Cn={useState:h,useId:V$1,useReducer:s,useEffect:p,useLayoutEffect:y,useInsertionEffect:Sn,useTransition:bn,useDeferredValue:_n,useSyncExternalStore:gn,startTransition:yn,useRef:_,useImperativeHandle:A$1,useMemo:F$1,useCallback:T$1,useContext:q$1,useDebugValue:x$1,version:"17.0.2",Children:O,render:G,hydrate:J,unmountComponentAtNode:hn,createPortal:z,createElement:y$1,createContext:G$1,createFactory:fn,cloneElement:sn,createRef:_$1,Fragment:k$2,isValidElement:an,findDOMNode:vn,Component:b$1,PureComponent:w,memo:x,forwardRef:k,flushSync:pn,unstable_batchedUpdates:dn,StrictMode:mn,Suspense:D,SuspenseList:V,lazy:M,__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED:ln},hasOwn=Object.prototype.hasOwnProperty,toString=Object.prototype.toString,foreach=function(te,ne,re){if(toString.call(ne)!=="[object Function]")throw new TypeError("iterator must be a function");var ie=te.length;if(ie===+ie)for(var oe=0;oe<ie;oe++)ne.call(re,te[oe],oe,te);else for(var le in te)hasOwn.call(te,le)&&ne.call(re,te[le],le,te)},each=foreach,jsonPointer=api;function api(ee,te,ne){if(arguments.length===3)return api.set(ee,te,ne);if(arguments.length===2)return api.get(ee,te);var re=api.bind(api,ee);for(var ie in api)api.hasOwnProperty(ie)&&(re[ie]=api[ie].bind(re,ee));return re}api.get=function(te,ne){for(var re=Array.isArray(ne)?ne:api.parse(ne),ie=0;ie<re.length;++ie){var oe=re[ie];if(!(typeof te=="object"&&oe in te))throw new Error("Invalid reference token: "+oe);te=te[oe]}return te};api.set=function(te,ne,re){var ie=Array.isArray(ne)?ne:api.parse(ne),oe=ie[0];if(ie.length===0)throw Error("Can not set the root object");for(var le=0;le<ie.length-1;++le){var ue=ie[le];typeof ue!="string"&&typeof ue!="number"&&(ue=String(ue)),!(ue==="__proto__"||ue==="constructor"||ue==="prototype")&&(ue==="-"&&Array.isArray(te)&&(ue=te.length),oe=ie[le+1],ue in te||(oe.match(/^(\d+|-)$/)?te[ue]=[]:te[ue]={}),te=te[ue])}return oe==="-"&&Array.isArray(te)&&(oe=te.length),te[oe]=re,this};api.remove=function(ee,te){var ne=Array.isArray(te)?te:api.parse(te),re=ne[ne.length-1];if(re===void 0)throw new Error('Invalid JSON pointer for remove: "'+te+'"');var ie=api.get(ee,ne.slice(0,-1));if(Array.isArray(ie)){var oe=+re;if(re===""&&isNaN(oe))throw new Error('Invalid array index: "'+re+'"');Array.prototype.splice.call(ie,oe,1)}else delete ie[re]};api.dict=function(te,ne){var re={};return api.walk(te,function(ie,oe){re[oe]=ie},ne),re};api.walk=function(te,ne,re){var ie=[];re=re||function(oe){var le=Object.prototype.toString.call(oe);return le==="[object Object]"||le==="[object Array]"},function oe(le){each(le,function(ue,se){ie.push(String(se)),re(ue)?oe(ue):ne(ue,api.compile(ie)),ie.pop()})}(te)};api.has=function(te,ne){try{api.get(te,ne)}catch{return!1}return!0};api.escape=function(te){return te.toString().replace(/~/g,"~0").replace(/\//g,"~1")};api.unescape=function(te){return te.replace(/~1/g,"/").replace(/~0/g,"~")};api.parse=function(te){if(te==="")return[];if(te.charAt(0)!=="/")throw new Error("Invalid JSON pointer: "+te);return te.substring(1).split(/\//).map(api.unescape)};api.compile=function(te){return te.length===0?"":"/"+te.map(api.escape).join("/")};const scriptRel="modulepreload",assetsURL=function(ee){return"/_reactpy/"+ee},seen={},__vitePreload=function(te,ne,re){if(!ne||ne.length===0)return te();const ie=document.getElementsByTagName("link");return Promise.all(ne.map(oe=>{if(oe=assetsURL(oe),oe in seen)return;seen[oe]=!0;const le=oe.endsWith(".css"),ue=le?'[rel="stylesheet"]':"";if(!!re)for(let ce=ie.length-1;ce>=0;ce--){const pe=ie[ce];if(pe.href===oe&&(!le||pe.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${oe}"]${ue}`))return;const fe=document.createElement("link");if(fe.rel=le?"stylesheet":scriptRel,le||(fe.as="script",fe.crossOrigin=""),fe.href=oe,document.head.appendChild(fe),le)return new Promise((ce,pe)=>{fe.addEventListener("load",ce),fe.addEventListener("error",()=>pe(new Error(`Unable to preload CSS for ${oe}`)))})})).then(()=>te())};function convert(ee){return ee.type in eventConverters?eventConverters[ee.type](ee):convertEvent(ee)}const convertEvent=ee=>({bubbles:ee.bubbles,composed:ee.composed,currentTarget:convertElement(ee.currentTarget),defaultPrevented:ee.defaultPrevented,eventPhase:ee.eventPhase,isTrusted:ee.isTrusted,target:convertElement(ee.target),timeStamp:ee.timeStamp,type:ee.type,selection:convertSelection(window.getSelection())}),convertClipboardEvent=ee=>({...convertEvent(ee),clipboardData:convertDataTransferObject(ee.clipboardData)}),convertCompositionEvent=ee=>({...convertUiEvent(ee),data:ee.data}),convertInputEvent=ee=>({...convertUiEvent(ee),data:ee.data,inputType:ee.inputType,dataTransfer:convertDataTransferObject(ee.dataTransfer),isComposing:ee.isComposing}),convertKeyboardEvent=ee=>({...convertUiEvent(ee),code:ee.code,isComposing:ee.isComposing,altKey:ee.altKey,ctrlKey:ee.ctrlKey,key:ee.key,location:ee.location,metaKey:ee.metaKey,repeat:ee.repeat,shiftKey:ee.shiftKey}),convertMouseEvent=ee=>({...convertEvent(ee),altKey:ee.altKey,button:ee.button,buttons:ee.buttons,clientX:ee.clientX,clientY:ee.clientY,ctrlKey:ee.ctrlKey,metaKey:ee.metaKey,pageX:ee.pageX,pageY:ee.pageY,screenX:ee.screenX,screenY:ee.screenY,shiftKey:ee.shiftKey,movementX:ee.movementX,movementY:ee.movementY,offsetX:ee.offsetX,offsetY:ee.offsetY,x:ee.x,y:ee.y,relatedTarget:convertElement(ee.relatedTarget)}),convertTouchEvent=ee=>({...convertUiEvent(ee),altKey:ee.altKey,ctrlKey:ee.ctrlKey,metaKey:ee.metaKey,shiftKey:ee.shiftKey,touches:Array.from(ee.touches).map(convertTouch),changedTouches:Array.from(ee.changedTouches).map(convertTouch),targetTouches:Array.from(ee.targetTouches).map(convertTouch)}),convertUiEvent=ee=>({...convertEvent(ee),detail:ee.detail}),convertAnimationEvent=ee=>({...convertEvent(ee),animationName:ee.animationName,pseudoElement:ee.pseudoElement,elapsedTime:ee.elapsedTime}),convertTransitionEvent=ee=>({...convertEvent(ee),propertyName:ee.propertyName,pseudoElement:ee.pseudoElement,elapsedTime:ee.elapsedTime}),convertFocusEvent=ee=>({...convertUiEvent(ee),relatedTarget:convertElement(ee.relatedTarget)}),convertDeviceOrientationEvent=ee=>({...convertEvent(ee),absolute:ee.absolute,alpha:ee.alpha,beta:ee.beta,gamma:ee.gamma}),convertDragEvent=ee=>({...convertMouseEvent(ee),dataTransfer:convertDataTransferObject(ee.dataTransfer)}),convertGamepadEvent=ee=>({...convertEvent(ee),gamepad:convertGamepad(ee.gamepad)}),convertPointerEvent=ee=>({...convertMouseEvent(ee),pointerId:ee.pointerId,width:ee.width,height:ee.height,pressure:ee.pressure,tiltX:ee.tiltX,tiltY:ee.tiltY,pointerType:ee.pointerType,isPrimary:ee.isPrimary,tangentialPressure:ee.tangentialPressure,twist:ee.twist}),convertWheelEvent=ee=>({...convertMouseEvent(ee),deltaMode:ee.deltaMode,deltaX:ee.deltaX,deltaY:ee.deltaY,deltaZ:ee.deltaZ}),convertSubmitEvent=ee=>({...convertEvent(ee),submitter:convertElement(ee.submitter)}),eventConverters={animationcancel:convertAnimationEvent,animationend:convertAnimationEvent,animationiteration:convertAnimationEvent,animationstart:convertAnimationEvent,beforeinput:convertInputEvent,compositionend:convertCompositionEvent,compositionstart:convertCompositionEvent,compositionupdate:convertCompositionEvent,copy:convertClipboardEvent,cut:convertClipboardEvent,paste:convertClipboardEvent,deviceorientation:convertDeviceOrientationEvent,drag:convertDragEvent,dragend:convertDragEvent,dragenter:convertDragEvent,dragleave:convertDragEvent,dragover:convertDragEvent,dragstart:convertDragEvent,drop:convertDragEvent,error:convertUiEvent,blur:convertFocusEvent,focus:convertFocusEvent,focusin:convertFocusEvent,focusout:convertFocusEvent,gamepadconnected:convertGamepadEvent,gamepaddisconnected:convertGamepadEvent,keydown:convertKeyboardEvent,keypress:convertKeyboardEvent,keyup:convertKeyboardEvent,auxclick:convertMouseEvent,click:convertMouseEvent,dblclick:convertMouseEvent,contextmenu:convertMouseEvent,mousedown:convertMouseEvent,mouseenter:convertMouseEvent,mouseleave:convertMouseEvent,mousemove:convertMouseEvent,mouseout:convertMouseEvent,mouseover:convertMouseEvent,mouseup:convertMouseEvent,scroll:convertMouseEvent,gotpointercapture:convertPointerEvent,lostpointercapture:convertPointerEvent,pointercancel:convertPointerEvent,pointerdown:convertPointerEvent,pointerenter:convertPointerEvent,pointerleave:convertPointerEvent,pointerlockchange:convertPointerEvent,pointerlockerror:convertPointerEvent,pointermove:convertPointerEvent,pointerout:convertPointerEvent,pointerover:convertPointerEvent,pointerup:convertPointerEvent,submit:convertSubmitEvent,touchcancel:convertTouchEvent,touchend:convertTouchEvent,touchmove:convertTouchEvent,touchstart:convertTouchEvent,transitioncancel:convertTransitionEvent,transitionend:convertTransitionEvent,transitionrun:convertTransitionEvent,transitionstart:convertTransitionEvent,wheel:convertWheelEvent};function convertElement(ee){if(!ee||!("tagName"in ee))return null;const te=ee;return{...convertGenericElement(te),...te.tagName in elementConverters?elementConverters[te.tagName](te):{}}}const convertGenericElement=ee=>({tagName:ee.tagName,boundingClientRect:{...ee.getBoundingClientRect()}}),convertMediaElement=ee=>({currentTime:ee.currentTime,duration:ee.duration,ended:ee.ended,error:ee.error,seeking:ee.seeking,volume:ee.volume}),elementConverters={AUDIO:convertMediaElement,BUTTON:ee=>({value:ee.value}),DATA:ee=>({value:ee.value}),DATALIST:ee=>({options:Array.from(ee.options).map(elementConverters.OPTION)}),DIALOG:ee=>({returnValue:ee.returnValue}),FIELDSET:ee=>({elements:Array.from(ee.elements).map(convertElement)}),FORM:ee=>({elements:Array.from(ee.elements).map(convertElement)}),INPUT:ee=>({value:ee.value}),METER:ee=>({value:ee.value}),OPTION:ee=>({value:ee.value}),OUTPUT:ee=>({value:ee.value}),PROGRESS:ee=>({value:ee.value}),SELECT:ee=>({value:ee.value}),TEXTAREA:ee=>({value:ee.value}),VIDEO:convertMediaElement},convertGamepad=ee=>({axes:Array.from(ee.axes),buttons:Array.from(ee.buttons).map(convertGamepadButton),connected:ee.connected,id:ee.id,index:ee.index,mapping:ee.mapping,timestamp:ee.timestamp,hapticActuators:Array.from(ee.hapticActuators).map(convertGamepadHapticActuator)}),convertGamepadButton=ee=>({pressed:ee.pressed,touched:ee.touched,value:ee.value}),convertGamepadHapticActuator=ee=>({type:ee.type}),convertFile=ee=>({lastModified:ee.lastModified,name:ee.name,size:ee.size,type:ee.type});function convertDataTransferObject(ee){if(!ee)return null;const{dropEffect:te,effectAllowed:ne,files:re,items:ie,types:oe}=ee;return{dropEffect:te,effectAllowed:ne,files:Array.from(re).map(convertFile),items:Array.from(ie).map(le=>({kind:le.kind,type:le.type})),types:Array.from(oe)}}function convertSelection(ee){if(!ee)return null;const{type:te,anchorNode:ne,anchorOffset:re,focusNode:ie,focusOffset:oe,isCollapsed:le,rangeCount:ue}=ee;return te==="None"?null:{type:te,anchorNode:convertElement(ne),anchorOffset:re,focusNode:convertElement(ie),focusOffset:oe,isCollapsed:le,rangeCount:ue,selectedText:ee.toString()}}function convertTouch({identifier:ee,pageX:te,pageY:ne,screenX:re,screenY:ie,clientX:oe,clientY:le,force:ue,radiusX:se,radiusY:fe,rotationAngle:ce,target:pe}){return{identifier:ee,pageX:te,pageY:ne,screenX:re,screenY:ie,clientX:oe,clientY:le,force:ue,radiusX:se,radiusY:fe,rotationAngle:ce,target:convertElement(pe)}}async function loadImportSource(ee,te){let ne;if(ee.sourceType==="URL"?ne=await __vitePreload(()=>import(ee.source),[]):ne=await te.loadModule(ee.source),typeof ne.bind!="function")throw new Error(`${ee.source} did not export a function 'bind'`);return re=>{const ie=ne.bind(re,{sendMessage:te.sendMessage,onMessage:te.onMessage});return typeof ie.create=="function"&&typeof ie.render=="function"&&typeof ie.unmount=="function"?{render:oe=>ie.render(createImportSourceElement({client:te,module:ne,binding:ie,model:oe,currentImportSource:ee})),unmount:ie.unmount}:(console.error(`${ee.source} returned an impropper binding`),null)}}function createImportSourceElement(ee){let te;if(ee.model.importSource)if(isImportSourceEqual(ee.currentImportSource,ee.model.importSource))if(ee.module[ee.model.tagName])te=ee.module[ee.model.tagName];else return console.error("Module from source "+stringifyImportSource(ee.currentImportSource)+` does not export ${ee.model.tagName}`),null;else return console.error("Parent element import source "+stringifyImportSource(ee.currentImportSource)+" does not match child's import source "+stringifyImportSource(ee.model.importSource)),null;else te=ee.model.tagName;return ee.binding.create(te,createAttributes(ee.model,ee.client),createChildren(ee.model,ne=>createImportSourceElement({...ee,model:ne})))}function isImportSourceEqual(ee,te){return ee.source===te.source&&ee.sourceType===te.sourceType}function stringifyImportSource(ee){return JSON.stringify({source:ee.source,sourceType:ee.sourceType})}function createChildren(ee,te){return ee.children?ee.children.map(ne=>{switch(typeof ne){case"object":return te(ne);case"string":return ne}}):[]}function createAttributes(ee,te){return Object.fromEntries(Object.entries({...ee.attributes,...Object.fromEntries(Object.entries(ee.eventHandlers||{}).map(([ne,re])=>createEventHandler(te,ne,re)))}).map(normalizeAttribute))}function createEventHandler(ee,te,{target:ne,preventDefault:re,stopPropagation:ie}){return[te,function(){const oe=Array.from(arguments).map(le=>{if(!(typeof le=="object"&&le.nativeEvent))return le;const ue=le;return re&&ue.preventDefault(),ie&&ue.stopPropagation(),convert(ue.nativeEvent)});ee.sendMessage({type:"layout-event",data:oe,target:ne})}]}function normalizeAttribute([ee,te]){let ne=ee,re=te;return ee==="style"&&typeof te=="object"?re=Object.fromEntries(Object.entries(te).map(([ie,oe])=>[snakeToCamel(ie),oe])):ee.startsWith("data_")||ee.startsWith("aria_")||DASHED_HTML_ATTRS.includes(ee)?ne=ee.split("_").join("-"):ne=snakeToCamel(ee),[ne,re]}function snakeToCamel(ee){return ee.replace(/([_][a-z])/g,te=>te.toUpperCase().replace("_",""))}const DASHED_HTML_ATTRS=["accept_charset","http_equiv"],ClientContext=G$1(null);function Layout(ee){const te=h({tagName:""})[0],ne=useForceUpdate();return p(()=>(ee.client.onMessage("layout-update",({path:re,model:ie})=>{re===""?Object.assign(te,ie):jsonPointer.set(te,re,ie),ne()}),ee.client.start(),()=>ee.client.stop()),[te,ee.client]),Cn.createElement(ClientContext.Provider,{value:ee.client},Cn.createElement(Element,{model:te}))}function Element({model:ee}){if(ee.error!==void 0)return ee.error?Cn.createElement("pre",null,ee.error):null;let te;return ee.tagName in SPECIAL_ELEMENTS?te=SPECIAL_ELEMENTS[ee.tagName]:ee.importSource?te=ImportedElement:te=StandardElement,Cn.createElement(te,{model:ee})}function StandardElement({model:ee}){const te=Cn.useContext(ClientContext);return y$1(ee.tagName===""?k$2:ee.tagName,createAttributes(ee,te),...createChildren(ee,ne=>Cn.createElement(Element,{model:ne,key:ne.key})))}function UserInputElement({model:ee}){const te=q$1(ClientContext),ne=createAttributes(ee,te),[re,ie]=Cn.useState(ne.value);Cn.useEffect(()=>ie(ne.value),[ne.value]);const oe=ne.onChange;return typeof oe=="function"&&(ne.onChange=le=>{ie(le.target.value),oe(le)}),y$1(ee.tagName,{...ne,value:re},...createChildren(ee,le=>Cn.createElement(Element,{model:le,key:le.key})))}function ScriptElement({model}){const ref=_(null);return Cn.useEffect(()=>{var ee;if(!ref.current)return;const scriptContent=(ee=model==null?void 0:model.children)==null?void 0:ee.filter(te=>typeof te=="string")[0];let scriptElement;if(model.attributes){scriptElement=document.createElement("script");for(const[te,ne]of Object.entries(model.attributes))scriptElement.setAttribute(te,ne);scriptContent&&scriptElement.appendChild(document.createTextNode(scriptContent)),ref.current.appendChild(scriptElement)}else if(scriptContent){let scriptResult=eval(scriptContent);if(typeof scriptResult=="function")return scriptResult()}},[model.key,ref.current]),Cn.createElement("div",{ref})}function ImportedElement({model:ee}){const te=ee.importSource,ne=useImportSource(ee);if(!te)return null;const re=te.fallback;return te?Cn.createElement("div",{ref:ne}):re?typeof re=="string"?Cn.createElement("div",null,re):Cn.createElement(StandardElement,{model:re}):null}function useForceUpdate(){const[,ee]=h(!1);return()=>ee(te=>!te)}function useImportSource(ee){const te=ee.importSource,ne=_(null),re=Cn.useContext(ClientContext),[ie,oe]=h(null);return Cn.useEffect(()=>{let le=!1;return te&&loadImportSource(te,re).then(ue=>{!le&&ne.current&&oe(ue(ne.current))}),()=>{le=!0,ie&&te&&!te.unmountBeforeUpdate&&ie.unmount()}},[re,te,oe,ne.current]),p(()=>{if(!!(ie&&te)&&(ie.render(ee),te.unmountBeforeUpdate))return ie.unmount}),ne}const SPECIAL_ELEMENTS={input:UserInputElement,script:ScriptElement,select:UserInputElement,textarea:UserInputElement};function mount(ee,te){G(Cn.createElement(Layout,{client:te}),ee)}const logger={log:(...ee)=>console.log("[ReactPy]",...ee),warn:(...ee)=>console.warn("[ReactPy]",...ee),error:(...ee)=>console.error("[ReactPy]",...ee)};class SimpleReactPyClient{constructor(te){ge(this,"resolveShouldOpen");ge(this,"resolveShouldClose");ge(this,"urls");ge(this,"handlers");ge(this,"socket");this.handlers={"connection-open":[],"connection-close":[],"layout-update":[]},this.urls=getServerUrls(te.serverLocation||{url:document.location.origin,route:document.location.pathname,query:document.location.search}),this.resolveShouldOpen=()=>{throw new Error("Could not start client")},this.resolveShouldClose=()=>{throw new Error("Could not stop client")};const ne=new Promise(ie=>this.resolveShouldOpen=ie),re=new Promise(ie=>this.resolveShouldClose=ie);this.socket=startReconnectingWebSocket({shouldOpen:ne,shouldClose:re,url:this.urls.stream,onOpen:()=>this.handleIncoming({type:"connection-open"}),onMessage:async({data:ie})=>this.handleIncoming(JSON.parse(ie)),onClose:()=>this.handleIncoming({type:"connection-close"}),...te.reconnectOptions})}start(){logger.log("starting client..."),this.resolveShouldOpen(void 0)}stop(){logger.log("stopping client..."),this.resolveShouldClose(void 0)}onMessage(te,ne){this.handlers[te].push(ne)}sendMessage(te){var ne;(ne=this.socket.current)==null||ne.send(JSON.stringify(te))}loadModule(te){return __vitePreload(()=>import(`${this.urls.modules}/${te}`),[])}handleIncoming(te){if(!te.type){logger.warn("Received message without type",te);return}const ne=this.handlers[te.type];if(!ne){logger.warn("Received message without handler",te);return}ne.forEach(re=>re(te))}}function getServerUrls(ee){const te=new URL(`${ee.url||document.location.origin}/_reactpy`),ne=`${te}/modules`,re=`${te}/assets`,ie=`ws${te.protocol==="https:"?"s":""}`,oe=rtrim(`${te.pathname}/stream${ee.route||""}`,"/"),le=`${ie}://${te.host}${oe}${ee.query}`;return{base:te,modules:ne,assets:re,stream:le}}function startReconnectingWebSocket(ee){const{maxInterval:te=6e4,maxRetries:ne=50,backoffRate:re=1.1,intervalJitter:ie=.1}=ee,oe=750;let le=0,ue=oe,se=!1,fe=!1;const ce={},pe=()=>{se||(ce.current=new WebSocket(ee.url),ce.current.onopen=()=>{fe=!0,logger.log("client connected"),ue=oe,le=0,ee.onOpen()},ce.current.onmessage=ee.onMessage,ce.current.onclose=()=>{if(!fe){logger.log("failed to connect");return}if(logger.log("client disconnected"),ee.onClose(),le>=ne)return;const _e=addJitter(ue,ie);logger.log(`reconnecting in ${(_e/1e3).toPrecision(4)} seconds...`),setTimeout(pe,_e),ue=nextInterval(ue,re,te),le++})};return ee.shouldOpen.then(pe),ee.shouldClose.then(()=>{var _e;se=!0,(_e=ce.current)==null||_e.close()}),ce}function nextInterval(ee,te,ne){return Math.min(ee*te,ne)}function addJitter(ee,te){return ee+(Math.random()*te*ee*2-te*ee)}function rtrim(ee,te){return ee.replace(new RegExp(`${te}+$`),"")}function app(ee){const te=new SimpleReactPyClient({serverLocation:{url:document.location.origin,route:document.location.pathname,query:document.location.search}});mount(ee,te)}app(document.getElementById("app"));
@@ -1,13 +1,13 @@
1
- <!DOCTYPE html>
1
+ <!doctype html>
2
2
  <html lang="en">
3
3
  <head>
4
4
  <meta charset="utf-8" />
5
+
5
6
  <!-- we replace this with user-provided head elements -->
6
7
  {__head__}
7
- <script type="module" crossorigin src="/_reactpy/assets/index.53b29c63.js"></script>
8
+ <script type="module" crossorigin src="/_reactpy/assets/index.a1f87a11.js"></script>
8
9
  </head>
9
10
  <body>
10
11
  <div id="app"></div>
11
-
12
12
  </body>
13
13
  </html>