pulse-framework 0.1.51__py3-none-any.whl → 0.1.52__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 (84) hide show
  1. pulse/__init__.py +542 -562
  2. pulse/_examples.py +29 -0
  3. pulse/app.py +0 -14
  4. pulse/cli/cmd.py +96 -80
  5. pulse/cli/dependencies.py +10 -41
  6. pulse/cli/folder_lock.py +3 -3
  7. pulse/cli/helpers.py +40 -67
  8. pulse/cli/logging.py +102 -0
  9. pulse/cli/packages.py +16 -0
  10. pulse/cli/processes.py +40 -23
  11. pulse/codegen/codegen.py +70 -35
  12. pulse/codegen/js.py +2 -4
  13. pulse/codegen/templates/route.py +94 -146
  14. pulse/component.py +115 -0
  15. pulse/components/for_.py +1 -1
  16. pulse/components/if_.py +1 -1
  17. pulse/components/react_router.py +16 -22
  18. pulse/{html → dom}/events.py +1 -1
  19. pulse/{html → dom}/props.py +6 -6
  20. pulse/{html → dom}/tags.py +11 -11
  21. pulse/dom/tags.pyi +480 -0
  22. pulse/form.py +7 -6
  23. pulse/hooks/init.py +1 -13
  24. pulse/js/__init__.py +37 -41
  25. pulse/js/__init__.pyi +22 -2
  26. pulse/js/_types.py +5 -3
  27. pulse/js/array.py +121 -38
  28. pulse/js/console.py +9 -9
  29. pulse/js/date.py +22 -19
  30. pulse/js/document.py +8 -4
  31. pulse/js/error.py +12 -14
  32. pulse/js/json.py +4 -3
  33. pulse/js/map.py +17 -7
  34. pulse/js/math.py +2 -2
  35. pulse/js/navigator.py +4 -4
  36. pulse/js/number.py +8 -8
  37. pulse/js/object.py +9 -13
  38. pulse/js/promise.py +25 -9
  39. pulse/js/regexp.py +6 -6
  40. pulse/js/set.py +20 -8
  41. pulse/js/string.py +7 -7
  42. pulse/js/weakmap.py +6 -6
  43. pulse/js/weakset.py +6 -6
  44. pulse/js/window.py +17 -14
  45. pulse/messages.py +1 -4
  46. pulse/react_component.py +3 -1001
  47. pulse/render_session.py +74 -66
  48. pulse/renderer.py +311 -238
  49. pulse/routing.py +1 -10
  50. pulse/transpiler/__init__.py +84 -114
  51. pulse/transpiler/builtins.py +661 -343
  52. pulse/transpiler/errors.py +78 -2
  53. pulse/transpiler/function.py +463 -133
  54. pulse/transpiler/id.py +18 -0
  55. pulse/transpiler/imports.py +230 -325
  56. pulse/transpiler/js_module.py +218 -209
  57. pulse/transpiler/modules/__init__.py +16 -13
  58. pulse/transpiler/modules/asyncio.py +45 -26
  59. pulse/transpiler/modules/json.py +12 -8
  60. pulse/transpiler/modules/math.py +161 -216
  61. pulse/transpiler/modules/pulse/__init__.py +5 -0
  62. pulse/transpiler/modules/pulse/tags.py +231 -0
  63. pulse/transpiler/modules/typing.py +33 -28
  64. pulse/transpiler/nodes.py +1607 -923
  65. pulse/transpiler/py_module.py +118 -95
  66. pulse/transpiler/react_component.py +51 -0
  67. pulse/transpiler/transpiler.py +593 -437
  68. pulse/transpiler/vdom.py +255 -0
  69. {pulse_framework-0.1.51.dist-info → pulse_framework-0.1.52.dist-info}/METADATA +1 -1
  70. pulse_framework-0.1.52.dist-info/RECORD +120 -0
  71. pulse/html/tags.pyi +0 -470
  72. pulse/transpiler/constants.py +0 -110
  73. pulse/transpiler/context.py +0 -26
  74. pulse/transpiler/ids.py +0 -16
  75. pulse/transpiler/modules/re.py +0 -466
  76. pulse/transpiler/modules/tags.py +0 -268
  77. pulse/transpiler/utils.py +0 -4
  78. pulse/vdom.py +0 -599
  79. pulse_framework-0.1.51.dist-info/RECORD +0 -119
  80. /pulse/{html → dom}/__init__.py +0 -0
  81. /pulse/{html → dom}/elements.py +0 -0
  82. /pulse/{html → dom}/svg.py +0 -0
  83. {pulse_framework-0.1.51.dist-info → pulse_framework-0.1.52.dist-info}/WHEEL +0 -0
  84. {pulse_framework-0.1.51.dist-info → pulse_framework-0.1.52.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,255 @@
1
+ """Typed JSON VDOM format for transpiler.
2
+
3
+ This module defines the JSON-serializable format produced by the v2 renderer.
4
+
5
+ Key goals:
6
+ - The VDOM tree is rebuilt into React elements on the client.
7
+ - Any embedded expression tree is evaluated on the client.
8
+ - Only nodes representable in this JSON format are renderable.
9
+
10
+ Notes:
11
+ - This is a *wire format* (JSON). It is intentionally more restrictive than the
12
+ Python-side node graph in `pulse.transpiler.nodes`.
13
+ - Server-side-only nodes (e.g. `PulseNode`, `Transformer`, statement nodes) must
14
+ be rejected during rendering.
15
+ """
16
+
17
+ from __future__ import annotations
18
+
19
+ from typing import Literal, NotRequired, TypeAlias, TypedDict
20
+
21
+ # =============================================================================
22
+ # JSON atoms
23
+ # =============================================================================
24
+
25
+ JsonPrimitive: TypeAlias = str | int | float | bool | None
26
+ JsonValue: TypeAlias = JsonPrimitive | list["JsonValue"] | dict[str, "JsonValue"]
27
+
28
+
29
+ # =============================================================================
30
+ # Expression tree (client-evaluable)
31
+ # =============================================================================
32
+
33
+ # The expression format is a small tagged-union.
34
+ #
35
+ # - The client should treat these nodes as *pure*, deterministic expressions.
36
+ # - Identifiers should generally be avoided unless the client runtime provides
37
+ # them (e.g. `Math`). Prefer `RegistryRef` for server-provided values.
38
+
39
+
40
+ class RegistryRef(TypedDict):
41
+ """Reference to an entry in the unified client registry."""
42
+
43
+ t: Literal["ref"]
44
+ key: str
45
+
46
+
47
+ class IdentifierExpr(TypedDict):
48
+ t: Literal["id"]
49
+ name: str
50
+
51
+
52
+ class LiteralExpr(TypedDict):
53
+ t: Literal["lit"]
54
+ value: JsonPrimitive
55
+
56
+
57
+ class UndefinedExpr(TypedDict):
58
+ t: Literal["undef"]
59
+
60
+
61
+ class ArrayExpr(TypedDict):
62
+ t: Literal["array"]
63
+ items: list["VDOMNode"]
64
+
65
+
66
+ class ObjectExpr(TypedDict):
67
+ t: Literal["object"]
68
+ props: dict[str, "VDOMNode"]
69
+
70
+
71
+ class MemberExpr(TypedDict):
72
+ t: Literal["member"]
73
+ obj: "VDOMNode"
74
+ prop: str
75
+
76
+
77
+ class SubscriptExpr(TypedDict):
78
+ t: Literal["sub"]
79
+ obj: "VDOMNode"
80
+ key: "VDOMNode"
81
+
82
+
83
+ class CallExpr(TypedDict):
84
+ t: Literal["call"]
85
+ callee: "VDOMNode"
86
+ args: list["VDOMNode"]
87
+
88
+
89
+ class UnaryExpr(TypedDict):
90
+ t: Literal["unary"]
91
+ op: str
92
+ arg: "VDOMNode"
93
+
94
+
95
+ class BinaryExpr(TypedDict):
96
+ t: Literal["binary"]
97
+ op: str
98
+ left: "VDOMNode"
99
+ right: "VDOMNode"
100
+
101
+
102
+ class TernaryExpr(TypedDict):
103
+ t: Literal["ternary"]
104
+ cond: "VDOMNode"
105
+ then: "VDOMNode"
106
+ else_: "VDOMNode"
107
+
108
+
109
+ class TemplateExpr(TypedDict):
110
+ """Template literal parts.
111
+
112
+ Parts alternate: [str, expr, str, expr, str, ...].
113
+ Always starts and ends with a string segment (may be empty).
114
+ """
115
+
116
+ t: Literal["template"]
117
+ parts: list["str | VDOMNode"]
118
+
119
+
120
+ class ArrowExpr(TypedDict):
121
+ t: Literal["arrow"]
122
+ params: list[str]
123
+ body: "VDOMNode"
124
+
125
+
126
+ class NewExpr(TypedDict):
127
+ t: Literal["new"]
128
+ ctor: "VDOMNode"
129
+ args: list["VDOMNode"]
130
+
131
+
132
+ VDOMExpr: TypeAlias = (
133
+ RegistryRef
134
+ | IdentifierExpr
135
+ | LiteralExpr
136
+ | UndefinedExpr
137
+ | ArrayExpr
138
+ | ObjectExpr
139
+ | MemberExpr
140
+ | SubscriptExpr
141
+ | CallExpr
142
+ | UnaryExpr
143
+ | BinaryExpr
144
+ | TernaryExpr
145
+ | TemplateExpr
146
+ | ArrowExpr
147
+ | NewExpr
148
+ )
149
+
150
+
151
+ # =============================================================================
152
+ # VDOM tree (React element reconstruction)
153
+ # =============================================================================
154
+
155
+ CallbackPlaceholder: TypeAlias = Literal["$cb"]
156
+ """Callback placeholder value.
157
+
158
+ The callback invocation target is derived from the element path + prop name.
159
+ Because the prop name is known from `VDOMElement.eval`, the placeholder can be a
160
+ single sentinel string.
161
+ """
162
+
163
+
164
+ VDOMPropValue: TypeAlias = "JsonValue | VDOMExpr | VDOMElement | CallbackPlaceholder"
165
+ """Allowed prop value types.
166
+
167
+ Hot path:
168
+ - If `VDOMElement.eval` is absent, props MUST be plain JSON (JsonValue).
169
+ - If `VDOMElement.eval` is present, only the listed prop keys may contain
170
+ non-JSON values (VDOMExpr / VDOMElement / "$cb:...").
171
+ """
172
+
173
+
174
+ class VDOMElement(TypedDict):
175
+ """A React element in wire format.
176
+
177
+ Special tags:
178
+ - "": React Fragment
179
+ - "$$<ComponentKey>": mount point for client component registry
180
+ """
181
+
182
+ tag: str
183
+ key: NotRequired[str]
184
+ # Default: plain JSON props (no interpretation).
185
+ # When `eval` is present, listed keys may contain VDOMExpr / VDOMElement / "$cb:...".
186
+ props: NotRequired[dict[str, VDOMPropValue]]
187
+ children: NotRequired[list["VDOMNode"]]
188
+ # Marks which prop keys should be interpreted (evaluate expr / render node / bind callback).
189
+ # The interpreter determines the action by inspecting the value shape:
190
+ # - dict with "t": VDOMExpr
191
+ # - dict with "tag": VDOMElement (render-prop subtree)
192
+ # - "$cb": callback placeholder
193
+ eval: NotRequired[list[str]]
194
+
195
+
196
+ VDOMPrimitive: TypeAlias = JsonPrimitive
197
+
198
+ # A node is either a primitive, an element, or an expression node.
199
+ VDOMNode: TypeAlias = VDOMPrimitive | VDOMElement | VDOMExpr
200
+
201
+ VDOM: TypeAlias = VDOMNode
202
+
203
+
204
+ # =============================================================================
205
+ # Update operations (reconciliation output)
206
+ # =============================================================================
207
+
208
+ RenderPath: TypeAlias = str
209
+
210
+
211
+ class ReplaceOperation(TypedDict):
212
+ type: Literal["replace"]
213
+ path: RenderPath
214
+ data: VDOM
215
+
216
+
217
+ class ReconciliationOperation(TypedDict):
218
+ type: Literal["reconciliation"]
219
+ path: RenderPath
220
+ N: int
221
+ new: tuple[list[int], list[VDOM]]
222
+ reuse: tuple[list[int], list[int]]
223
+
224
+
225
+ class UpdatePropsDelta(TypedDict, total=False):
226
+ # Prop deltas only affect `element.props`.
227
+ # If the element has `eval`, only those keys may use non-JSON values.
228
+ set: dict[str, VDOMPropValue]
229
+ remove: list[str]
230
+ # Optional eval key list replacement for this element.
231
+ # - If present, replaces `element.eval` entirely.
232
+ # - Use [] to clear the eval list.
233
+ eval: list[str]
234
+
235
+
236
+ class UpdatePropsOperation(TypedDict):
237
+ type: Literal["update_props"]
238
+ path: RenderPath
239
+ data: UpdatePropsDelta
240
+
241
+
242
+ VDOMOperation: TypeAlias = (
243
+ ReplaceOperation | UpdatePropsOperation | ReconciliationOperation
244
+ )
245
+
246
+
247
+ # =============================================================================
248
+ # View payload (initial render)
249
+ # =============================================================================
250
+
251
+
252
+ class PrerenderView(TypedDict):
253
+ """Minimal payload required by the client to render + apply updates."""
254
+
255
+ vdom: VDOM
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: pulse-framework
3
- Version: 0.1.51
3
+ Version: 0.1.52
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
@@ -0,0 +1,120 @@
1
+ pulse/__init__.py,sha256=TZW4PEV1WHpVHFHZ0zOGiT1LtmR5azYXl0uclYtKXtw,31990
2
+ pulse/_examples.py,sha256=dFuhD2EVXsbvAeexoG57s4VuN4gWLaTMOEMNYvlPm9A,561
3
+ pulse/app.py,sha256=hrEV8fLgO0IXkIo41HYq4ckRjvwGymcOeyaaY0hnVb4,31087
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=HBTwrIsCUwJcJa57wJ6NZNjWUxMWBVpuPQpt3Ih6v04,1314
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=c7ua1Lv6mNe1nYnA4SFVvewvRQAbYy9fN5G3Hr_Dr5c,5000
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=p3XI8KG1ZCcXPD3LJP7fW8JPYfyvoYY5ENwae2o0PiA,2889
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=OWd6TrUJq3Z1kv1cayI9Kz4tAvdvQg-zLACD6GZEDbk,11663
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/states.py,sha256=fFqN3gf7v7rY6QmieKWN1hVCQRRnL-5H4TeG9LTnKSc,6778
50
+ pulse/js/__init__.py,sha256=KeXqLtBly5K2Vyh7SuPorZylXOh1W4vk_UAXRnaNh0Q,3394
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/object.py,sha256=wMULUSjTPNRalnDkmmYjzeplm1N7ClVgMt7VoKQjzsI,4442
64
+ pulse/js/promise.py,sha256=ipJTLXef5ub5tqexQY69M9AwxW-JyEhXg8DiSgo7OtA,4676
65
+ pulse/js/regexp.py,sha256=5gpfDDe72uoOu2-uC8LvOPqrQH1HF6G-u77kPmIohbQ,1056
66
+ pulse/js/set.py,sha256=nKSIxe0W4ZfA4NQ_-Jd401GTDfnQWRqMxag7eadoP70,3022
67
+ pulse/js/string.py,sha256=VMjHDEF260-AVRqUBDKR0FXShmCU06y9IMAMpxVCc0E,822
68
+ pulse/js/weakmap.py,sha256=XDCNykrHE2bjjKEd1TB-vToKE6Yz2W8-VSA79ajUoMA,1417
69
+ pulse/js/weakset.py,sha256=nixXyjnSKRLFIACebzxTSXm0ZVUy09OY9BXF97ua9lU,1261
70
+ pulse/js/window.py,sha256=kP57l2nYjJy6h6Zt-BbB4cdhs1Et0pB32AcViN7n1rw,4094
71
+ pulse/messages.py,sha256=yrKbJhQagNuwlPq3OOMFNRv5tl4fQWB7MDBlBSOXZBA,3895
72
+ pulse/middleware.py,sha256=9uyAhVUEGMSwqWC3WXqs7x5JMMNEcSTTu3g7DjsR8w8,9812
73
+ pulse/plugin.py,sha256=RfGl6Vtr7VRHb8bp4Ob4dOX9dVzvc4Riu7HWnStMPpk,580
74
+ pulse/proxy.py,sha256=jv2IdOEbF-qbtN5hmSqnyhZedOX1597XBye8cerWIyE,7253
75
+ pulse/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
76
+ pulse/queries/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
77
+ pulse/queries/client.py,sha256=GGckE0P3YCBO4Mj-08AO_I9eXVC4sIDSNw_xTLrBFuE,15224
78
+ pulse/queries/common.py,sha256=Cr_NV0dWz5DQ7Qg771jvUms1o2-EnTYqjZJe4tVeoVk,1160
79
+ pulse/queries/effect.py,sha256=7KvV_yK7OHTWhfQbZFGzg_pRhyI2mn25pKIF9AmSmcU,1471
80
+ pulse/queries/infinite_query.py,sha256=oUHWjP2OliB7h8VDJooGocefHm4m9TDy4WaJesSrsdI,40457
81
+ pulse/queries/mutation.py,sha256=px1fprFL-RxNfbRSoRtdsOLkEbjSsMrJxGHKBIPYQTM,4959
82
+ pulse/queries/protocol.py,sha256=R8n238Ex9DbYIAVKB83a8FAPtnCiPNhWar-F01K2fTo,3345
83
+ pulse/queries/query.py,sha256=G8eXCaT5wuvVcstlqWU8VBxuuUUS7K1R5Y-VtDpMIG0,35065
84
+ pulse/queries/store.py,sha256=Ct7a-h1-Cq07zEfe9vw-LM85Fm7jIJx7CLAIlsiznlU,3444
85
+ pulse/react_component.py,sha256=7uspzLhjQrosVFFHVMmeE3_P8XnAbMAt56i8116TQcw,197
86
+ pulse/reactive.py,sha256=v8a9IttkabeWwYrrHAx33zqzW9WC4WlS4iXbIh2KQkU,24374
87
+ pulse/reactive_extensions.py,sha256=T1V3AasHtvJkmGO55miC9RVPxDFIj7qrooMsn89x5SI,32076
88
+ pulse/render_session.py,sha256=azNbLpMZmHt4AqX1zXoLNCicVXWUH1kRBPshD7VdgFQ,18478
89
+ pulse/renderer.py,sha256=87_f2vpwzVXmRwU-QXlxq0O4Z6rhGy-P_pWyMB2bKZI,16982
90
+ pulse/request.py,sha256=sPsSRWi5KvReSPBLIs_kzqomn1wlRk1BTLZ5s0chQr4,4979
91
+ pulse/routing.py,sha256=BObgI9cRPCXy24Gir-KeOdMh-Yxnh88hET2qddC0Fss,12847
92
+ pulse/serializer.py,sha256=7YF8ZjDZYgA5Wmxd9CT-lPvakSb4zjUI1YbTd9m4jQM,5733
93
+ pulse/state.py,sha256=ikQbK4R8PieV96qd4uWREUvs0jXo9sCapawY7i6oCYo,10776
94
+ pulse/transpiler/__init__.py,sha256=WiC1SHcrkHTo5tiM1KynPWDkvFl5I_hkna28BoAKB1o,4226
95
+ pulse/transpiler/builtins.py,sha256=u0r458I9BwlQ0mjAl6xydmTKx4Cr98Vvcq07H9JsAOA,31389
96
+ pulse/transpiler/errors.py,sha256=stChy-qs1hKsQPpF2Hf0Y7GqJs9CjRYHISRRChvqA6w,2158
97
+ pulse/transpiler/function.py,sha256=psXqIAa2UO3smoGyoXYytBVVa6Xdw__khrjScFcll2g,16134
98
+ pulse/transpiler/id.py,sha256=CdgA1NndBpZjv0Hp4XiYbKn7wi-x4zWsFSjEiViKxVk,434
99
+ pulse/transpiler/imports.py,sha256=SpiZDLOdml3TTEz04mVJbX4y7owVqqTBSWollncZQsg,9255
100
+ pulse/transpiler/js_module.py,sha256=Mx0FcM4WnX6b8ttnvXqlQ8ty3DNetMIZLd7Tl7umbxo,9215
101
+ pulse/transpiler/modules/__init__.py,sha256=JGi3CuZoF4sug4dNhQg3MFhpEQqnXec4xRJM2cHNP3c,1184
102
+ pulse/transpiler/modules/asyncio.py,sha256=kWMuFU2vZbqutCM_EXJMvy5SdlB66XiT0czs8lELj_o,1584
103
+ pulse/transpiler/modules/json.py,sha256=Zxe8dsaQ0Eoq3yHUiJeKEx6ibiN36HCT61ScFkLFCeY,676
104
+ pulse/transpiler/modules/math.py,sha256=8gjvdYTMqtuOnXrvX_Lwuo0ywAdSl7cpss4TMk6mQtQ,7044
105
+ pulse/transpiler/modules/pulse/__init__.py,sha256=TfMsiiB53ZFlxdNl7jfCAiMZs-vSRUTxUmqzkLTj-po,91
106
+ pulse/transpiler/modules/pulse/tags.py,sha256=4IWxjTvFvDRJxXzBdl_Aj0qyIGvvjf0FprcPo1uUcDk,5929
107
+ pulse/transpiler/modules/typing.py,sha256=hMGff6gBscFJE2GPV9xUFNfLuff2QCMIbMJUs3f24BY,1771
108
+ pulse/transpiler/nodes.py,sha256=uOOBoPQnSuOwp2oEX99YVhoBj4KBbMWHIUFYGtIRe28,47568
109
+ pulse/transpiler/py_module.py,sha256=Ez6jTgqeaBxpHVYGTbomuZfRgTnqrPDNOaqsDSwVD6c,4628
110
+ pulse/transpiler/react_component.py,sha256=Fqi51YpmfG3jILN5VB2OSU9WIWx9TQ-TeyFwoxj5H3E,1434
111
+ pulse/transpiler/transpiler.py,sha256=RUi7T9d7pd2lJKqgOkUIKvUe5eJV8di1wnTgrriFRiM,32273
112
+ pulse/transpiler/vdom.py,sha256=l4CKQlt-wSSFJ7j7cF4dVwqYHWyAT1uAmbgsx0Kk4Jc,6310
113
+ pulse/types/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
114
+ pulse/types/event_handler.py,sha256=psQCydj-WEtBcFU5JU4mDwvyzkW8V2O0g_VFRU2EOHI,1618
115
+ pulse/user_session.py,sha256=FITxLSEl3JU-jod6UWuUYC6EpnPG2rbaLCnIOdkQPtg,7803
116
+ pulse/version.py,sha256=711vaM1jVIQPgkisGgKZqwmw019qZIsc_QTae75K2pg,1895
117
+ pulse_framework-0.1.52.dist-info/WHEEL,sha256=eh7sammvW2TypMMMGKgsM83HyA_3qQ5Lgg3ynoecH3M,79
118
+ pulse_framework-0.1.52.dist-info/entry_points.txt,sha256=i7aohd3QaPu5IcuGKKvsQQEiMYMe5HcF56QEsaLVO64,46
119
+ pulse_framework-0.1.52.dist-info/METADATA,sha256=Lh5FVANVderYIR7EPbgi5-YmcmbLyowt9igyFzJrqwE,580
120
+ pulse_framework-0.1.52.dist-info/RECORD,,