pulse-framework 0.1.62__py3-none-any.whl

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 (126) hide show
  1. pulse/__init__.py +1493 -0
  2. pulse/_examples.py +29 -0
  3. pulse/app.py +1086 -0
  4. pulse/channel.py +607 -0
  5. pulse/cli/__init__.py +0 -0
  6. pulse/cli/cmd.py +575 -0
  7. pulse/cli/dependencies.py +181 -0
  8. pulse/cli/folder_lock.py +134 -0
  9. pulse/cli/helpers.py +271 -0
  10. pulse/cli/logging.py +102 -0
  11. pulse/cli/models.py +35 -0
  12. pulse/cli/packages.py +262 -0
  13. pulse/cli/processes.py +292 -0
  14. pulse/cli/secrets.py +39 -0
  15. pulse/cli/uvicorn_log_config.py +87 -0
  16. pulse/code_analysis.py +38 -0
  17. pulse/codegen/__init__.py +0 -0
  18. pulse/codegen/codegen.py +359 -0
  19. pulse/codegen/templates/__init__.py +0 -0
  20. pulse/codegen/templates/layout.py +106 -0
  21. pulse/codegen/templates/route.py +345 -0
  22. pulse/codegen/templates/routes_ts.py +42 -0
  23. pulse/codegen/utils.py +20 -0
  24. pulse/component.py +237 -0
  25. pulse/components/__init__.py +0 -0
  26. pulse/components/for_.py +83 -0
  27. pulse/components/if_.py +86 -0
  28. pulse/components/react_router.py +94 -0
  29. pulse/context.py +108 -0
  30. pulse/cookies.py +322 -0
  31. pulse/decorators.py +344 -0
  32. pulse/dom/__init__.py +0 -0
  33. pulse/dom/elements.py +1024 -0
  34. pulse/dom/events.py +445 -0
  35. pulse/dom/props.py +1250 -0
  36. pulse/dom/svg.py +0 -0
  37. pulse/dom/tags.py +328 -0
  38. pulse/dom/tags.pyi +480 -0
  39. pulse/env.py +178 -0
  40. pulse/form.py +538 -0
  41. pulse/helpers.py +541 -0
  42. pulse/hooks/__init__.py +0 -0
  43. pulse/hooks/core.py +452 -0
  44. pulse/hooks/effects.py +88 -0
  45. pulse/hooks/init.py +668 -0
  46. pulse/hooks/runtime.py +464 -0
  47. pulse/hooks/setup.py +254 -0
  48. pulse/hooks/stable.py +138 -0
  49. pulse/hooks/state.py +192 -0
  50. pulse/js/__init__.py +125 -0
  51. pulse/js/__init__.pyi +115 -0
  52. pulse/js/_types.py +299 -0
  53. pulse/js/array.py +339 -0
  54. pulse/js/console.py +50 -0
  55. pulse/js/date.py +119 -0
  56. pulse/js/document.py +145 -0
  57. pulse/js/error.py +140 -0
  58. pulse/js/json.py +66 -0
  59. pulse/js/map.py +97 -0
  60. pulse/js/math.py +69 -0
  61. pulse/js/navigator.py +79 -0
  62. pulse/js/number.py +57 -0
  63. pulse/js/obj.py +81 -0
  64. pulse/js/object.py +172 -0
  65. pulse/js/promise.py +172 -0
  66. pulse/js/pulse.py +115 -0
  67. pulse/js/react.py +495 -0
  68. pulse/js/regexp.py +57 -0
  69. pulse/js/set.py +124 -0
  70. pulse/js/string.py +38 -0
  71. pulse/js/weakmap.py +53 -0
  72. pulse/js/weakset.py +48 -0
  73. pulse/js/window.py +205 -0
  74. pulse/messages.py +202 -0
  75. pulse/middleware.py +471 -0
  76. pulse/plugin.py +96 -0
  77. pulse/proxy.py +242 -0
  78. pulse/py.typed +0 -0
  79. pulse/queries/__init__.py +0 -0
  80. pulse/queries/client.py +609 -0
  81. pulse/queries/common.py +101 -0
  82. pulse/queries/effect.py +55 -0
  83. pulse/queries/infinite_query.py +1418 -0
  84. pulse/queries/mutation.py +295 -0
  85. pulse/queries/protocol.py +136 -0
  86. pulse/queries/query.py +1314 -0
  87. pulse/queries/store.py +120 -0
  88. pulse/react_component.py +88 -0
  89. pulse/reactive.py +1208 -0
  90. pulse/reactive_extensions.py +1172 -0
  91. pulse/render_session.py +768 -0
  92. pulse/renderer.py +584 -0
  93. pulse/request.py +205 -0
  94. pulse/routing.py +598 -0
  95. pulse/serializer.py +279 -0
  96. pulse/state.py +556 -0
  97. pulse/test_helpers.py +15 -0
  98. pulse/transpiler/__init__.py +111 -0
  99. pulse/transpiler/assets.py +81 -0
  100. pulse/transpiler/builtins.py +1029 -0
  101. pulse/transpiler/dynamic_import.py +130 -0
  102. pulse/transpiler/emit_context.py +49 -0
  103. pulse/transpiler/errors.py +96 -0
  104. pulse/transpiler/function.py +611 -0
  105. pulse/transpiler/id.py +18 -0
  106. pulse/transpiler/imports.py +341 -0
  107. pulse/transpiler/js_module.py +336 -0
  108. pulse/transpiler/modules/__init__.py +33 -0
  109. pulse/transpiler/modules/asyncio.py +57 -0
  110. pulse/transpiler/modules/json.py +24 -0
  111. pulse/transpiler/modules/math.py +265 -0
  112. pulse/transpiler/modules/pulse/__init__.py +5 -0
  113. pulse/transpiler/modules/pulse/tags.py +250 -0
  114. pulse/transpiler/modules/typing.py +63 -0
  115. pulse/transpiler/nodes.py +1987 -0
  116. pulse/transpiler/py_module.py +135 -0
  117. pulse/transpiler/transpiler.py +1100 -0
  118. pulse/transpiler/vdom.py +256 -0
  119. pulse/types/__init__.py +0 -0
  120. pulse/types/event_handler.py +50 -0
  121. pulse/user_session.py +386 -0
  122. pulse/version.py +69 -0
  123. pulse_framework-0.1.62.dist-info/METADATA +198 -0
  124. pulse_framework-0.1.62.dist-info/RECORD +126 -0
  125. pulse_framework-0.1.62.dist-info/WHEEL +4 -0
  126. pulse_framework-0.1.62.dist-info/entry_points.txt +3 -0
pulse/version.py ADDED
@@ -0,0 +1,69 @@
1
+ """
2
+ Pulse package version indicator.
3
+
4
+ This module exposes `__version__` which is guaranteed to match the
5
+ distribution version declared in `pyproject.toml` when installed.
6
+
7
+ During editable/development usage (when importlib.metadata cannot find the
8
+ installed distribution), we fall back to reading the nearby `pyproject.toml`
9
+ to keep version information consistent without duplication.
10
+ """
11
+
12
+ from __future__ import annotations
13
+
14
+ from importlib.metadata import PackageNotFoundError
15
+ from importlib.metadata import version as _pkg_version
16
+ from pathlib import Path
17
+
18
+ __all__ = ["__version__"]
19
+
20
+
21
+ def _read_local_pyproject_version() -> str | None:
22
+ """Best-effort read of version from a local pyproject.toml (dev/editable).
23
+
24
+ Searches upwards from this file to find `packages/pulse/python/pyproject.toml` and
25
+ parses the minimal `version = "x.y.z"` line without importing tomllib to
26
+ avoid unnecessary dependency at runtime.
27
+ """
28
+
29
+ try:
30
+ here = Path(__file__).resolve()
31
+ root = (
32
+ here.parent.parent.parent
33
+ ) # packages/pulse/python/src/pulse -> packages/pulse/python
34
+ pyproject = root / "pyproject.toml"
35
+ if not pyproject.exists():
36
+ return None
37
+ for line in pyproject.read_text().splitlines():
38
+ line = line.strip()
39
+ if line.startswith("version") and "=" in line:
40
+ # naive parse: version = "0.0.0"
41
+ try:
42
+ _, rhs = line.split("=", 1)
43
+ rhs = rhs.strip().strip("\"'")
44
+ if rhs:
45
+ return rhs
46
+ except Exception:
47
+ return None
48
+ return None
49
+ except Exception:
50
+ return None
51
+
52
+
53
+ def _version() -> str:
54
+ # Primary: installed distribution metadata
55
+ try:
56
+ return _pkg_version("pulse-framework")
57
+ except PackageNotFoundError:
58
+ pass
59
+
60
+ # Fallback: local pyproject during dev/editable installs
61
+ local = _read_local_pyproject_version()
62
+ if local:
63
+ return local
64
+
65
+ # Last resort to avoid exceptions (should not happen in practice)
66
+ return "0.0.0"
67
+
68
+
69
+ __version__: str = _version()
@@ -0,0 +1,198 @@
1
+ Metadata-Version: 2.3
2
+ Name: pulse-framework
3
+ Version: 0.1.62
4
+ Summary: Pulse - Full-stack framework for building real-time React applications in Python
5
+ Requires-Dist: websockets>=12.0
6
+ Requires-Dist: fastapi>=0.128.0
7
+ Requires-Dist: uvicorn>=0.24.0
8
+ Requires-Dist: mako>=1.3.10
9
+ Requires-Dist: typer>=0.16.0
10
+ Requires-Dist: python-socketio>=5.16.0
11
+ Requires-Dist: rich>=13.7.1
12
+ Requires-Dist: python-multipart>=0.0.20
13
+ Requires-Dist: python-dateutil>=2.9.0.post0
14
+ Requires-Dist: starlette>=0.50.0,<0.51.0
15
+ Requires-Dist: urllib3>=2.6.3
16
+ Requires-Dist: watchfiles>=1.1.0
17
+ Requires-Dist: httpx>=0.28.1
18
+ Requires-Python: >=3.11
19
+ Description-Content-Type: text/markdown
20
+
21
+ # Pulse Python
22
+
23
+ Core Python framework for building full-stack reactive web apps with React frontends.
24
+
25
+ ## Architecture
26
+
27
+ Server-driven UI model: Python components render to VDOM, synced to React via WebSocket. State changes trigger re-renders; diffs are sent to client.
28
+
29
+ ```
30
+ ┌─────────────────────────────────────────────────────────────────┐
31
+ │ Python Server │
32
+ │ ┌──────────┐ ┌───────────────┐ ┌──────────────────────────┐ │
33
+ │ │ App │──│ RenderSession │──│ VDOM Renderer │ │
34
+ │ │ (FastAPI)│ │ (per browser) │ │ (diff & serialize) │ │
35
+ │ └──────────┘ └───────────────┘ └──────────────────────────┘ │
36
+ │ │ │ │ │
37
+ │ │ ┌──────┴───────┐ │ │
38
+ │ │ │ Hooks │ │ │
39
+ │ │ │ (state/setup)│ │ │
40
+ │ │ └──────────────┘ │ │
41
+ └───────┼───────────────────────────────────────┼─────────────────┘
42
+ │ Socket.IO │ VDOM updates
43
+ ▼ ▼
44
+ ┌─────────────────────────────────────────────────────────────────┐
45
+ │ Browser (React) │
46
+ └─────────────────────────────────────────────────────────────────┘
47
+ ```
48
+
49
+ ## Folder Structure
50
+
51
+ ```
52
+ src/pulse/
53
+ ├── app.py # Main App class, FastAPI + Socket.IO setup
54
+ ├── channel.py # Bidirectional real-time channels
55
+ ├── routing.py # Route/Layout definitions, URL matching
56
+ ├── vdom.py # VDOM node types (Element, Component, Node)
57
+ ├── renderer.py # VDOM rendering and diffing
58
+ ├── render_session.py # Per-browser session, manages mounted routes
59
+ ├── reactive.py # Signal/Computed/Effect primitives
60
+ ├── reactive_extensions.py # ReactiveList, ReactiveDict, ReactiveSet
61
+ ├── state.py # State management
62
+ ├── serializer.py # Python<->JSON serialization
63
+ ├── middleware.py # Request middleware (prerender, connect, message)
64
+ ├── plugin.py # Plugin interface for extensions
65
+ ├── form.py # Form handling
66
+ ├── context.py # PulseContext (request/session context)
67
+ ├── cookies.py # Cookie management
68
+ ├── request.py # PulseRequest abstraction
69
+ ├── user_session.py # User session storage
70
+ ├── helpers.py # Utilities (CSSProperties, later, repeat)
71
+ ├── decorators.py # @computed, @effect decorators
72
+ ├── messages.py # Client<->server message types
73
+ ├── react_component.py # ReactComponent wrapper for JS libraries
74
+
75
+ ├── hooks/ # Server-side hooks (like React hooks)
76
+ │ ├── core.py # Hook registry, HooksAPI
77
+ │ ├── runtime.py # session(), route(), navigate(), redirect()
78
+ │ ├── states.py # Reactive state hook
79
+ │ ├── effects.py # Side effects hook
80
+ │ ├── setup.py # Initialization hook
81
+ │ ├── init.py # One-time setup hook
82
+ │ └── stable.py # Memoization hook
83
+
84
+ ├── queries/ # Data fetching (like TanStack Query)
85
+ │ ├── query.py # @query decorator
86
+ │ ├── mutation.py # @mutation decorator
87
+ │ ├── infinite_query.py # Pagination support
88
+ │ ├── client.py # QueryClient for cache management
89
+ │ └── store.py # Query state store
90
+
91
+ ├── components/ # Built-in components
92
+ │ ├── for_.py # <For> loop component
93
+ │ ├── if_.py # <If> conditional component
94
+ │ └── react_router.py # Link, Outlet for routing
95
+
96
+ ├── html/ # HTML element bindings
97
+ │ ├── tags.py # div, span, button, etc.
98
+ │ ├── props.py # Typed props for HTML elements
99
+ │ ├── events.py # Event types (MouseEvent, etc.)
100
+ │ └── elements.py # Element type definitions
101
+
102
+ ├── transpiler/ # Python->JS transpilation
103
+ │ ├── function.py # JsFunction, @javascript decorator
104
+ │ └── imports.py # Import/CssImport for client-side JS
105
+
106
+ ├── codegen/ # Code generation for React Router
107
+ │ ├── codegen.py # Generates routes.ts, loaders
108
+ │ └── templates/ # Mako templates for generated code
109
+
110
+ ├── cli/ # Command-line interface
111
+ │ ├── cmd.py # pulse run, pulse build
112
+ │ └── processes.py # Dev server process management
113
+
114
+ └── js/ # JS API stubs for transpilation
115
+ ├── window.py, document.py, navigator.py
116
+ ├── array.py, object.py, string.py
117
+ └── ...
118
+ ```
119
+
120
+ ## Key Concepts
121
+
122
+ ### App
123
+
124
+ Entry point defining routes, middleware, plugins.
125
+
126
+ ```python
127
+ import pulse as ps
128
+
129
+ app = ps.App(routes=[
130
+ ps.Route("/", home),
131
+ ps.Layout("/dashboard", layout, children=[
132
+ ps.Route("/", dashboard),
133
+ ]),
134
+ ])
135
+ ```
136
+
137
+ ### Components
138
+
139
+ Functions returning VDOM. Use `@ps.component` for stateful components.
140
+
141
+ ```python
142
+ def greeting(name: str):
143
+ return ps.div(f"Hello, {name}!")
144
+
145
+ @ps.component
146
+ def counter():
147
+ count = ps.states.use(0)
148
+ return ps.button(f"Count: {count()}", onClick=lambda _: count.set(count() + 1))
149
+ ```
150
+
151
+ ### Reactivity
152
+
153
+ - `Signal[T]` - reactive value
154
+ - `Computed[T]` - derived value
155
+ - `Effect` - side effect on change
156
+
157
+ ### Hooks
158
+
159
+ Server-side hooks via `ps.state`, `ps.effect`, `ps.setup`:
160
+ - `ps.state(StateClass)` - reactive state (auto-keyed by callsite; use `key=` for manual control)
161
+ - `@ps.effect` - side effects decorator
162
+ - `ps.setup(fn)` - one-time initialization
163
+
164
+ ### Queries
165
+
166
+ Data fetching with caching:
167
+
168
+ ```python
169
+ @ps.query
170
+ async def fetch_user(id: str):
171
+ return await db.get_user(id)
172
+ ```
173
+
174
+ ### Channels
175
+
176
+ Bidirectional real-time messaging:
177
+
178
+ ```python
179
+ ch = ps.channel("chat")
180
+
181
+ @ch.on("message")
182
+ def handle_message(data):
183
+ ch.broadcast("new_message", data)
184
+ ```
185
+
186
+ ## Main Exports
187
+
188
+ - `App`, `Route`, `Layout` - app/routing
189
+ - `component` - server-side component decorator
190
+ - `states`, `effects`, `setup`, `init` - hooks
191
+ - `query`, `mutation`, `infinite_query` - data fetching
192
+ - `channel` - real-time channels
193
+ - `State`, `@computed`, `@effect` - reactivity
194
+ - `ReactiveList`, `ReactiveDict`, `ReactiveSet` - reactive containers
195
+ - `div`, `span`, `button`, ... - HTML elements
196
+ - `For`, `If`, `Link`, `Outlet` - built-in components
197
+ - `@react_component` - wrap JS components
198
+ - `@javascript` - transpile Python to JS
@@ -0,0 +1,126 @@
1
+ pulse/__init__.py,sha256=_7WUYtxNI78XXdnVu0CFTxRInlCEaP1tGEf-WXMU48I,31993
2
+ pulse/_examples.py,sha256=dFuhD2EVXsbvAeexoG57s4VuN4gWLaTMOEMNYvlPm9A,561
3
+ pulse/app.py,sha256=KnP6U8uHgfBbFMguDcVk0KgjakY1UC1NJk2rS5l6Sas,35145
4
+ pulse/channel.py,sha256=sQrDLh3k9Z8CyJQkEHzKu4h-yR4XSTgAA3OCQax3Ciw,15766
5
+ pulse/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
+ pulse/cli/cmd.py,sha256=zh3Ah6c16cNg3o_v_If_S58Qe8rvxNe5M2VrTkwvDU8,15957
7
+ pulse/cli/dependencies.py,sha256=ezFw-7YWnJcvB1k25b0nB_OaOaP-EKtleNtBE2oJUUk,4603
8
+ pulse/cli/folder_lock.py,sha256=-AKld2iM91G0uHB3F5ARD0QAjOw0TmsYYGaFgy_V350,3477
9
+ pulse/cli/helpers.py,sha256=XXRRXeGFgeq-jbp0QGFFVq_aGg_Kp7_AkYsTK8LfSdg,7810
10
+ pulse/cli/logging.py,sha256=3uuB1dqI-lHJkodNUURN6UMWdKF5UQ9spNG-hBG7bA4,2516
11
+ pulse/cli/models.py,sha256=NBV5byBDNoAQSk0vKwibLjoxuA85XBYIyOVJn64L8oU,858
12
+ pulse/cli/packages.py,sha256=DSnhxz61AoLVvBre3c0dnVYSpiKPI0rKFq4YmgM_VlA,7220
13
+ pulse/cli/processes.py,sha256=BFSKTRoNlCTAi3lDAjKHsKN1c-S032eol0tFd84pdVQ,7566
14
+ pulse/cli/secrets.py,sha256=dNfQe6AzSYhZuWveesjCRHIbvaPd3-F9lEJ-kZA7ROw,921
15
+ pulse/cli/uvicorn_log_config.py,sha256=f7ikDc5foXh3TmFMrnfnW8yev48ZAdlo8F4F_aMVoVk,2391
16
+ pulse/code_analysis.py,sha256=NBba_7VtOxZYMyfku_p-bWkG0O_1pi1AxcaNyVM1nmY,1024
17
+ pulse/codegen/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
18
+ pulse/codegen/codegen.py,sha256=Zw55vzevg_17hFtSi6KLl-EWSiABKRfZe6fB-cWpLAk,10330
19
+ pulse/codegen/templates/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
20
+ pulse/codegen/templates/layout.py,sha256=nmWPQcO9SRXc3mCCVLCmykreSF96TqQfdDY7dvUBxRg,4737
21
+ pulse/codegen/templates/route.py,sha256=UjBrb3e_8tMkd1OjBjEsnYmK6PCQqOYZBWDuU59FcrI,9234
22
+ pulse/codegen/templates/routes_ts.py,sha256=nPgKCvU0gzue2k6KlOL1TJgrBqqRLmyy7K_qKAI8zAE,1129
23
+ pulse/codegen/utils.py,sha256=QoXcV-h-DLLmq_t03hDNUePS0fNnofUQLoR-TXzDFCY,539
24
+ pulse/component.py,sha256=TVgV0dgNDf2Smt2xsJVD0-Wejsnqm14n-NxBzsdObjc,6227
25
+ pulse/components/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
26
+ pulse/components/for_.py,sha256=lrt1JHegf4OkBbL9nrMOy7zxmbuD8Kn11x32ZGS72lY,2390
27
+ pulse/components/if_.py,sha256=5IOq3R70B-JdI-fvDNYDyAaSEtO8L5OaiqHp-jUn-Kw,2153
28
+ pulse/components/react_router.py,sha256=Nl6juntLSowFc38q7g_VMdcc4ju6lj8DUhpNR2NuOKQ,2934
29
+ pulse/context.py,sha256=odTQlOhVRIwNvtatrmPe_Fd8Zk0rMcbcqQHBxvWYH5o,2677
30
+ pulse/cookies.py,sha256=ozfdBKExdbpeM5ileIA1z8BZA5hoUrZ5_iO9fIMrgRk,8768
31
+ pulse/decorators.py,sha256=BtNaisiqaJvlCuoqBgqQWbeFklDYLDrO1o1MRzFlybY,9932
32
+ pulse/dom/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
33
+ pulse/dom/elements.py,sha256=YHXkVpfMAC4-0o61fK-E0LGTOM3KMCtBfpHHAwLx7dw,23241
34
+ pulse/dom/events.py,sha256=yHioH8Y-b7raOaZ43JuCxk2lUBryUAcDSc-5VhXtiSI,14699
35
+ pulse/dom/props.py,sha256=WrPwOYSoJmn-VWxU2KvJC1j64L4tlT8X2JpabK94gYQ,26721
36
+ pulse/dom/svg.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
37
+ pulse/dom/tags.py,sha256=U6mKmwB9JAFM6LTESMJcoIejNfnyxIdQo2-TLM5OaZ0,7585
38
+ pulse/dom/tags.pyi,sha256=0BC7zTh22roPBuMQawL8hgI6IrfN8xJZuDIoKMd4QKc,14393
39
+ pulse/env.py,sha256=etfubfwq7VWlo2iKy_972WtHZSiVe4StAnjFga0xgj8,4244
40
+ pulse/form.py,sha256=dzzcxuIkA8EOAETrbMV916Jv_tlgVuoBKfgL3P2MySo,14058
41
+ pulse/helpers.py,sha256=feHkC2g3DgfGN7FrvgRPZjmXzBjBYXwFu6wRPdy3w_I,15056
42
+ pulse/hooks/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
43
+ pulse/hooks/core.py,sha256=tDEcB_CTD4yI5bNKn7CtB40sRKIanGNqPD5_qLgSzf4,10982
44
+ pulse/hooks/effects.py,sha256=cEPurXwRQoFmxasI0tZE1cQsZYnZr6VB5mWMUK0Db8c,2604
45
+ pulse/hooks/init.py,sha256=PhjVBLlHpodPzVrRcx_QfEUrsx_6gEX_NuVhe6ojiYI,17834
46
+ pulse/hooks/runtime.py,sha256=nxqwl8ByclIh5i3ZcCN6L3f0X3ZpwOBWajLb_FSbcDw,11839
47
+ pulse/hooks/setup.py,sha256=ILbn2v6UFJPFBOWnJef1X2A9JLpIagEHN9Mx0d9947I,6925
48
+ pulse/hooks/stable.py,sha256=y3V6gFEs7XU1ru92krOpjv2_rj_EzqUpy4lncSyLkQ4,3707
49
+ pulse/hooks/state.py,sha256=ORaYNoPhqpwFBlKleBOSNZebJgFHtt7oMOuHxrmnBHk,5288
50
+ pulse/js/__init__.py,sha256=tj1A6-eR5WS83UNgHb3Dw23m37oJsEuyV0ezUB6kXbg,3636
51
+ pulse/js/__init__.pyi,sha256=WN22WsJB-XFk6auL9zklwG2Kof3zeOsc56A56dJ3MWg,3097
52
+ pulse/js/_types.py,sha256=F4Go2JtJ2dbxq1fXpc2ablG_nyvhvHzOlZLlEv0VmyU,7421
53
+ pulse/js/array.py,sha256=_tC6QZlflWCXOXXUMMtowM3UK7iDWAtFM8BKqR5rjKk,8883
54
+ pulse/js/console.py,sha256=A-GNKEnPby10gdcTdYsBPVfz4m94PYzTXRwGhfaPRpc,1775
55
+ pulse/js/date.py,sha256=qJjdwupuUtKS95u8N8C8FKMKOIB8qjVMsYA3VYfe-tA,3363
56
+ pulse/js/document.py,sha256=SBinVGfb05jFpeyxAE0yk5Z__dkdW_mFsTI-rvgc-S8,3004
57
+ pulse/js/error.py,sha256=v0_DmpN5ESt_CJTrIYfy8980eerjK8mHhQatNV_1M_8,2611
58
+ pulse/js/json.py,sha256=P8nxOANjIxrzUA1XkBrd0SmNyAGyB3pVXZDPnA1OKks,1908
59
+ pulse/js/map.py,sha256=bhw75CUMIearH4JACCs9zAffdzfla3Rae7SKGcCLGoc,2243
60
+ pulse/js/math.py,sha256=OBbMlgoa6ZHLDgmXGNKMj5wYrvroV5ICIx-VsSE5_II,1757
61
+ pulse/js/navigator.py,sha256=2QWSr9xyyBfgd76P472qmayXQRYXIEo-b8zLzvfhHfg,1517
62
+ pulse/js/number.py,sha256=fX2M6hZ5ry2FPsYaHhGlqgO6reBEXw7C-gtu0-8_Zyw,1262
63
+ pulse/js/obj.py,sha256=8JG9OZZ1CNqAFoMTdYtxWhTmb6zs1BqxC-nLT7KYMF8,2030
64
+ pulse/js/object.py,sha256=95WvnGWgB-PL-D7l12UgdxNy_fxO5sJXool3Rx5ahUQ,4433
65
+ pulse/js/promise.py,sha256=vBXcL-U9BuZN-q1jbYhyzQaOL2niDPw4LsD7q7Y_yco,4670
66
+ pulse/js/pulse.py,sha256=m-LgqwhYygVBj7GzjeO-uo8fK5ThyVe7c3QvOJt_vc0,2962
67
+ pulse/js/react.py,sha256=eRMrgM8RsoAIn2lcHDoUYas3l4tImLOW51dwmw9AxQU,12057
68
+ pulse/js/regexp.py,sha256=qO-3nmt7uGN7V_bwimPCN-2RSsPfE6YiY7G1MjoP3YY,1055
69
+ pulse/js/set.py,sha256=omG3g-25GRHxgoKISSB4x-M8UDFlaXtFV9cSIpd5uB0,3017
70
+ pulse/js/string.py,sha256=VsvDF_ve8R9QIiBdDotLP2KpCKwmpEfGgRQWckOCmHk,813
71
+ pulse/js/weakmap.py,sha256=HACZEZ8EZk1xoaCmTXk__opvJLxlJ9_0U3y-01KQkHU,1412
72
+ pulse/js/weakset.py,sha256=jerMG9ubroR29HvOLIm6lkLxMj-GGWbiE57U9F6zRuQ,1256
73
+ pulse/js/window.py,sha256=yC1BjyH2jqp1x-CXJCUFta-ASyZ5668ozQ0AmAjZcxA,4097
74
+ pulse/messages.py,sha256=hz5EUFVHbzXHkcByZcV_Y199vb-M9cGjMMBL1HXPctE,4024
75
+ pulse/middleware.py,sha256=2syzmJ0r9fEa0k1pD7zC_1DHUMs9qLSWRzo5XXtKqsA,10896
76
+ pulse/plugin.py,sha256=bu90qaUVFtZsIsW41dpshVK1vvIGHUsg6mFoiF0Wfso,2370
77
+ pulse/proxy.py,sha256=Rj0hOVnwyI36lrkK9fEKAgFK-WCwt5X526J87A2EvMs,7773
78
+ pulse/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
79
+ pulse/queries/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
80
+ pulse/queries/client.py,sha256=AW42ZPdZJfDkCERpoxQnsiU5cYLfOlZX0sIb9BdIL4E,18495
81
+ pulse/queries/common.py,sha256=TYhn6LyldfmOKYYurxINgCEr3C3WSEwB0cIki1a5iBM,2488
82
+ pulse/queries/effect.py,sha256=7KvV_yK7OHTWhfQbZFGzg_pRhyI2mn25pKIF9AmSmcU,1471
83
+ pulse/queries/infinite_query.py,sha256=oPZq_TEVPHTdMy6-XfjN0hGFy_uhU14vdtn-UsCUHBQ,45764
84
+ pulse/queries/mutation.py,sha256=fhEpOZ7CuHImH4Y02QapYdTJrwe6K52-keb0d67wmms,8274
85
+ pulse/queries/protocol.py,sha256=R8n238Ex9DbYIAVKB83a8FAPtnCiPNhWar-F01K2fTo,3345
86
+ pulse/queries/query.py,sha256=GTZY6xvan4mC3GgLbkRnzo6lSvfRhriN2UznyjyiEWE,38682
87
+ pulse/queries/store.py,sha256=Ct7a-h1-Cq07zEfe9vw-LM85Fm7jIJx7CLAIlsiznlU,3444
88
+ pulse/react_component.py,sha256=8RLg4Bi7IcjqbnbEnp4hJpy8t1UsE7mG0UR1Q655LDk,2332
89
+ pulse/reactive.py,sha256=FxxpH7NBtQr7G89iCVN7y1EG21f23GcRi1M-XIxcRQA,31280
90
+ pulse/reactive_extensions.py,sha256=yQ1PpdAh4kMvll7R15T72FOg8NFdG_HGBsGc63dawYk,33754
91
+ pulse/render_session.py,sha256=9gfwuBZRCWuQMN_nFuaAi__1UPN3I3C1mKWtAXyA3-A,21340
92
+ pulse/renderer.py,sha256=fjSsUvCqV12jyN7Y5XspKUfjQJJzKX-Chha5oF5PrAk,16001
93
+ pulse/request.py,sha256=N0oFOLiGxpbgSgxznjvu64lG3YyOcZPKC8JFyKx6X7w,6023
94
+ pulse/routing.py,sha256=LzTITvGgaLI1w7qTDZjFwoBcWAb4O8Dz7AmXeTNYrFU,16903
95
+ pulse/serializer.py,sha256=HmQZgxQiaCx2SL2XwmEQLd_xsk_P8XfLtGciLLLOxx0,7616
96
+ pulse/state.py,sha256=VMphVpYNU1CyHMMg1_kNJO3cfqLXJPAuq9gr9RYyUAw,15922
97
+ pulse/test_helpers.py,sha256=4iO5Ymy3SMvSjh-UaAaSdqm1I_SAJMNjdY2iYVro5f8,436
98
+ pulse/transpiler/__init__.py,sha256=wDDnzqxgHpp_OLtcgyrJEg2jVoTnFIe3SSSTOsMDW8w,4700
99
+ pulse/transpiler/assets.py,sha256=digd5hKYPEgLOzMtDBHULX3Adj1sfngdvnx3quQmgPY,2299
100
+ pulse/transpiler/builtins.py,sha256=QZrow7XJ2wxGMAE-mgZmaUD03egOnXCbikOg8yMx9vQ,30807
101
+ pulse/transpiler/dynamic_import.py,sha256=1AmBl6agGSoTZBp_94seXH733fewLOULUix9BOBPtKI,3372
102
+ pulse/transpiler/emit_context.py,sha256=GyK6VdsBSTVIewQRhBagaV0hlqLTlPZ1i8EAZGi8SaY,1321
103
+ pulse/transpiler/errors.py,sha256=LSBjLBnMglbl2D94p9JR4y-3jDefk6iHSlUVBaBOTu4,2823
104
+ pulse/transpiler/function.py,sha256=a871LZFergCmjs1vr-XlOx4eU1FQKAuYxSLJej-LHHc,17036
105
+ pulse/transpiler/id.py,sha256=CdgA1NndBpZjv0Hp4XiYbKn7wi-x4zWsFSjEiViKxVk,434
106
+ pulse/transpiler/imports.py,sha256=RWw5HJXWwQKRCOoNCMtfBA_CQMBte5XfVTmYqXdQuaA,9702
107
+ pulse/transpiler/js_module.py,sha256=OcIgmrfiA6Hh6aukzgkyX63KsVSHdLzx5ezdKiJFUaQ,11093
108
+ pulse/transpiler/modules/__init__.py,sha256=JGi3CuZoF4sug4dNhQg3MFhpEQqnXec4xRJM2cHNP3c,1184
109
+ pulse/transpiler/modules/asyncio.py,sha256=kWMuFU2vZbqutCM_EXJMvy5SdlB66XiT0czs8lELj_o,1584
110
+ pulse/transpiler/modules/json.py,sha256=Zxe8dsaQ0Eoq3yHUiJeKEx6ibiN36HCT61ScFkLFCeY,676
111
+ pulse/transpiler/modules/math.py,sha256=8gjvdYTMqtuOnXrvX_Lwuo0ywAdSl7cpss4TMk6mQtQ,7044
112
+ pulse/transpiler/modules/pulse/__init__.py,sha256=TfMsiiB53ZFlxdNl7jfCAiMZs-vSRUTxUmqzkLTj-po,91
113
+ pulse/transpiler/modules/pulse/tags.py,sha256=FMN1mWMlnsXa2qO6VmXxUAhFn1uOfGoKPQOjH4ZPlRE,6218
114
+ pulse/transpiler/modules/typing.py,sha256=J9QCkXE6zzwMjiprX2q1BtK-iKLIiS21sQ78JH4RSMc,1716
115
+ pulse/transpiler/nodes.py,sha256=oiAoHZ-q7zmp3zenvVr1aDesyd3nPmC8Uxgm5KG7qeM,50474
116
+ pulse/transpiler/py_module.py,sha256=um4BYLrbs01bpgv2LEBHTbhXXh8Bs174c3ygv5tHHOg,4410
117
+ pulse/transpiler/transpiler.py,sha256=28diEp1yZTs3RsUEJZZdCv1DfzgO9WyOGI-xSHe7y_4,32562
118
+ pulse/transpiler/vdom.py,sha256=Ie36iHa2bkUbui5iMClbMSFDGlKaNxI98Ux0JLPCGT4,6399
119
+ pulse/types/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
120
+ pulse/types/event_handler.py,sha256=psQCydj-WEtBcFU5JU4mDwvyzkW8V2O0g_VFRU2EOHI,1618
121
+ pulse/user_session.py,sha256=nsnsMgqq2xGJZLpbHRMHUHcLrElMP8WcA4gjGMrcoBk,10208
122
+ pulse/version.py,sha256=711vaM1jVIQPgkisGgKZqwmw019qZIsc_QTae75K2pg,1895
123
+ pulse_framework-0.1.62.dist-info/WHEEL,sha256=eh7sammvW2TypMMMGKgsM83HyA_3qQ5Lgg3ynoecH3M,79
124
+ pulse_framework-0.1.62.dist-info/entry_points.txt,sha256=i7aohd3QaPu5IcuGKKvsQQEiMYMe5HcF56QEsaLVO64,46
125
+ pulse_framework-0.1.62.dist-info/METADATA,sha256=Vs73aVk7hGZuZcVSnMmuJC6BY-rMUpTXTtc6UkRsWN0,8300
126
+ pulse_framework-0.1.62.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: uv 0.8.24
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,3 @@
1
+ [console_scripts]
2
+ pulse = pulse.cli.cmd:main
3
+