pulse-framework 0.1.55__py3-none-any.whl → 0.1.57__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 (70) 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/codegen/codegen.py +43 -12
  6. pulse/component.py +104 -0
  7. pulse/components/for_.py +30 -4
  8. pulse/components/if_.py +28 -5
  9. pulse/components/react_router.py +61 -3
  10. pulse/context.py +39 -5
  11. pulse/cookies.py +108 -4
  12. pulse/decorators.py +193 -24
  13. pulse/env.py +56 -2
  14. pulse/form.py +198 -5
  15. pulse/helpers.py +7 -1
  16. pulse/hooks/core.py +135 -5
  17. pulse/hooks/effects.py +61 -77
  18. pulse/hooks/init.py +60 -1
  19. pulse/hooks/runtime.py +241 -0
  20. pulse/hooks/setup.py +77 -0
  21. pulse/hooks/stable.py +58 -1
  22. pulse/hooks/state.py +107 -20
  23. pulse/js/__init__.py +40 -24
  24. pulse/js/array.py +9 -6
  25. pulse/js/console.py +15 -12
  26. pulse/js/date.py +9 -6
  27. pulse/js/document.py +5 -2
  28. pulse/js/error.py +7 -4
  29. pulse/js/json.py +9 -6
  30. pulse/js/map.py +8 -5
  31. pulse/js/math.py +9 -6
  32. pulse/js/navigator.py +5 -2
  33. pulse/js/number.py +9 -6
  34. pulse/js/obj.py +16 -13
  35. pulse/js/object.py +9 -6
  36. pulse/js/promise.py +19 -13
  37. pulse/js/pulse.py +28 -25
  38. pulse/js/react.py +94 -55
  39. pulse/js/regexp.py +7 -4
  40. pulse/js/set.py +8 -5
  41. pulse/js/string.py +9 -6
  42. pulse/js/weakmap.py +8 -5
  43. pulse/js/weakset.py +8 -5
  44. pulse/js/window.py +6 -3
  45. pulse/messages.py +5 -0
  46. pulse/middleware.py +147 -76
  47. pulse/plugin.py +76 -5
  48. pulse/queries/client.py +186 -39
  49. pulse/queries/common.py +52 -3
  50. pulse/queries/infinite_query.py +154 -2
  51. pulse/queries/mutation.py +127 -7
  52. pulse/queries/query.py +112 -11
  53. pulse/react_component.py +66 -3
  54. pulse/reactive.py +314 -30
  55. pulse/reactive_extensions.py +106 -26
  56. pulse/render_session.py +304 -173
  57. pulse/request.py +46 -11
  58. pulse/routing.py +140 -4
  59. pulse/serializer.py +71 -0
  60. pulse/state.py +177 -9
  61. pulse/test_helpers.py +15 -0
  62. pulse/transpiler/__init__.py +0 -3
  63. pulse/transpiler/py_module.py +1 -7
  64. pulse/user_session.py +119 -18
  65. {pulse_framework-0.1.55.dist-info → pulse_framework-0.1.57.dist-info}/METADATA +5 -5
  66. pulse_framework-0.1.57.dist-info/RECORD +127 -0
  67. pulse/transpiler/react_component.py +0 -44
  68. pulse_framework-0.1.55.dist-info/RECORD +0 -127
  69. {pulse_framework-0.1.55.dist-info → pulse_framework-0.1.57.dist-info}/WHEEL +0 -0
  70. {pulse_framework-0.1.55.dist-info → pulse_framework-0.1.57.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.55
3
+ Version: 0.1.57
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.57.dist-info/WHEEL,sha256=eh7sammvW2TypMMMGKgsM83HyA_3qQ5Lgg3ynoecH3M,79
125
+ pulse_framework-0.1.57.dist-info/entry_points.txt,sha256=i7aohd3QaPu5IcuGKKvsQQEiMYMe5HcF56QEsaLVO64,46
126
+ pulse_framework-0.1.57.dist-info/METADATA,sha256=tKr4UwsRMj5mTqjqiNfnORRjrVG5A8TIAiMpw8YWzXI,8229
127
+ pulse_framework-0.1.57.dist-info/RECORD,,
@@ -1,44 +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(expr: Expr):
26
- """Decorator that uses the decorated function solely as a typed signature.
27
-
28
- Returns a Jsx(expr) that preserves the function's type signature for type
29
- checkers and produces Element nodes when called in transpiled code.
30
-
31
- For lazy loading, use Import(lazy=True) directly:
32
- LazyChart = Import("Chart", "./Chart", kind="default", lazy=True)
33
- React.lazy(LazyChart) # LazyChart is already a factory
34
- """
35
-
36
- def decorator(fn: Callable[P, Any]) -> Callable[P, Element]:
37
- if not isinstance(expr, Expr):
38
- raise TypeError("react_component expects an Expr")
39
-
40
- # Wrap expr: Jsx provides Element generation
41
- jsx_wrapper = expr if isinstance(expr, Jsx) else Jsx(expr)
42
- return jsx_wrapper
43
-
44
- return decorator
@@ -1,127 +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/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=Etr_0UpZY7EKE-SjcMiuGENDKuEZbyPWuFfccaQcdAs,9260
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=QiIFNtYraljwDmTCCjYiuGT9BlOjO8VgHpFCj1GO2i0,3543
26
- pulse/components/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
27
- pulse/components/for_.py,sha256=OF7hso4hg0_X_FDwEzto6CoMcZ_fJho7TIp2ag0F_N0,1784
28
- pulse/components/if_.py,sha256=jXOrZ6sbSA-qgjJg-_-buppjS1wDDfRnKRF4Y7pQNTc,1636
29
- pulse/components/react_router.py,sha256=uQ08mdvcqA_i4EaFcfIR80DZkpMW_kqmBS1U5rNblqc,1068
30
- pulse/context.py,sha256=fMK6GdQY4q_3452v5DJli2f2_urVihnpzb-O-O9cJ1Q,1734
31
- pulse/cookies.py,sha256=R-gf_x25SKqfJFGxdOazf91lQp-YUpd3HyUYF-nMji4,6184
32
- pulse/decorators.py,sha256=ywNgLN6VFcKOM5fbFdUUzh-DWk4BuSXdD1BTfd1N-0U,4827
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=BXbyPWlCb045_RhjzEbg1LUIA0ppwwO2OE5CilGxGqY,2884
41
- pulse/form.py,sha256=KSCr8UrWnP4zuO7xhndkSgG-YyU_oFGVPuz743GD1k0,9081
42
- pulse/helpers.py,sha256=v054teQPOFNJZMgs_G7-BIGsvTLvolTEABgtoSUR3_c,14890
43
- pulse/hooks/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
44
- pulse/hooks/core.py,sha256=QfYRz2O8-drNSQx_xnv8mK8ksWcw3LNM1H2hoInT0Rk,7457
45
- pulse/hooks/effects.py,sha256=pVq5OndlhFLHLpM9Pn9Bp5rEpnpmJEpbIp2UaHHyJFQ,2428
46
- pulse/hooks/init.py,sha256=QZUfdOCqW7xcy_jn-lFBN8h_68ppmKDraF-2bhjWr1g,15848
47
- pulse/hooks/runtime.py,sha256=61CGZ9B0ScwCx8bwUrXIWYPAJIZtGCp3GcdBqa33dgo,5145
48
- pulse/hooks/setup.py,sha256=c_uVi0S0HPioEvjdWUaSdAGT9M3Cxpw8J-llvtmDOGo,4496
49
- pulse/hooks/stable.py,sha256=mLNS6WyA4tC-65gNybPOE0DLEz1YlxOCddD9odElArU,1772
50
- pulse/hooks/state.py,sha256=2EX_N0YO_Jycx7CGE4xQEm3DjlPk97gaNYwhXPkfVJ8,2827
51
- pulse/js/__init__.py,sha256=bl6RVTTrA_JInHcFtPDuUoYDYFeymkixrGXT24ZiisQ,3644
52
- pulse/js/__init__.pyi,sha256=WN22WsJB-XFk6auL9zklwG2Kof3zeOsc56A56dJ3MWg,3097
53
- pulse/js/_types.py,sha256=F4Go2JtJ2dbxq1fXpc2ablG_nyvhvHzOlZLlEv0VmyU,7421
54
- pulse/js/array.py,sha256=fMs0ykV7PwJawGN4lugtTe_yxBFfBRgjm1ley1IA_no,8892
55
- pulse/js/console.py,sha256=7OCC_Zh7OECt0kO0KlkNBBC05muefipeNbsOY5mcWuo,1804
56
- pulse/js/date.py,sha256=_HyoRk0qIY3pWtTk2NYQvesVZhoqjvwtxdwlFzhg4zI,3372
57
- pulse/js/document.py,sha256=C6hmd5yQkI3LPKxLRILDUu1Jl5ZhA6_Mps8iudBFWAs,2997
58
- pulse/js/error.py,sha256=80AVD5hcowHfd3AyUGM-_AFFOnUhP2q8mC8QZBJgIPQ,2612
59
- pulse/js/json.py,sha256=971jJLVrKjMIU7pxtI-JQ7Nh4BlrPdtGlCdQnxrLPCA,1917
60
- pulse/js/map.py,sha256=VdWVOwIex_jTmB9OqHfxkSMw-tbAZcejJCFQB581wIg,2248
61
- pulse/js/math.py,sha256=UdOe2ri_Rxuu1qDhSiS270WrUMJj6VtSwnGZPpbq-k8,1766
62
- pulse/js/navigator.py,sha256=pilMh8e39XjM7DcVkOV-hlRg61Ldsgxil70h51d0fEo,1510
63
- pulse/js/number.py,sha256=rByDqG1La8Ijb8qcj740SgEK5ZQJUlV3V30ORkMewOc,1271
64
- pulse/js/obj.py,sha256=sxOve2ny8mm40iBxLO6QxY0OmcBZheIkoqUimfBks8E,2078
65
- pulse/js/object.py,sha256=wMULUSjTPNRalnDkmmYjzeplm1N7ClVgMt7VoKQjzsI,4442
66
- pulse/js/promise.py,sha256=ipJTLXef5ub5tqexQY69M9AwxW-JyEhXg8DiSgo7OtA,4676
67
- pulse/js/pulse.py,sha256=onWrfsagiXQk0VAIHAWj1pdPb17VchDgNVyuIMx9GKA,3027
68
- pulse/js/react.py,sha256=0O4lENAQlHHVJ8zWZjJsEed3At5XvN-wz2ZjA-EOwII,11931
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=BKemf-3llEAuiN0DID8gmz03qlC0T9GxvPZC19W3DGY,4840
99
- pulse/transpiler/assets.py,sha256=FHielogI5NrFwst5H94E49YWYFX7Tp1rwJHCcowT3P0,1974
100
- pulse/transpiler/builtins.py,sha256=QZrow7XJ2wxGMAE-mgZmaUD03egOnXCbikOg8yMx9vQ,30807
101
- pulse/transpiler/dynamic_import.py,sha256=wyIA-QzRi2-1cdzxGuFJleVKyVp5dEud6M-eP9SA_EY,3464
102
- pulse/transpiler/emit_context.py,sha256=GyK6VdsBSTVIewQRhBagaV0hlqLTlPZ1i8EAZGi8SaY,1321
103
- pulse/transpiler/errors.py,sha256=LSBjLBnMglbl2D94p9JR4y-3jDefk6iHSlUVBaBOTu4,2823
104
- pulse/transpiler/function.py,sha256=Pf5eoyzKHpn3d2EvCCYtARMnn_ixpAl7IZmY1fhmDIk,17036
105
- pulse/transpiler/id.py,sha256=CdgA1NndBpZjv0Hp4XiYbKn7wi-x4zWsFSjEiViKxVk,434
106
- pulse/transpiler/imports.py,sha256=2pxKZzjmMyAMgkfs_gBc01mxbAv8euyW8FTBBy5GaNw,9420
107
- pulse/transpiler/js_module.py,sha256=EWX8ZZ248H6kMQs9u6zsve3SPLy4lzf9F1cNEDdY1bA,11193
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=YFodKrhmt4DH7QtjTBdVvK5J6Qq2ntfhzb50tP-PTac,6273
114
- pulse/transpiler/modules/typing.py,sha256=hMGff6gBscFJE2GPV9xUFNfLuff2QCMIbMJUs3f24BY,1771
115
- pulse/transpiler/nodes.py,sha256=PvTHSLlau4xaf35UjI24FV_L4jhT2BwiIRmCtGowQ8A,50392
116
- pulse/transpiler/py_module.py,sha256=z971TX958GEai8bP--4fnsMvE8ZhTWfWkIImUQwRpSo,4628
117
- pulse/transpiler/react_component.py,sha256=GnATqqnDu55W6QbfHAXwhoE-B5k1CVA5t8FVdd7jBWc,1350
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=1xVui3jjom4mtECqGLbIbQyPNsDVKquqq1NECI6yRa0,8129
123
- pulse/version.py,sha256=711vaM1jVIQPgkisGgKZqwmw019qZIsc_QTae75K2pg,1895
124
- pulse_framework-0.1.55.dist-info/WHEEL,sha256=eh7sammvW2TypMMMGKgsM83HyA_3qQ5Lgg3ynoecH3M,79
125
- pulse_framework-0.1.55.dist-info/entry_points.txt,sha256=i7aohd3QaPu5IcuGKKvsQQEiMYMe5HcF56QEsaLVO64,46
126
- pulse_framework-0.1.55.dist-info/METADATA,sha256=MO26KPIrV8TuADZl8JaGkGVPqlquzRLwydm66XiEXfY,8176
127
- pulse_framework-0.1.55.dist-info/RECORD,,