reflex 0.6.0__py3-none-any.whl → 0.6.0a1__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.

Potentially problematic release.


This version of reflex might be problematic. Click here for more details.

Files changed (253) hide show
  1. reflex/.templates/jinja/custom_components/pyproject.toml.jinja2 +2 -2
  2. reflex/.templates/jinja/web/pages/_app.js.jinja2 +1 -1
  3. reflex/.templates/jinja/web/pages/utils.js.jinja2 +2 -2
  4. reflex/.templates/web/components/reflex/chakra_color_mode_provider.js +36 -0
  5. reflex/.templates/web/utils/state.js +1 -3
  6. reflex/__init__.py +2 -8
  7. reflex/__init__.pyi +1 -2
  8. reflex/app.py +2 -4
  9. reflex/app_module_for_backend.py +1 -1
  10. reflex/base.py +1 -1
  11. reflex/compiler/compiler.py +2 -2
  12. reflex/compiler/utils.py +3 -3
  13. reflex/components/base/app_wrap.py +2 -2
  14. reflex/components/base/app_wrap.pyi +27 -17
  15. reflex/components/base/bare.py +5 -4
  16. reflex/components/base/body.pyi +27 -17
  17. reflex/components/base/document.pyi +131 -81
  18. reflex/components/base/error_boundary.py +7 -6
  19. reflex/components/base/error_boundary.pyi +33 -20
  20. reflex/components/base/fragment.pyi +27 -17
  21. reflex/components/base/head.pyi +53 -33
  22. reflex/components/base/link.py +1 -1
  23. reflex/components/base/link.pyi +54 -33
  24. reflex/components/base/meta.pyi +105 -65
  25. reflex/components/base/script.py +2 -1
  26. reflex/components/base/script.pyi +38 -21
  27. reflex/components/component.py +47 -53
  28. reflex/components/core/banner.py +27 -23
  29. reflex/components/core/banner.pyi +171 -134
  30. reflex/components/core/client_side_routing.py +3 -2
  31. reflex/components/core/client_side_routing.pyi +54 -33
  32. reflex/components/core/clipboard.py +1 -2
  33. reflex/components/core/clipboard.pyi +33 -20
  34. reflex/components/core/cond.py +5 -5
  35. reflex/components/core/debounce.py +5 -5
  36. reflex/components/core/debounce.pyi +33 -20
  37. reflex/components/core/foreach.py +4 -3
  38. reflex/components/core/html.py +1 -1
  39. reflex/components/core/html.pyi +46 -35
  40. reflex/components/core/match.py +17 -17
  41. reflex/components/core/upload.py +23 -17
  42. reflex/components/core/upload.pyi +124 -78
  43. reflex/components/datadisplay/code.py +10 -9
  44. reflex/components/datadisplay/code.pyi +409 -299
  45. reflex/components/datadisplay/dataeditor.py +10 -8
  46. reflex/components/datadisplay/dataeditor.pyi +53 -40
  47. reflex/components/el/element.pyi +27 -17
  48. reflex/components/el/elements/base.py +1 -1
  49. reflex/components/el/elements/base.pyi +45 -34
  50. reflex/components/el/elements/forms.py +16 -16
  51. reflex/components/el/elements/forms.pyi +707 -554
  52. reflex/components/el/elements/inline.py +1 -1
  53. reflex/components/el/elements/inline.pyi +1218 -937
  54. reflex/components/el/elements/media.py +1 -1
  55. reflex/components/el/elements/media.pyi +997 -786
  56. reflex/components/el/elements/metadata.py +6 -3
  57. reflex/components/el/elements/metadata.pyi +242 -181
  58. reflex/components/el/elements/other.py +1 -1
  59. reflex/components/el/elements/other.pyi +306 -235
  60. reflex/components/el/elements/scripts.py +1 -1
  61. reflex/components/el/elements/scripts.pyi +140 -109
  62. reflex/components/el/elements/sectioning.py +2 -0
  63. reflex/components/el/elements/sectioning.pyi +647 -496
  64. reflex/components/el/elements/tables.py +1 -1
  65. reflex/components/el/elements/tables.pyi +452 -351
  66. reflex/components/el/elements/typography.py +1 -1
  67. reflex/components/el/elements/typography.pyi +657 -506
  68. reflex/components/gridjs/datatable.py +9 -6
  69. reflex/components/gridjs/datatable.pyi +56 -35
  70. reflex/components/lucide/icon.py +1 -1
  71. reflex/components/lucide/icon.pyi +54 -33
  72. reflex/components/markdown/markdown.py +31 -26
  73. reflex/components/markdown/markdown.pyi +37 -27
  74. reflex/components/moment/moment.py +12 -13
  75. reflex/components/moment/moment.pyi +35 -23
  76. reflex/components/next/base.pyi +27 -17
  77. reflex/components/next/image.py +1 -1
  78. reflex/components/next/image.pyi +37 -22
  79. reflex/components/next/link.py +1 -1
  80. reflex/components/next/link.pyi +28 -17
  81. reflex/components/next/video.py +1 -1
  82. reflex/components/next/video.pyi +28 -17
  83. reflex/components/plotly/plotly.py +13 -12
  84. reflex/components/plotly/plotly.pyi +54 -39
  85. reflex/components/props.py +1 -1
  86. reflex/components/radix/__init__.pyi +0 -1
  87. reflex/components/radix/primitives/__init__.pyi +0 -1
  88. reflex/components/radix/primitives/accordion.py +4 -4
  89. reflex/components/radix/primitives/accordion.pyi +495 -424
  90. reflex/components/radix/primitives/base.py +1 -1
  91. reflex/components/radix/primitives/base.pyi +54 -33
  92. reflex/components/radix/primitives/drawer.py +1 -1
  93. reflex/components/radix/primitives/drawer.pyi +273 -172
  94. reflex/components/radix/primitives/form.py +1 -1
  95. reflex/components/radix/primitives/form.pyi +364 -257
  96. reflex/components/radix/primitives/progress.py +1 -1
  97. reflex/components/radix/primitives/progress.pyi +282 -231
  98. reflex/components/radix/primitives/slider.py +1 -1
  99. reflex/components/radix/primitives/slider.pyi +138 -87
  100. reflex/components/radix/themes/base.py +24 -3
  101. reflex/components/radix/themes/base.pyi +250 -178
  102. reflex/components/radix/themes/color_mode.py +5 -5
  103. reflex/components/radix/themes/color_mode.pyi +220 -187
  104. reflex/components/radix/themes/components/alert_dialog.py +1 -1
  105. reflex/components/radix/themes/components/alert_dialog.pyi +207 -136
  106. reflex/components/radix/themes/components/aspect_ratio.py +1 -1
  107. reflex/components/radix/themes/components/aspect_ratio.pyi +28 -17
  108. reflex/components/radix/themes/components/avatar.py +1 -1
  109. reflex/components/radix/themes/components/avatar.pyi +81 -70
  110. reflex/components/radix/themes/components/badge.py +1 -1
  111. reflex/components/radix/themes/components/badge.pyi +99 -88
  112. reflex/components/radix/themes/components/button.py +1 -1
  113. reflex/components/radix/themes/components/button.pyi +109 -98
  114. reflex/components/radix/themes/components/callout.py +1 -1
  115. reflex/components/radix/themes/components/callout.pyi +373 -322
  116. reflex/components/radix/themes/components/card.py +1 -1
  117. reflex/components/radix/themes/components/card.pyi +49 -38
  118. reflex/components/radix/themes/components/checkbox.py +2 -1
  119. reflex/components/radix/themes/components/checkbox.pyi +245 -208
  120. reflex/components/radix/themes/components/checkbox_cards.py +1 -1
  121. reflex/components/radix/themes/components/checkbox_cards.pyi +115 -94
  122. reflex/components/radix/themes/components/checkbox_group.py +1 -1
  123. reflex/components/radix/themes/components/checkbox_group.pyi +107 -86
  124. reflex/components/radix/themes/components/context_menu.py +1 -1
  125. reflex/components/radix/themes/components/context_menu.pyi +319 -238
  126. reflex/components/radix/themes/components/data_list.py +1 -1
  127. reflex/components/radix/themes/components/data_list.pyi +171 -130
  128. reflex/components/radix/themes/components/dialog.py +1 -1
  129. reflex/components/radix/themes/components/dialog.pyi +210 -139
  130. reflex/components/radix/themes/components/dropdown_menu.py +1 -1
  131. reflex/components/radix/themes/components/dropdown_menu.pyi +332 -249
  132. reflex/components/radix/themes/components/hover_card.py +1 -1
  133. reflex/components/radix/themes/components/hover_card.pyi +131 -90
  134. reflex/components/radix/themes/components/icon_button.py +3 -2
  135. reflex/components/radix/themes/components/icon_button.pyi +109 -98
  136. reflex/components/radix/themes/components/inset.py +1 -1
  137. reflex/components/radix/themes/components/inset.pyi +58 -47
  138. reflex/components/radix/themes/components/popover.py +1 -1
  139. reflex/components/radix/themes/components/popover.pyi +136 -95
  140. reflex/components/radix/themes/components/progress.py +1 -1
  141. reflex/components/radix/themes/components/progress.pyi +82 -71
  142. reflex/components/radix/themes/components/radio.py +1 -1
  143. reflex/components/radix/themes/components/radio.pyi +80 -69
  144. reflex/components/radix/themes/components/radio_cards.py +1 -1
  145. reflex/components/radix/themes/components/radio_cards.pyi +119 -98
  146. reflex/components/radix/themes/components/radio_group.py +11 -8
  147. reflex/components/radix/themes/components/radio_group.pyi +271 -228
  148. reflex/components/radix/themes/components/scroll_area.py +1 -1
  149. reflex/components/radix/themes/components/scroll_area.pyi +32 -21
  150. reflex/components/radix/themes/components/segmented_control.py +1 -1
  151. reflex/components/radix/themes/components/segmented_control.pyi +113 -90
  152. reflex/components/radix/themes/components/select.py +3 -2
  153. reflex/components/radix/themes/components/select.pyi +471 -374
  154. reflex/components/radix/themes/components/separator.py +2 -1
  155. reflex/components/radix/themes/components/separator.pyi +80 -69
  156. reflex/components/radix/themes/components/skeleton.py +1 -1
  157. reflex/components/radix/themes/components/skeleton.pyi +34 -23
  158. reflex/components/radix/themes/components/slider.py +3 -2
  159. reflex/components/radix/themes/components/slider.pyi +88 -75
  160. reflex/components/radix/themes/components/spinner.py +1 -1
  161. reflex/components/radix/themes/components/spinner.pyi +30 -19
  162. reflex/components/radix/themes/components/switch.py +1 -1
  163. reflex/components/radix/themes/components/switch.pyi +84 -71
  164. reflex/components/radix/themes/components/table.py +1 -1
  165. reflex/components/radix/themes/components/table.pyi +332 -261
  166. reflex/components/radix/themes/components/tabs.py +1 -1
  167. reflex/components/radix/themes/components/tabs.pyi +194 -139
  168. reflex/components/radix/themes/components/text_area.py +1 -1
  169. reflex/components/radix/themes/components/text_area.pyi +111 -96
  170. reflex/components/radix/themes/components/text_field.py +1 -1
  171. reflex/components/radix/themes/components/text_field.pyi +286 -247
  172. reflex/components/radix/themes/components/tooltip.py +1 -1
  173. reflex/components/radix/themes/components/tooltip.pyi +37 -26
  174. reflex/components/radix/themes/layout/__init__.pyi +0 -1
  175. reflex/components/radix/themes/layout/base.py +1 -1
  176. reflex/components/radix/themes/layout/base.pyi +67 -56
  177. reflex/components/radix/themes/layout/box.pyi +45 -34
  178. reflex/components/radix/themes/layout/center.pyi +67 -56
  179. reflex/components/radix/themes/layout/container.py +2 -1
  180. reflex/components/radix/themes/layout/container.pyi +47 -36
  181. reflex/components/radix/themes/layout/flex.py +1 -1
  182. reflex/components/radix/themes/layout/flex.pyi +67 -56
  183. reflex/components/radix/themes/layout/grid.py +1 -1
  184. reflex/components/radix/themes/layout/grid.pyi +75 -64
  185. reflex/components/radix/themes/layout/list.py +6 -5
  186. reflex/components/radix/themes/layout/list.pyi +244 -193
  187. reflex/components/radix/themes/layout/section.py +2 -1
  188. reflex/components/radix/themes/layout/section.pyi +47 -36
  189. reflex/components/radix/themes/layout/spacer.pyi +67 -56
  190. reflex/components/radix/themes/layout/stack.py +1 -1
  191. reflex/components/radix/themes/layout/stack.pyi +159 -128
  192. reflex/components/radix/themes/typography/blockquote.py +1 -1
  193. reflex/components/radix/themes/typography/blockquote.pyi +100 -89
  194. reflex/components/radix/themes/typography/code.py +1 -1
  195. reflex/components/radix/themes/typography/code.pyi +101 -90
  196. reflex/components/radix/themes/typography/heading.py +1 -1
  197. reflex/components/radix/themes/typography/heading.pyi +107 -96
  198. reflex/components/radix/themes/typography/link.py +1 -1
  199. reflex/components/radix/themes/typography/link.pyi +113 -102
  200. reflex/components/radix/themes/typography/text.py +1 -1
  201. reflex/components/radix/themes/typography/text.pyi +572 -501
  202. reflex/components/react_player/audio.pyi +60 -33
  203. reflex/components/react_player/react_player.py +1 -1
  204. reflex/components/react_player/react_player.pyi +60 -33
  205. reflex/components/react_player/video.pyi +60 -33
  206. reflex/components/recharts/cartesian.py +3 -2
  207. reflex/components/recharts/cartesian.pyi +861 -678
  208. reflex/components/recharts/charts.py +5 -4
  209. reflex/components/recharts/charts.pyi +357 -252
  210. reflex/components/recharts/general.py +2 -1
  211. reflex/components/recharts/general.pyi +231 -180
  212. reflex/components/recharts/polar.py +5 -4
  213. reflex/components/recharts/polar.pyi +181 -144
  214. reflex/components/recharts/recharts.pyi +53 -33
  215. reflex/components/sonner/toast.py +17 -16
  216. reflex/components/sonner/toast.pyi +47 -36
  217. reflex/components/suneditor/editor.py +3 -2
  218. reflex/components/suneditor/editor.pyi +78 -55
  219. reflex/components/tags/cond_tag.py +4 -6
  220. reflex/components/tags/iter_tag.py +16 -28
  221. reflex/components/tags/match_tag.py +4 -6
  222. reflex/components/tags/tag.py +23 -40
  223. reflex/custom_components/custom_components.py +1 -3
  224. reflex/event.py +65 -113
  225. reflex/experimental/client_state.py +24 -25
  226. reflex/experimental/hooks.py +16 -16
  227. reflex/experimental/layout.py +5 -5
  228. reflex/experimental/layout.pyi +187 -136
  229. reflex/{vars → ivars}/__init__.py +2 -6
  230. reflex/{vars → ivars}/base.py +216 -599
  231. reflex/{vars → ivars}/function.py +19 -15
  232. reflex/{vars → ivars}/number.py +20 -41
  233. reflex/{vars → ivars}/object.py +30 -28
  234. reflex/{vars → ivars}/sequence.py +50 -53
  235. reflex/middleware/hydrate_middleware.py +0 -2
  236. reflex/middleware/middleware.py +3 -3
  237. reflex/state.py +82 -148
  238. reflex/style.py +22 -21
  239. reflex/utils/exceptions.py +0 -20
  240. reflex/utils/format.py +34 -54
  241. reflex/utils/imports.py +73 -16
  242. reflex/utils/prerequisites.py +15 -35
  243. reflex/utils/pyi_generator.py +8 -13
  244. reflex/utils/serializers.py +22 -12
  245. reflex/utils/telemetry.py +2 -3
  246. reflex/utils/types.py +5 -10
  247. reflex/vars.py +501 -0
  248. {reflex-0.6.0.dist-info → reflex-0.6.0a1.dist-info}/METADATA +5 -4
  249. reflex-0.6.0a1.dist-info/RECORD +384 -0
  250. reflex-0.6.0.dist-info/RECORD +0 -382
  251. {reflex-0.6.0.dist-info → reflex-0.6.0a1.dist-info}/LICENSE +0 -0
  252. {reflex-0.6.0.dist-info → reflex-0.6.0a1.dist-info}/WHEEL +0 -0
  253. {reflex-0.6.0.dist-info → reflex-0.6.0a1.dist-info}/entry_points.txt +0 -0
@@ -28,19 +28,22 @@ from reflex import constants
28
28
  from reflex.constants.base import REFLEX_VAR_OPENING_TAG
29
29
  from reflex.utils.exceptions import VarTypeError
30
30
  from reflex.utils.types import GenericType, get_origin
31
+ from reflex.vars import (
32
+ Var,
33
+ VarData,
34
+ _global_vars,
35
+ get_unique_variable_name,
36
+ )
31
37
 
32
38
  from .base import (
33
39
  CachedVarOperation,
34
40
  CustomVarOperationReturn,
41
+ ImmutableVar,
35
42
  LiteralNoneVar,
36
43
  LiteralVar,
37
44
  ToOperation,
38
- Var,
39
- VarData,
40
- _global_vars,
41
45
  cached_property_no_lock,
42
46
  figure_out_type,
43
- get_unique_variable_name,
44
47
  unionize,
45
48
  var_operation,
46
49
  var_operation_return,
@@ -56,7 +59,7 @@ if TYPE_CHECKING:
56
59
  from .object import ObjectVar
57
60
 
58
61
 
59
- class StringVar(Var[str]):
62
+ class StringVar(ImmutableVar[str]):
60
63
  """Base class for immutable string vars."""
61
64
 
62
65
  @overload
@@ -194,6 +197,14 @@ class StringVar(Var[str]):
194
197
  """
195
198
  return string_strip_operation(self)
196
199
 
200
+ def bool(self):
201
+ """Boolean conversion.
202
+
203
+ Returns:
204
+ The boolean value of the string.
205
+ """
206
+ return self.length() != 0
207
+
197
208
  def reversed(self) -> StringVar:
198
209
  """Reverse the string.
199
210
 
@@ -545,21 +556,19 @@ class LiteralStringVar(LiteralVar, StringVar):
545
556
  def create(
546
557
  cls,
547
558
  value: str,
548
- _var_type: GenericType | None = str,
549
559
  _var_data: VarData | None = None,
550
560
  ) -> StringVar:
551
561
  """Create a var from a string value.
552
562
 
553
563
  Args:
554
564
  value: The value to create the var from.
555
- _var_type: The type of the var.
556
565
  _var_data: Additional hooks and imports associated with the Var.
557
566
 
558
567
  Returns:
559
568
  The var.
560
569
  """
561
570
  if REFLEX_VAR_OPENING_TAG in value:
562
- strings_and_vals: list[Var | str] = []
571
+ strings_and_vals: list[ImmutableVar | str] = []
563
572
  offset = 0
564
573
 
565
574
  # Find all tags
@@ -576,36 +585,27 @@ class LiteralStringVar(LiteralVar, StringVar):
576
585
  # This is a global immutable var.
577
586
  var = _global_vars[int(serialized_data)]
578
587
  strings_and_vals.append(var)
579
- value = value[(end + len(var._js_expr)) :]
588
+ value = value[(end + len(var._var_name)) :]
580
589
 
581
590
  offset += end - start
582
591
 
583
592
  strings_and_vals.append(value)
584
593
 
585
594
  filtered_strings_and_vals = [
586
- s for s in strings_and_vals if isinstance(s, Var) or s
595
+ s for s in strings_and_vals if isinstance(s, ImmutableVar) or s
587
596
  ]
597
+
588
598
  if len(filtered_strings_and_vals) == 1:
589
- only_string = filtered_strings_and_vals[0]
590
- if isinstance(only_string, str):
591
- return LiteralVar.create(only_string).to(StringVar, _var_type)
592
- else:
593
- return only_string.to(StringVar, only_string._var_type)
599
+ return LiteralVar.create(filtered_strings_and_vals[0]).to(StringVar)
594
600
 
595
- concat_result = ConcatVarOperation.create(
601
+ return ConcatVarOperation.create(
596
602
  *filtered_strings_and_vals,
597
603
  _var_data=_var_data,
598
604
  )
599
605
 
600
- return (
601
- concat_result
602
- if _var_type is str
603
- else concat_result.to(StringVar, _var_type)
604
- )
605
-
606
606
  return LiteralStringVar(
607
- _js_expr=json.dumps(value),
608
- _var_type=_var_type,
607
+ _var_name=json.dumps(value),
608
+ _var_type=str,
609
609
  _var_data=_var_data,
610
610
  _var_value=value,
611
611
  )
@@ -635,7 +635,7 @@ class LiteralStringVar(LiteralVar, StringVar):
635
635
  class ConcatVarOperation(CachedVarOperation, StringVar):
636
636
  """Representing a concatenation of literal string vars."""
637
637
 
638
- _var_value: Tuple[Var, ...] = dataclasses.field(default_factory=tuple)
638
+ _var_value: Tuple[ImmutableVar, ...] = dataclasses.field(default_factory=tuple)
639
639
 
640
640
  @cached_property_no_lock
641
641
  def _cached_var_name(self) -> str:
@@ -644,7 +644,7 @@ class ConcatVarOperation(CachedVarOperation, StringVar):
644
644
  Returns:
645
645
  The name of the var.
646
646
  """
647
- list_of_strs: List[Union[str, Var]] = []
647
+ list_of_strs: List[Union[str, ImmutableVar]] = []
648
648
  last_string = ""
649
649
  for var in self._var_value:
650
650
  if isinstance(var, LiteralStringVar):
@@ -659,7 +659,9 @@ class ConcatVarOperation(CachedVarOperation, StringVar):
659
659
  list_of_strs.append(last_string)
660
660
 
661
661
  list_of_strs_filtered = [
662
- str(LiteralVar.create(s)) for s in list_of_strs if isinstance(s, Var) or s
662
+ str(LiteralVar.create(s))
663
+ for s in list_of_strs
664
+ if isinstance(s, ImmutableVar) or s
663
665
  ]
664
666
 
665
667
  if len(list_of_strs_filtered) == 1:
@@ -678,7 +680,7 @@ class ConcatVarOperation(CachedVarOperation, StringVar):
678
680
  *[
679
681
  var._get_all_var_data()
680
682
  for var in self._var_value
681
- if isinstance(var, Var)
683
+ if isinstance(var, ImmutableVar)
682
684
  ],
683
685
  self._var_data,
684
686
  )
@@ -699,7 +701,7 @@ class ConcatVarOperation(CachedVarOperation, StringVar):
699
701
  The var.
700
702
  """
701
703
  return cls(
702
- _js_expr="",
704
+ _var_name="",
703
705
  _var_type=str,
704
706
  _var_data=_var_data,
705
707
  _var_value=tuple(map(LiteralVar.create, value)),
@@ -716,7 +718,7 @@ KEY_TYPE = TypeVar("KEY_TYPE")
716
718
  VALUE_TYPE = TypeVar("VALUE_TYPE")
717
719
 
718
720
 
719
- class ArrayVar(Var[ARRAY_VAR_TYPE]):
721
+ class ArrayVar(ImmutableVar[ARRAY_VAR_TYPE]):
720
722
  """Base class for immutable array vars."""
721
723
 
722
724
  @overload
@@ -854,9 +856,9 @@ class ArrayVar(Var[ARRAY_VAR_TYPE]):
854
856
  ) -> ObjectVar[Dict[KEY_TYPE, VALUE_TYPE]]: ...
855
857
 
856
858
  @overload
857
- def __getitem__(self, i: int | NumberVar) -> Var: ...
859
+ def __getitem__(self, i: int | NumberVar) -> ImmutableVar: ...
858
860
 
859
- def __getitem__(self, i: Any) -> ArrayVar[ARRAY_VAR_TYPE] | Var:
861
+ def __getitem__(self, i: Any) -> ArrayVar[ARRAY_VAR_TYPE] | ImmutableVar:
860
862
  """Get a slice of the array.
861
863
 
862
864
  Args:
@@ -895,15 +897,6 @@ class ArrayVar(Var[ARRAY_VAR_TYPE]):
895
897
  /,
896
898
  ) -> ArrayVar[List[int]]: ...
897
899
 
898
- @overload
899
- @classmethod
900
- def range(
901
- cls,
902
- first_endpoint: int | NumberVar,
903
- second_endpoint: int | NumberVar | None = None,
904
- step: int | NumberVar | None = None,
905
- ) -> ArrayVar[List[int]]: ...
906
-
907
900
  @classmethod
908
901
  def range(
909
902
  cls,
@@ -1103,15 +1096,15 @@ class ArrayVar(Var[ARRAY_VAR_TYPE]):
1103
1096
  function_var = ArgsFunctionOperation.create(tuple(), return_value)
1104
1097
  else:
1105
1098
  # generic number var
1106
- number_var = Var("").to(NumberVar)
1099
+ number_var = ImmutableVar("").to(NumberVar)
1107
1100
 
1108
1101
  first_arg_type = self[number_var]._var_type
1109
1102
 
1110
1103
  arg_name = get_unique_variable_name()
1111
1104
 
1112
1105
  # get first argument type
1113
- first_arg = Var(
1114
- _js_expr=arg_name,
1106
+ first_arg = ImmutableVar(
1107
+ _var_name=arg_name,
1115
1108
  _var_type=first_arg_type,
1116
1109
  ).guess_type()
1117
1110
 
@@ -1138,9 +1131,9 @@ class LiteralArrayVar(CachedVarOperation, LiteralVar, ArrayVar[ARRAY_VAR_TYPE]):
1138
1131
  """Base class for immutable literal array vars."""
1139
1132
 
1140
1133
  _var_value: Union[
1141
- List[Union[Var, Any]],
1142
- Set[Union[Var, Any]],
1143
- Tuple[Union[Var, Any], ...],
1134
+ List[Union[ImmutableVar, Any]],
1135
+ Set[Union[ImmutableVar, Any]],
1136
+ Tuple[Union[ImmutableVar, Any], ...],
1144
1137
  ] = dataclasses.field(default_factory=list)
1145
1138
 
1146
1139
  @cached_property_no_lock
@@ -1179,7 +1172,7 @@ class LiteralArrayVar(CachedVarOperation, LiteralVar, ArrayVar[ARRAY_VAR_TYPE]):
1179
1172
  Returns:
1180
1173
  The hash of the var.
1181
1174
  """
1182
- return hash((self.__class__.__name__, self._js_expr))
1175
+ return hash((self.__class__.__name__, self._var_name))
1183
1176
 
1184
1177
  def json(self) -> str:
1185
1178
  """Get the JSON representation of the var.
@@ -1212,7 +1205,7 @@ class LiteralArrayVar(CachedVarOperation, LiteralVar, ArrayVar[ARRAY_VAR_TYPE]):
1212
1205
  The var.
1213
1206
  """
1214
1207
  return cls(
1215
- _js_expr="",
1208
+ _var_name="",
1216
1209
  _var_type=figure_out_type(value) if _var_type is None else _var_type,
1217
1210
  _var_data=_var_data,
1218
1211
  _var_value=value,
@@ -1263,14 +1256,18 @@ class ArraySliceOperation(CachedVarOperation, ArrayVar):
1263
1256
  start, end, step = self._start, self._stop, self._step
1264
1257
 
1265
1258
  normalized_start = (
1266
- LiteralVar.create(start) if start is not None else Var(_js_expr="undefined")
1259
+ LiteralVar.create(start)
1260
+ if start is not None
1261
+ else ImmutableVar.create_safe("undefined")
1267
1262
  )
1268
1263
  normalized_end = (
1269
- LiteralVar.create(end) if end is not None else Var(_js_expr="undefined")
1264
+ LiteralVar.create(end)
1265
+ if end is not None
1266
+ else ImmutableVar.create_safe("undefined")
1270
1267
  )
1271
1268
  if step is None:
1272
1269
  return f"{str(self._array)}.slice({str(normalized_start)}, {str(normalized_end)})"
1273
- if not isinstance(step, Var):
1270
+ if not isinstance(step, ImmutableVar):
1274
1271
  if step < 0:
1275
1272
  actual_start = end + 1 if end is not None else 0
1276
1273
  actual_end = start + 1 if start is not None else self._array.length()
@@ -1302,7 +1299,7 @@ class ArraySliceOperation(CachedVarOperation, ArrayVar):
1302
1299
  The var.
1303
1300
  """
1304
1301
  return cls(
1305
- _js_expr="",
1302
+ _var_name="",
1306
1303
  _var_type=array._var_type,
1307
1304
  _var_data=_var_data,
1308
1305
  _array=array,
@@ -2,7 +2,6 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
- import dataclasses
6
5
  from typing import TYPE_CHECKING, Optional
7
6
 
8
7
  from reflex import constants
@@ -15,7 +14,6 @@ if TYPE_CHECKING:
15
14
  from reflex.app import App
16
15
 
17
16
 
18
- @dataclasses.dataclass(init=True)
19
17
  class HydrateMiddleware(Middleware):
20
18
  """Middleware to handle initial app hydration."""
21
19
 
@@ -2,9 +2,10 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
- from abc import ABC, abstractmethod
5
+ from abc import ABC
6
6
  from typing import TYPE_CHECKING, Optional
7
7
 
8
+ from reflex.base import Base
8
9
  from reflex.event import Event
9
10
  from reflex.state import BaseState, StateUpdate
10
11
 
@@ -12,10 +13,9 @@ if TYPE_CHECKING:
12
13
  from reflex.app import App
13
14
 
14
15
 
15
- class Middleware(ABC):
16
+ class Middleware(Base, ABC):
16
17
  """Middleware to preprocess and postprocess requests."""
17
18
 
18
- @abstractmethod
19
19
  async def preprocess(
20
20
  self, app: App, state: BaseState, event: Event
21
21
  ) -> Optional[StateUpdate]: