pulse-framework 0.1.54__py3-none-any.whl → 0.1.56__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 (80) hide show
  1. pulse/__init__.py +5 -6
  2. pulse/app.py +144 -57
  3. pulse/channel.py +139 -7
  4. pulse/cli/cmd.py +16 -2
  5. pulse/code_analysis.py +38 -0
  6. pulse/codegen/codegen.py +61 -62
  7. pulse/codegen/templates/route.py +100 -56
  8. pulse/component.py +128 -6
  9. pulse/components/for_.py +30 -4
  10. pulse/components/if_.py +28 -5
  11. pulse/components/react_router.py +61 -3
  12. pulse/context.py +39 -5
  13. pulse/cookies.py +108 -4
  14. pulse/decorators.py +193 -24
  15. pulse/env.py +56 -2
  16. pulse/form.py +198 -5
  17. pulse/helpers.py +7 -1
  18. pulse/hooks/core.py +135 -5
  19. pulse/hooks/effects.py +61 -77
  20. pulse/hooks/init.py +60 -1
  21. pulse/hooks/runtime.py +241 -0
  22. pulse/hooks/setup.py +77 -0
  23. pulse/hooks/stable.py +58 -1
  24. pulse/hooks/state.py +107 -20
  25. pulse/js/__init__.py +41 -25
  26. pulse/js/array.py +9 -6
  27. pulse/js/console.py +15 -12
  28. pulse/js/date.py +9 -6
  29. pulse/js/document.py +5 -2
  30. pulse/js/error.py +7 -4
  31. pulse/js/json.py +9 -6
  32. pulse/js/map.py +8 -5
  33. pulse/js/math.py +9 -6
  34. pulse/js/navigator.py +5 -2
  35. pulse/js/number.py +9 -6
  36. pulse/js/obj.py +16 -13
  37. pulse/js/object.py +9 -6
  38. pulse/js/promise.py +19 -13
  39. pulse/js/pulse.py +28 -25
  40. pulse/js/react.py +190 -44
  41. pulse/js/regexp.py +7 -4
  42. pulse/js/set.py +8 -5
  43. pulse/js/string.py +9 -6
  44. pulse/js/weakmap.py +8 -5
  45. pulse/js/weakset.py +8 -5
  46. pulse/js/window.py +6 -3
  47. pulse/messages.py +5 -0
  48. pulse/middleware.py +147 -76
  49. pulse/plugin.py +76 -5
  50. pulse/queries/client.py +186 -39
  51. pulse/queries/common.py +52 -3
  52. pulse/queries/infinite_query.py +154 -2
  53. pulse/queries/mutation.py +127 -7
  54. pulse/queries/query.py +112 -11
  55. pulse/react_component.py +66 -3
  56. pulse/reactive.py +314 -30
  57. pulse/reactive_extensions.py +106 -26
  58. pulse/render_session.py +304 -173
  59. pulse/request.py +46 -11
  60. pulse/routing.py +140 -4
  61. pulse/serializer.py +71 -0
  62. pulse/state.py +177 -9
  63. pulse/test_helpers.py +15 -0
  64. pulse/transpiler/__init__.py +13 -3
  65. pulse/transpiler/assets.py +66 -0
  66. pulse/transpiler/dynamic_import.py +131 -0
  67. pulse/transpiler/emit_context.py +49 -0
  68. pulse/transpiler/function.py +6 -2
  69. pulse/transpiler/imports.py +33 -27
  70. pulse/transpiler/js_module.py +64 -8
  71. pulse/transpiler/py_module.py +1 -7
  72. pulse/transpiler/transpiler.py +4 -0
  73. pulse/user_session.py +119 -18
  74. {pulse_framework-0.1.54.dist-info → pulse_framework-0.1.56.dist-info}/METADATA +5 -5
  75. pulse_framework-0.1.56.dist-info/RECORD +127 -0
  76. pulse/js/react_dom.py +0 -30
  77. pulse/transpiler/react_component.py +0 -51
  78. pulse_framework-0.1.54.dist-info/RECORD +0 -124
  79. {pulse_framework-0.1.54.dist-info → pulse_framework-0.1.56.dist-info}/WHEEL +0 -0
  80. {pulse_framework-0.1.54.dist-info → pulse_framework-0.1.56.dist-info}/entry_points.txt +0 -0
pulse/user_session.py CHANGED
@@ -117,42 +117,106 @@ class UserSession(Disposable):
117
117
 
118
118
 
119
119
  class SessionStore(ABC):
120
- """Abstract base for server-backed session stores (DB, cache, memory).
120
+ """Abstract base class for server-backed session stores.
121
121
 
122
- Implementations persist session state on the server and place only a stable
123
- identifier in the cookie. Override methods to integrate with your backend.
122
+ Implementations persist session state on the server and place only a
123
+ stable identifier in the cookie. Override methods to integrate with
124
+ your storage backend (database, cache, memory, etc.).
125
+
126
+ Example:
127
+ ```python
128
+ class RedisSessionStore(SessionStore):
129
+ async def init(self) -> None:
130
+ self.redis = await aioredis.from_url("redis://localhost")
131
+
132
+ async def get(self, sid: str) -> dict[str, Any] | None:
133
+ data = await self.redis.get(f"session:{sid}")
134
+ return json.loads(data) if data else None
135
+
136
+ async def create(self, sid: str) -> dict[str, Any]:
137
+ session = {}
138
+ await self.save(sid, session)
139
+ return session
140
+
141
+ async def delete(self, sid: str) -> None:
142
+ await self.redis.delete(f"session:{sid}")
143
+
144
+ async def save(self, sid: str, session: dict[str, Any]) -> None:
145
+ await self.redis.set(f"session:{sid}", json.dumps(session))
146
+ ```
124
147
  """
125
148
 
126
149
  async def init(self) -> None:
127
- """Optional async initializer, invoked when the app starts.
150
+ """Async initialization, called on app start.
128
151
 
129
- Override in implementations that need to establish connections or
130
- perform startup work. Default is a no-op.
152
+ Override to establish connections or perform startup work.
131
153
  """
132
154
  return None
133
155
 
134
156
  async def close(self) -> None:
135
- """Optional async cleanup, invoked when the app shuts down.
157
+ """Async cleanup, called on app shutdown.
136
158
 
137
- Override in implementations that need to tear down connections or
138
- perform cleanup. Default is a no-op.
159
+ Override to tear down connections or perform cleanup.
139
160
  """
140
161
  return None
141
162
 
142
163
  @abstractmethod
143
- async def get(self, sid: str) -> dict[str, Any] | None: ...
164
+ async def get(self, sid: str) -> dict[str, Any] | None:
165
+ """Retrieve session by ID.
166
+
167
+ Args:
168
+ sid: Session identifier.
169
+
170
+ Returns:
171
+ Session data dict if found, None otherwise.
172
+ """
173
+ ...
144
174
 
145
175
  @abstractmethod
146
- async def create(self, sid: str) -> dict[str, Any]: ...
176
+ async def create(self, sid: str) -> dict[str, Any]:
177
+ """Create a new session.
178
+
179
+ Args:
180
+ sid: Session identifier.
181
+
182
+ Returns:
183
+ New empty session dict.
184
+ """
185
+ ...
147
186
 
148
187
  @abstractmethod
149
- async def delete(self, sid: str) -> None: ...
188
+ async def delete(self, sid: str) -> None:
189
+ """Delete a session.
190
+
191
+ Args:
192
+ sid: Session identifier.
193
+ """
194
+ ...
150
195
 
151
196
  @abstractmethod
152
- async def save(self, sid: str, session: dict[str, Any]) -> None: ...
197
+ async def save(self, sid: str, session: dict[str, Any]) -> None:
198
+ """Persist session data.
199
+
200
+ Args:
201
+ sid: Session identifier.
202
+ session: Session data to persist.
203
+ """
204
+ ...
153
205
 
154
206
 
155
207
  class InMemorySessionStore(SessionStore):
208
+ """In-memory session store implementation.
209
+
210
+ Sessions are stored in memory and lost on restart. Suitable for
211
+ development and testing.
212
+
213
+ Example:
214
+ ```python
215
+ store = ps.InMemorySessionStore()
216
+ app = ps.App(session_store=store)
217
+ ```
218
+ """
219
+
156
220
  def __init__(self) -> None:
157
221
  self._sessions: dict[str, dict[str, Any]] = {}
158
222
 
@@ -167,7 +231,7 @@ class InMemorySessionStore(SessionStore):
167
231
  return session
168
232
 
169
233
  @override
170
- async def save(self, sid: str, session: dict[str, Any]):
234
+ async def save(self, sid: str, session: dict[str, Any]) -> None:
171
235
  # Should not matter as the session ReactiveDict is normally mutated directly
172
236
  self._sessions[sid] = session
173
237
 
@@ -182,10 +246,31 @@ class SessionCookiePayload(TypedDict):
182
246
 
183
247
 
184
248
  class CookieSessionStore:
185
- """Persist session in a signed cookie (Flask-like default).
249
+ """Store sessions in signed cookies. Default session store.
250
+
251
+ The cookie stores a compact JSON of the session signed with HMAC-SHA256
252
+ to prevent tampering. Keep session data small (<4KB).
253
+
254
+ Args:
255
+ secret: Signing secret. Uses PULSE_SECRET env var if not provided.
256
+ Required in production.
257
+ salt: Salt for HMAC. Default: "pulse.session".
258
+ digestmod: Hash algorithm. Default: "sha256".
259
+ max_cookie_bytes: Maximum cookie size. Default: 3800.
260
+
261
+ Environment Variables:
262
+ PULSE_SECRET: Session signing secret (required in production).
186
263
 
187
- The cookie stores a compact JSON of the session and is signed using
188
- HMAC-SHA256 to prevent tampering. Keep the session small (<4KB).
264
+ Example:
265
+ ```python
266
+ # Uses PULSE_SECRET environment variable
267
+ store = ps.CookieSessionStore()
268
+
269
+ # Explicit secret
270
+ store = ps.CookieSessionStore(secret="your-secret-key")
271
+
272
+ app = ps.App(session_store=store)
273
+ ```
189
274
  """
190
275
 
191
276
  digestmod: str
@@ -218,6 +303,15 @@ class CookieSessionStore:
218
303
  self.max_cookie_bytes = max_cookie_bytes
219
304
 
220
305
  def encode(self, sid: str, session: dict[str, Any]) -> str:
306
+ """Encode session to signed cookie value.
307
+
308
+ Args:
309
+ sid: Session identifier.
310
+ session: Session data to encode.
311
+
312
+ Returns:
313
+ Signed cookie value string.
314
+ """
221
315
  # Encode the entire session into the cookie (compressed v1)
222
316
  try:
223
317
  data = SessionCookiePayload(sid=sid, data=dict(session))
@@ -235,7 +329,14 @@ class CookieSessionStore:
235
329
  return self.encode(sid, session)
236
330
 
237
331
  def decode(self, cookie: str) -> tuple[str, Session] | None:
238
- """Decode a signed session cookie (compressed v1)."""
332
+ """Decode and verify signed cookie.
333
+
334
+ Args:
335
+ cookie: Signed cookie value string.
336
+
337
+ Returns:
338
+ Tuple of (sid, session) if valid, None if invalid or tampered.
339
+ """
239
340
  if not cookie:
240
341
  return None
241
342
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: pulse-framework
3
- Version: 0.1.54
3
+ Version: 0.1.56
4
4
  Summary: Pulse - Full-stack framework for building real-time React applications in Python
5
5
  Requires-Dist: websockets>=12.0
6
6
  Requires-Dist: fastapi>=0.104.0
@@ -154,10 +154,10 @@ def counter():
154
154
 
155
155
  ### Hooks
156
156
 
157
- Server-side hooks via `ps.states`, `ps.effects`, `ps.setup`:
158
- - `states.use(initial)` - reactive state
159
- - `effects.use(fn, deps)` - side effects
160
- - `setup.use(fn)` - one-time initialization
157
+ Server-side hooks via `ps.state`, `ps.effect`, `ps.setup`:
158
+ - `ps.state(StateClass)` - reactive state (auto-keyed by callsite; use `key=` for manual control)
159
+ - `@ps.effect` - side effects decorator
160
+ - `ps.setup(fn)` - one-time initialization
161
161
 
162
162
  ### Queries
163
163
 
@@ -0,0 +1,127 @@
1
+ pulse/__init__.py,sha256=_7WUYtxNI78XXdnVu0CFTxRInlCEaP1tGEf-WXMU48I,31993
2
+ pulse/_examples.py,sha256=dFuhD2EVXsbvAeexoG57s4VuN4gWLaTMOEMNYvlPm9A,561
3
+ pulse/app.py,sha256=G26TprJ566Dhzr_31QUR41WnOyBbRfJ6weVZ-sk21sU,35120
4
+ pulse/channel.py,sha256=sQrDLh3k9Z8CyJQkEHzKu4h-yR4XSTgAA3OCQax3Ciw,15766
5
+ pulse/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
+ pulse/cli/cmd.py,sha256=hlAZcuTlqE4qKY96mkNm9cpxqWO3Pm3tDWrPN0lnrE8,15653
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=86zmG6QGJpNe1uZEATSbM-FeQby6BJOaDXxLndzVVbo,10038
19
+ pulse/codegen/js.py,sha256=fm2aL3RdnL7KlgrXDkKbM0E6BkXYBkID0XlKTDAX26c,1521
20
+ pulse/codegen/templates/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
21
+ pulse/codegen/templates/layout.py,sha256=nmWPQcO9SRXc3mCCVLCmykreSF96TqQfdDY7dvUBxRg,4737
22
+ pulse/codegen/templates/route.py,sha256=UjBrb3e_8tMkd1OjBjEsnYmK6PCQqOYZBWDuU59FcrI,9234
23
+ pulse/codegen/templates/routes_ts.py,sha256=nPgKCvU0gzue2k6KlOL1TJgrBqqRLmyy7K_qKAI8zAE,1129
24
+ pulse/codegen/utils.py,sha256=QoXcV-h-DLLmq_t03hDNUePS0fNnofUQLoR-TXzDFCY,539
25
+ pulse/component.py,sha256=TVgV0dgNDf2Smt2xsJVD0-Wejsnqm14n-NxBzsdObjc,6227
26
+ pulse/components/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
27
+ pulse/components/for_.py,sha256=lrt1JHegf4OkBbL9nrMOy7zxmbuD8Kn11x32ZGS72lY,2390
28
+ pulse/components/if_.py,sha256=5IOq3R70B-JdI-fvDNYDyAaSEtO8L5OaiqHp-jUn-Kw,2153
29
+ pulse/components/react_router.py,sha256=4dmp2yPNneyodi1PtT9VuO36bsAplbZg_TKZILlEzqs,3038
30
+ pulse/context.py,sha256=odTQlOhVRIwNvtatrmPe_Fd8Zk0rMcbcqQHBxvWYH5o,2677
31
+ pulse/cookies.py,sha256=ozfdBKExdbpeM5ileIA1z8BZA5hoUrZ5_iO9fIMrgRk,8768
32
+ pulse/decorators.py,sha256=BtNaisiqaJvlCuoqBgqQWbeFklDYLDrO1o1MRzFlybY,9932
33
+ pulse/dom/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
34
+ pulse/dom/elements.py,sha256=YHXkVpfMAC4-0o61fK-E0LGTOM3KMCtBfpHHAwLx7dw,23241
35
+ pulse/dom/events.py,sha256=yHioH8Y-b7raOaZ43JuCxk2lUBryUAcDSc-5VhXtiSI,14699
36
+ pulse/dom/props.py,sha256=WrPwOYSoJmn-VWxU2KvJC1j64L4tlT8X2JpabK94gYQ,26721
37
+ pulse/dom/svg.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
38
+ pulse/dom/tags.py,sha256=U6mKmwB9JAFM6LTESMJcoIejNfnyxIdQo2-TLM5OaZ0,7585
39
+ pulse/dom/tags.pyi,sha256=0BC7zTh22roPBuMQawL8hgI6IrfN8xJZuDIoKMd4QKc,14393
40
+ pulse/env.py,sha256=etfubfwq7VWlo2iKy_972WtHZSiVe4StAnjFga0xgj8,4244
41
+ pulse/form.py,sha256=XJiDJU0WQBkDHhtruDwOwYQqfvLsEQwlsqi5OwPbn7I,14011
42
+ pulse/helpers.py,sha256=feHkC2g3DgfGN7FrvgRPZjmXzBjBYXwFu6wRPdy3w_I,15056
43
+ pulse/hooks/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
44
+ pulse/hooks/core.py,sha256=tDEcB_CTD4yI5bNKn7CtB40sRKIanGNqPD5_qLgSzf4,10982
45
+ pulse/hooks/effects.py,sha256=cEPurXwRQoFmxasI0tZE1cQsZYnZr6VB5mWMUK0Db8c,2604
46
+ pulse/hooks/init.py,sha256=PhjVBLlHpodPzVrRcx_QfEUrsx_6gEX_NuVhe6ojiYI,17834
47
+ pulse/hooks/runtime.py,sha256=nxqwl8ByclIh5i3ZcCN6L3f0X3ZpwOBWajLb_FSbcDw,11839
48
+ pulse/hooks/setup.py,sha256=ILbn2v6UFJPFBOWnJef1X2A9JLpIagEHN9Mx0d9947I,6925
49
+ pulse/hooks/stable.py,sha256=y3V6gFEs7XU1ru92krOpjv2_rj_EzqUpy4lncSyLkQ4,3707
50
+ pulse/hooks/state.py,sha256=ORaYNoPhqpwFBlKleBOSNZebJgFHtt7oMOuHxrmnBHk,5288
51
+ pulse/js/__init__.py,sha256=tj1A6-eR5WS83UNgHb3Dw23m37oJsEuyV0ezUB6kXbg,3636
52
+ pulse/js/__init__.pyi,sha256=WN22WsJB-XFk6auL9zklwG2Kof3zeOsc56A56dJ3MWg,3097
53
+ pulse/js/_types.py,sha256=F4Go2JtJ2dbxq1fXpc2ablG_nyvhvHzOlZLlEv0VmyU,7421
54
+ pulse/js/array.py,sha256=_tC6QZlflWCXOXXUMMtowM3UK7iDWAtFM8BKqR5rjKk,8883
55
+ pulse/js/console.py,sha256=A-GNKEnPby10gdcTdYsBPVfz4m94PYzTXRwGhfaPRpc,1775
56
+ pulse/js/date.py,sha256=qJjdwupuUtKS95u8N8C8FKMKOIB8qjVMsYA3VYfe-tA,3363
57
+ pulse/js/document.py,sha256=SBinVGfb05jFpeyxAE0yk5Z__dkdW_mFsTI-rvgc-S8,3004
58
+ pulse/js/error.py,sha256=v0_DmpN5ESt_CJTrIYfy8980eerjK8mHhQatNV_1M_8,2611
59
+ pulse/js/json.py,sha256=P8nxOANjIxrzUA1XkBrd0SmNyAGyB3pVXZDPnA1OKks,1908
60
+ pulse/js/map.py,sha256=bhw75CUMIearH4JACCs9zAffdzfla3Rae7SKGcCLGoc,2243
61
+ pulse/js/math.py,sha256=OBbMlgoa6ZHLDgmXGNKMj5wYrvroV5ICIx-VsSE5_II,1757
62
+ pulse/js/navigator.py,sha256=2QWSr9xyyBfgd76P472qmayXQRYXIEo-b8zLzvfhHfg,1517
63
+ pulse/js/number.py,sha256=fX2M6hZ5ry2FPsYaHhGlqgO6reBEXw7C-gtu0-8_Zyw,1262
64
+ pulse/js/obj.py,sha256=75NlJ7gsaMAXyYGXEeG5E4QKuKCy3ls9mDexodwxPyw,2085
65
+ pulse/js/object.py,sha256=95WvnGWgB-PL-D7l12UgdxNy_fxO5sJXool3Rx5ahUQ,4433
66
+ pulse/js/promise.py,sha256=vBXcL-U9BuZN-q1jbYhyzQaOL2niDPw4LsD7q7Y_yco,4670
67
+ pulse/js/pulse.py,sha256=m-LgqwhYygVBj7GzjeO-uo8fK5ThyVe7c3QvOJt_vc0,2962
68
+ pulse/js/react.py,sha256=tf3pUXu1BQO1KF7yestW4gfzCjLiejfAZ78vf_53sfI,12135
69
+ pulse/js/regexp.py,sha256=qO-3nmt7uGN7V_bwimPCN-2RSsPfE6YiY7G1MjoP3YY,1055
70
+ pulse/js/set.py,sha256=omG3g-25GRHxgoKISSB4x-M8UDFlaXtFV9cSIpd5uB0,3017
71
+ pulse/js/string.py,sha256=VsvDF_ve8R9QIiBdDotLP2KpCKwmpEfGgRQWckOCmHk,813
72
+ pulse/js/weakmap.py,sha256=HACZEZ8EZk1xoaCmTXk__opvJLxlJ9_0U3y-01KQkHU,1412
73
+ pulse/js/weakset.py,sha256=jerMG9ubroR29HvOLIm6lkLxMj-GGWbiE57U9F6zRuQ,1256
74
+ pulse/js/window.py,sha256=yC1BjyH2jqp1x-CXJCUFta-ASyZ5668ozQ0AmAjZcxA,4097
75
+ pulse/messages.py,sha256=hz5EUFVHbzXHkcByZcV_Y199vb-M9cGjMMBL1HXPctE,4024
76
+ pulse/middleware.py,sha256=2syzmJ0r9fEa0k1pD7zC_1DHUMs9qLSWRzo5XXtKqsA,10896
77
+ pulse/plugin.py,sha256=bu90qaUVFtZsIsW41dpshVK1vvIGHUsg6mFoiF0Wfso,2370
78
+ pulse/proxy.py,sha256=Rj0hOVnwyI36lrkK9fEKAgFK-WCwt5X526J87A2EvMs,7773
79
+ pulse/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
80
+ pulse/queries/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
81
+ pulse/queries/client.py,sha256=AW42ZPdZJfDkCERpoxQnsiU5cYLfOlZX0sIb9BdIL4E,18495
82
+ pulse/queries/common.py,sha256=TYhn6LyldfmOKYYurxINgCEr3C3WSEwB0cIki1a5iBM,2488
83
+ pulse/queries/effect.py,sha256=7KvV_yK7OHTWhfQbZFGzg_pRhyI2mn25pKIF9AmSmcU,1471
84
+ pulse/queries/infinite_query.py,sha256=oPZq_TEVPHTdMy6-XfjN0hGFy_uhU14vdtn-UsCUHBQ,45764
85
+ pulse/queries/mutation.py,sha256=fhEpOZ7CuHImH4Y02QapYdTJrwe6K52-keb0d67wmms,8274
86
+ pulse/queries/protocol.py,sha256=R8n238Ex9DbYIAVKB83a8FAPtnCiPNhWar-F01K2fTo,3345
87
+ pulse/queries/query.py,sha256=GTZY6xvan4mC3GgLbkRnzo6lSvfRhriN2UznyjyiEWE,38682
88
+ pulse/queries/store.py,sha256=Ct7a-h1-Cq07zEfe9vw-LM85Fm7jIJx7CLAIlsiznlU,3444
89
+ pulse/react_component.py,sha256=4Zd2H9XJ2fVxVzznW5xMpcnPqx33S-c9V5KgPKjjtmo,1845
90
+ pulse/reactive.py,sha256=FxxpH7NBtQr7G89iCVN7y1EG21f23GcRi1M-XIxcRQA,31280
91
+ pulse/reactive_extensions.py,sha256=yQ1PpdAh4kMvll7R15T72FOg8NFdG_HGBsGc63dawYk,33754
92
+ pulse/render_session.py,sha256=Sek343ViDdS2r8IhLUTyZvzrb10kXTr4zDMNig2TwnA,21371
93
+ pulse/renderer.py,sha256=bH7MWaQB1BVk6s60yEgZhUIoAuXO9olY5IA8dUqc_64,16002
94
+ pulse/request.py,sha256=N0oFOLiGxpbgSgxznjvu64lG3YyOcZPKC8JFyKx6X7w,6023
95
+ pulse/routing.py,sha256=LzTITvGgaLI1w7qTDZjFwoBcWAb4O8Dz7AmXeTNYrFU,16903
96
+ pulse/serializer.py,sha256=HmQZgxQiaCx2SL2XwmEQLd_xsk_P8XfLtGciLLLOxx0,7616
97
+ pulse/state.py,sha256=VMphVpYNU1CyHMMg1_kNJO3cfqLXJPAuq9gr9RYyUAw,15922
98
+ pulse/test_helpers.py,sha256=4iO5Ymy3SMvSjh-UaAaSdqm1I_SAJMNjdY2iYVro5f8,436
99
+ pulse/transpiler/__init__.py,sha256=wDDnzqxgHpp_OLtcgyrJEg2jVoTnFIe3SSSTOsMDW8w,4700
100
+ pulse/transpiler/assets.py,sha256=FHielogI5NrFwst5H94E49YWYFX7Tp1rwJHCcowT3P0,1974
101
+ pulse/transpiler/builtins.py,sha256=QZrow7XJ2wxGMAE-mgZmaUD03egOnXCbikOg8yMx9vQ,30807
102
+ pulse/transpiler/dynamic_import.py,sha256=wyIA-QzRi2-1cdzxGuFJleVKyVp5dEud6M-eP9SA_EY,3464
103
+ pulse/transpiler/emit_context.py,sha256=GyK6VdsBSTVIewQRhBagaV0hlqLTlPZ1i8EAZGi8SaY,1321
104
+ pulse/transpiler/errors.py,sha256=LSBjLBnMglbl2D94p9JR4y-3jDefk6iHSlUVBaBOTu4,2823
105
+ pulse/transpiler/function.py,sha256=Pf5eoyzKHpn3d2EvCCYtARMnn_ixpAl7IZmY1fhmDIk,17036
106
+ pulse/transpiler/id.py,sha256=CdgA1NndBpZjv0Hp4XiYbKn7wi-x4zWsFSjEiViKxVk,434
107
+ pulse/transpiler/imports.py,sha256=2pxKZzjmMyAMgkfs_gBc01mxbAv8euyW8FTBBy5GaNw,9420
108
+ pulse/transpiler/js_module.py,sha256=EWX8ZZ248H6kMQs9u6zsve3SPLy4lzf9F1cNEDdY1bA,11193
109
+ pulse/transpiler/modules/__init__.py,sha256=JGi3CuZoF4sug4dNhQg3MFhpEQqnXec4xRJM2cHNP3c,1184
110
+ pulse/transpiler/modules/asyncio.py,sha256=kWMuFU2vZbqutCM_EXJMvy5SdlB66XiT0czs8lELj_o,1584
111
+ pulse/transpiler/modules/json.py,sha256=Zxe8dsaQ0Eoq3yHUiJeKEx6ibiN36HCT61ScFkLFCeY,676
112
+ pulse/transpiler/modules/math.py,sha256=8gjvdYTMqtuOnXrvX_Lwuo0ywAdSl7cpss4TMk6mQtQ,7044
113
+ pulse/transpiler/modules/pulse/__init__.py,sha256=TfMsiiB53ZFlxdNl7jfCAiMZs-vSRUTxUmqzkLTj-po,91
114
+ pulse/transpiler/modules/pulse/tags.py,sha256=YFodKrhmt4DH7QtjTBdVvK5J6Qq2ntfhzb50tP-PTac,6273
115
+ pulse/transpiler/modules/typing.py,sha256=hMGff6gBscFJE2GPV9xUFNfLuff2QCMIbMJUs3f24BY,1771
116
+ pulse/transpiler/nodes.py,sha256=PvTHSLlau4xaf35UjI24FV_L4jhT2BwiIRmCtGowQ8A,50392
117
+ pulse/transpiler/py_module.py,sha256=YYSeroGInkXsoy39Y34Oxj1mrwDQnbSFVEgWru7vqG0,4465
118
+ pulse/transpiler/transpiler.py,sha256=28diEp1yZTs3RsUEJZZdCv1DfzgO9WyOGI-xSHe7y_4,32562
119
+ pulse/transpiler/vdom.py,sha256=l4CKQlt-wSSFJ7j7cF4dVwqYHWyAT1uAmbgsx0Kk4Jc,6310
120
+ pulse/types/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
121
+ pulse/types/event_handler.py,sha256=psQCydj-WEtBcFU5JU4mDwvyzkW8V2O0g_VFRU2EOHI,1618
122
+ pulse/user_session.py,sha256=nsnsMgqq2xGJZLpbHRMHUHcLrElMP8WcA4gjGMrcoBk,10208
123
+ pulse/version.py,sha256=711vaM1jVIQPgkisGgKZqwmw019qZIsc_QTae75K2pg,1895
124
+ pulse_framework-0.1.56.dist-info/WHEEL,sha256=eh7sammvW2TypMMMGKgsM83HyA_3qQ5Lgg3ynoecH3M,79
125
+ pulse_framework-0.1.56.dist-info/entry_points.txt,sha256=i7aohd3QaPu5IcuGKKvsQQEiMYMe5HcF56QEsaLVO64,46
126
+ pulse_framework-0.1.56.dist-info/METADATA,sha256=MtCUAC4lSouiraf7sHDEJWUCPDmL6k3w2ugU7Mvha5I,8229
127
+ pulse_framework-0.1.56.dist-info/RECORD,,
pulse/js/react_dom.py DELETED
@@ -1,30 +0,0 @@
1
- """
2
- JavaScript ReactDOM module.
3
-
4
- Usage:
5
- from pulse.js.react_dom import createPortal
6
- createPortal(children, container) # -> createPortal(children, container)
7
-
8
- # Also available as namespace:
9
- import pulse.js.react_dom as ReactDOM
10
- ReactDOM.createPortal(children, container)
11
- """
12
-
13
- from typing import Any as _Any
14
-
15
- # Import types from react module for consistency
16
- from pulse.js.react import ReactNode as ReactNode
17
- from pulse.transpiler.js_module import JsModule
18
-
19
-
20
- def createPortal(
21
- children: ReactNode, container: _Any, key: str | None = None
22
- ) -> ReactNode:
23
- """Creates a portal to render children into a different DOM subtree."""
24
- ...
25
-
26
-
27
- # ReactDOM is a namespace module where each export is a named import
28
- JsModule.register(
29
- name="ReactDOM", src="react-dom", kind="namespace", values="named_import"
30
- )
@@ -1,51 +0,0 @@
1
- """React component integration for transpiler.
2
-
3
- In v2, client React components are represented as Expr nodes (typically Import or Member).
4
- The @react_component decorator wraps an expression in Jsx(expr) to provide:
5
-
6
- - JSX call semantics via Jsx (transpile to Element nodes)
7
- - Type-safe Python call signature via .as_(fn)
8
- """
9
-
10
- from __future__ import annotations
11
-
12
- from collections.abc import Callable
13
- from typing import Any, ParamSpec
14
-
15
- from pulse.transpiler.nodes import Element, Expr, Jsx, Node
16
-
17
- P = ParamSpec("P")
18
-
19
-
20
- def default_signature(
21
- *children: Node, key: str | None = None, **props: Any
22
- ) -> Element: ...
23
-
24
-
25
- def react_component(
26
- expr: Expr,
27
- *,
28
- lazy: bool = False,
29
- ):
30
- """Decorator that uses the decorated function solely as a typed signature.
31
-
32
- Returns a Jsx(expr) that preserves the function's type signature for type
33
- checkers and produces Element nodes when called in transpiled code.
34
-
35
- Note: lazy=True is stored but not yet wired into codegen.
36
- """
37
-
38
- def decorator(fn: Callable[P, Any]) -> Callable[P, Element]:
39
- if not isinstance(expr, Expr):
40
- raise TypeError("react_component expects an Expr")
41
-
42
- # Wrap expr: Jsx provides Element generation
43
- jsx_wrapper = expr if isinstance(expr, Jsx) else Jsx(expr)
44
-
45
- # Note: lazy flag is not currently wired into codegen
46
- # Could store it via a separate side-registry if needed in future
47
- _ = lazy # Suppress unused variable warning
48
-
49
- return jsx_wrapper
50
-
51
- return decorator
@@ -1,124 +0,0 @@
1
- pulse/__init__.py,sha256=WN17B77pSD_Slz75YV3b1ove8GXsqeXhO-b1S_ZIrVE,31983
2
- pulse/_examples.py,sha256=dFuhD2EVXsbvAeexoG57s4VuN4gWLaTMOEMNYvlPm9A,561
3
- pulse/app.py,sha256=D2T7K7HX87yg2UBIW9YYvT895Xp8UiiLSL8gWFZsaqQ,31635
4
- pulse/channel.py,sha256=d9eLxgyB0P9UBVkPkXV7MHkC4LWED1Cq3GKsEu_SYy4,13056
5
- pulse/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
- pulse/cli/cmd.py,sha256=rTcqt_hg89n2FMJhf7ODUPClCx8dzcuKUe1Jv062UmQ,15339
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/codegen/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
17
- pulse/codegen/codegen.py,sha256=M5X-TpLwI25wfZhI2G0DjM3Op4kvoDF0HQeeGD3xujE,10296
18
- pulse/codegen/js.py,sha256=fm2aL3RdnL7KlgrXDkKbM0E6BkXYBkID0XlKTDAX26c,1521
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=yWNoThsTivsK-8gtFF-ShDxT5Rj1QP1-26Yw66pvME8,7929
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=3YVsiK0GvCzhsOEknd-hL-vPsij_UwcxksVVb-7tH2M,2922
25
- pulse/components/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
26
- pulse/components/for_.py,sha256=OF7hso4hg0_X_FDwEzto6CoMcZ_fJho7TIp2ag0F_N0,1784
27
- pulse/components/if_.py,sha256=jXOrZ6sbSA-qgjJg-_-buppjS1wDDfRnKRF4Y7pQNTc,1636
28
- pulse/components/react_router.py,sha256=uQ08mdvcqA_i4EaFcfIR80DZkpMW_kqmBS1U5rNblqc,1068
29
- pulse/context.py,sha256=fMK6GdQY4q_3452v5DJli2f2_urVihnpzb-O-O9cJ1Q,1734
30
- pulse/cookies.py,sha256=R-gf_x25SKqfJFGxdOazf91lQp-YUpd3HyUYF-nMji4,6184
31
- pulse/decorators.py,sha256=ywNgLN6VFcKOM5fbFdUUzh-DWk4BuSXdD1BTfd1N-0U,4827
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=BXbyPWlCb045_RhjzEbg1LUIA0ppwwO2OE5CilGxGqY,2884
40
- pulse/form.py,sha256=KSCr8UrWnP4zuO7xhndkSgG-YyU_oFGVPuz743GD1k0,9081
41
- pulse/helpers.py,sha256=v054teQPOFNJZMgs_G7-BIGsvTLvolTEABgtoSUR3_c,14890
42
- pulse/hooks/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
43
- pulse/hooks/core.py,sha256=QfYRz2O8-drNSQx_xnv8mK8ksWcw3LNM1H2hoInT0Rk,7457
44
- pulse/hooks/effects.py,sha256=pVq5OndlhFLHLpM9Pn9Bp5rEpnpmJEpbIp2UaHHyJFQ,2428
45
- pulse/hooks/init.py,sha256=QZUfdOCqW7xcy_jn-lFBN8h_68ppmKDraF-2bhjWr1g,15848
46
- pulse/hooks/runtime.py,sha256=61CGZ9B0ScwCx8bwUrXIWYPAJIZtGCp3GcdBqa33dgo,5145
47
- pulse/hooks/setup.py,sha256=c_uVi0S0HPioEvjdWUaSdAGT9M3Cxpw8J-llvtmDOGo,4496
48
- pulse/hooks/stable.py,sha256=mLNS6WyA4tC-65gNybPOE0DLEz1YlxOCddD9odElArU,1772
49
- pulse/hooks/state.py,sha256=2EX_N0YO_Jycx7CGE4xQEm3DjlPk97gaNYwhXPkfVJ8,2827
50
- pulse/js/__init__.py,sha256=jUwGyqjynfBmfTxAWMOjN_q7XtE5tkSKgmZG4Cwc_aE,3651
51
- pulse/js/__init__.pyi,sha256=WN22WsJB-XFk6auL9zklwG2Kof3zeOsc56A56dJ3MWg,3097
52
- pulse/js/_types.py,sha256=F4Go2JtJ2dbxq1fXpc2ablG_nyvhvHzOlZLlEv0VmyU,7421
53
- pulse/js/array.py,sha256=fMs0ykV7PwJawGN4lugtTe_yxBFfBRgjm1ley1IA_no,8892
54
- pulse/js/console.py,sha256=7OCC_Zh7OECt0kO0KlkNBBC05muefipeNbsOY5mcWuo,1804
55
- pulse/js/date.py,sha256=_HyoRk0qIY3pWtTk2NYQvesVZhoqjvwtxdwlFzhg4zI,3372
56
- pulse/js/document.py,sha256=C6hmd5yQkI3LPKxLRILDUu1Jl5ZhA6_Mps8iudBFWAs,2997
57
- pulse/js/error.py,sha256=80AVD5hcowHfd3AyUGM-_AFFOnUhP2q8mC8QZBJgIPQ,2612
58
- pulse/js/json.py,sha256=971jJLVrKjMIU7pxtI-JQ7Nh4BlrPdtGlCdQnxrLPCA,1917
59
- pulse/js/map.py,sha256=VdWVOwIex_jTmB9OqHfxkSMw-tbAZcejJCFQB581wIg,2248
60
- pulse/js/math.py,sha256=UdOe2ri_Rxuu1qDhSiS270WrUMJj6VtSwnGZPpbq-k8,1766
61
- pulse/js/navigator.py,sha256=pilMh8e39XjM7DcVkOV-hlRg61Ldsgxil70h51d0fEo,1510
62
- pulse/js/number.py,sha256=rByDqG1La8Ijb8qcj740SgEK5ZQJUlV3V30ORkMewOc,1271
63
- pulse/js/obj.py,sha256=sxOve2ny8mm40iBxLO6QxY0OmcBZheIkoqUimfBks8E,2078
64
- pulse/js/object.py,sha256=wMULUSjTPNRalnDkmmYjzeplm1N7ClVgMt7VoKQjzsI,4442
65
- pulse/js/promise.py,sha256=ipJTLXef5ub5tqexQY69M9AwxW-JyEhXg8DiSgo7OtA,4676
66
- pulse/js/pulse.py,sha256=onWrfsagiXQk0VAIHAWj1pdPb17VchDgNVyuIMx9GKA,3027
67
- pulse/js/react.py,sha256=ktr6gI4vpsQZ_IM9D6gazMvetGRbtPkKRNbR660ZQLA,8417
68
- pulse/js/react_dom.py,sha256=4Rgl32t4XGUKkHQpCJiNcRGuojgx4BFL_rf1oOd40j4,818
69
- pulse/js/regexp.py,sha256=5gpfDDe72uoOu2-uC8LvOPqrQH1HF6G-u77kPmIohbQ,1056
70
- pulse/js/set.py,sha256=nKSIxe0W4ZfA4NQ_-Jd401GTDfnQWRqMxag7eadoP70,3022
71
- pulse/js/string.py,sha256=VMjHDEF260-AVRqUBDKR0FXShmCU06y9IMAMpxVCc0E,822
72
- pulse/js/weakmap.py,sha256=XDCNykrHE2bjjKEd1TB-vToKE6Yz2W8-VSA79ajUoMA,1417
73
- pulse/js/weakset.py,sha256=nixXyjnSKRLFIACebzxTSXm0ZVUy09OY9BXF97ua9lU,1261
74
- pulse/js/window.py,sha256=kP57l2nYjJy6h6Zt-BbB4cdhs1Et0pB32AcViN7n1rw,4094
75
- pulse/messages.py,sha256=03It_vMMLRDpDeXkxiwV_5LO_vcYUA79-SWw0dVX6MA,3936
76
- pulse/middleware.py,sha256=9uyAhVUEGMSwqWC3WXqs7x5JMMNEcSTTu3g7DjsR8w8,9812
77
- pulse/plugin.py,sha256=RfGl6Vtr7VRHb8bp4Ob4dOX9dVzvc4Riu7HWnStMPpk,580
78
- pulse/proxy.py,sha256=Rj0hOVnwyI36lrkK9fEKAgFK-WCwt5X526J87A2EvMs,7773
79
- pulse/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
80
- pulse/queries/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
81
- pulse/queries/client.py,sha256=GGckE0P3YCBO4Mj-08AO_I9eXVC4sIDSNw_xTLrBFuE,15224
82
- pulse/queries/common.py,sha256=Cr_NV0dWz5DQ7Qg771jvUms1o2-EnTYqjZJe4tVeoVk,1160
83
- pulse/queries/effect.py,sha256=7KvV_yK7OHTWhfQbZFGzg_pRhyI2mn25pKIF9AmSmcU,1471
84
- pulse/queries/infinite_query.py,sha256=oUHWjP2OliB7h8VDJooGocefHm4m9TDy4WaJesSrsdI,40457
85
- pulse/queries/mutation.py,sha256=px1fprFL-RxNfbRSoRtdsOLkEbjSsMrJxGHKBIPYQTM,4959
86
- pulse/queries/protocol.py,sha256=R8n238Ex9DbYIAVKB83a8FAPtnCiPNhWar-F01K2fTo,3345
87
- pulse/queries/query.py,sha256=G8eXCaT5wuvVcstlqWU8VBxuuUUS7K1R5Y-VtDpMIG0,35065
88
- pulse/queries/store.py,sha256=Ct7a-h1-Cq07zEfe9vw-LM85Fm7jIJx7CLAIlsiznlU,3444
89
- pulse/react_component.py,sha256=7uspzLhjQrosVFFHVMmeE3_P8XnAbMAt56i8116TQcw,197
90
- pulse/reactive.py,sha256=v8a9IttkabeWwYrrHAx33zqzW9WC4WlS4iXbIh2KQkU,24374
91
- pulse/reactive_extensions.py,sha256=T1V3AasHtvJkmGO55miC9RVPxDFIj7qrooMsn89x5SI,32076
92
- pulse/render_session.py,sha256=oEKJ-RXqUUm1Dvc-7sgHIqfkVgayywvl3jcHb-bEQQo,17343
93
- pulse/renderer.py,sha256=bH7MWaQB1BVk6s60yEgZhUIoAuXO9olY5IA8dUqc_64,16002
94
- pulse/request.py,sha256=sPsSRWi5KvReSPBLIs_kzqomn1wlRk1BTLZ5s0chQr4,4979
95
- pulse/routing.py,sha256=BObgI9cRPCXy24Gir-KeOdMh-Yxnh88hET2qddC0Fss,12847
96
- pulse/serializer.py,sha256=SQaoUsYLj2hkSleAJ5ML1BzSKt04lwGKlCAw15_MaOA,5838
97
- pulse/state.py,sha256=ikQbK4R8PieV96qd4uWREUvs0jXo9sCapawY7i6oCYo,10776
98
- pulse/transpiler/__init__.py,sha256=WiC1SHcrkHTo5tiM1KynPWDkvFl5I_hkna28BoAKB1o,4226
99
- pulse/transpiler/builtins.py,sha256=QZrow7XJ2wxGMAE-mgZmaUD03egOnXCbikOg8yMx9vQ,30807
100
- pulse/transpiler/errors.py,sha256=LSBjLBnMglbl2D94p9JR4y-3jDefk6iHSlUVBaBOTu4,2823
101
- pulse/transpiler/function.py,sha256=OfhHECAn9aIvbHZIuH5_HQZ9AHh_fax8y2Hd1ZYgaBA,16824
102
- pulse/transpiler/id.py,sha256=CdgA1NndBpZjv0Hp4XiYbKn7wi-x4zWsFSjEiViKxVk,434
103
- pulse/transpiler/imports.py,sha256=SpiZDLOdml3TTEz04mVJbX4y7owVqqTBSWollncZQsg,9255
104
- pulse/transpiler/js_module.py,sha256=DHelYoYIBNaKgOaTX43ZIFGMpzF60CYtE-SmYKz5tq8,9165
105
- pulse/transpiler/modules/__init__.py,sha256=JGi3CuZoF4sug4dNhQg3MFhpEQqnXec4xRJM2cHNP3c,1184
106
- pulse/transpiler/modules/asyncio.py,sha256=kWMuFU2vZbqutCM_EXJMvy5SdlB66XiT0czs8lELj_o,1584
107
- pulse/transpiler/modules/json.py,sha256=Zxe8dsaQ0Eoq3yHUiJeKEx6ibiN36HCT61ScFkLFCeY,676
108
- pulse/transpiler/modules/math.py,sha256=8gjvdYTMqtuOnXrvX_Lwuo0ywAdSl7cpss4TMk6mQtQ,7044
109
- pulse/transpiler/modules/pulse/__init__.py,sha256=TfMsiiB53ZFlxdNl7jfCAiMZs-vSRUTxUmqzkLTj-po,91
110
- pulse/transpiler/modules/pulse/tags.py,sha256=YFodKrhmt4DH7QtjTBdVvK5J6Qq2ntfhzb50tP-PTac,6273
111
- pulse/transpiler/modules/typing.py,sha256=hMGff6gBscFJE2GPV9xUFNfLuff2QCMIbMJUs3f24BY,1771
112
- pulse/transpiler/nodes.py,sha256=PvTHSLlau4xaf35UjI24FV_L4jhT2BwiIRmCtGowQ8A,50392
113
- pulse/transpiler/py_module.py,sha256=z971TX958GEai8bP--4fnsMvE8ZhTWfWkIImUQwRpSo,4628
114
- pulse/transpiler/react_component.py,sha256=Fqi51YpmfG3jILN5VB2OSU9WIWx9TQ-TeyFwoxj5H3E,1434
115
- pulse/transpiler/transpiler.py,sha256=xR3N59VpaJLQG6wN5iRoSF90fYlUCQrpJYwkUXlx9jU,32443
116
- pulse/transpiler/vdom.py,sha256=l4CKQlt-wSSFJ7j7cF4dVwqYHWyAT1uAmbgsx0Kk4Jc,6310
117
- pulse/types/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
118
- pulse/types/event_handler.py,sha256=psQCydj-WEtBcFU5JU4mDwvyzkW8V2O0g_VFRU2EOHI,1618
119
- pulse/user_session.py,sha256=1xVui3jjom4mtECqGLbIbQyPNsDVKquqq1NECI6yRa0,8129
120
- pulse/version.py,sha256=711vaM1jVIQPgkisGgKZqwmw019qZIsc_QTae75K2pg,1895
121
- pulse_framework-0.1.54.dist-info/WHEEL,sha256=eh7sammvW2TypMMMGKgsM83HyA_3qQ5Lgg3ynoecH3M,79
122
- pulse_framework-0.1.54.dist-info/entry_points.txt,sha256=i7aohd3QaPu5IcuGKKvsQQEiMYMe5HcF56QEsaLVO64,46
123
- pulse_framework-0.1.54.dist-info/METADATA,sha256=GF2cPqNBmQUEx1_xNgjvvcj2FpKinXiKcUdK4MhFmOM,8176
124
- pulse_framework-0.1.54.dist-info/RECORD,,