reflex 0.8.0a1__py3-none-any.whl → 0.8.0a2__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.
- reflex/.templates/jinja/web/pages/stateful_component.js.jinja2 +4 -0
- reflex/.templates/jinja/web/utils/context.js.jinja2 +0 -2
- reflex/.templates/web/app/routes.js +3 -3
- reflex/.templates/web/components/reflex/radix_themes_color_mode_provider.js +1 -6
- reflex/.templates/web/utils/react-theme.js +9 -6
- reflex/.templates/web/utils/state.js +6 -1
- reflex/app.py +1 -1
- reflex/compiler/compiler.py +1 -5
- reflex/compiler/templates.py +3 -3
- reflex/compiler/utils.py +24 -10
- reflex/components/component.py +37 -23
- reflex/components/datadisplay/code.py +2 -72
- reflex/components/datadisplay/code.pyi +0 -3
- reflex/components/datadisplay/dataeditor.pyi +6 -2
- reflex/components/dynamic.py +1 -0
- reflex/components/radix/themes/typography/link.py +6 -4
- reflex/components/sonner/toast.pyi +3 -2
- reflex/constants/__init__.py +1 -2
- reflex/constants/base.py +1 -14
- reflex/constants/compiler.py +1 -1
- reflex/constants/installer.py +2 -3
- reflex/constants/route.py +19 -7
- reflex/route.py +15 -21
- reflex/testing.py +1 -1
- reflex/utils/build.py +29 -13
- reflex/utils/export.py +1 -1
- reflex/utils/prerequisites.py +7 -7
- reflex/utils/processes.py +2 -1
- {reflex-0.8.0a1.dist-info → reflex-0.8.0a2.dist-info}/METADATA +1 -1
- {reflex-0.8.0a1.dist-info → reflex-0.8.0a2.dist-info}/RECORD +33 -33
- {reflex-0.8.0a1.dist-info → reflex-0.8.0a2.dist-info}/WHEEL +0 -0
- {reflex-0.8.0a1.dist-info → reflex-0.8.0a2.dist-info}/entry_points.txt +0 -0
- {reflex-0.8.0a1.dist-info → reflex-0.8.0a2.dist-info}/licenses/LICENSE +0 -0
|
@@ -2,7 +2,11 @@
|
|
|
2
2
|
{% from 'web/pages/macros.js.jinja2' import renderHooksWithMemo %}
|
|
3
3
|
{% set all_hooks = component._get_all_hooks() %}
|
|
4
4
|
|
|
5
|
+
{% if export %}
|
|
5
6
|
export function {{tag_name}} () {
|
|
7
|
+
{% else %}
|
|
8
|
+
function {{tag_name}} () {
|
|
9
|
+
{% endif %}
|
|
6
10
|
{{ renderHooksWithMemo(all_hooks, memo_trigger_hooks) }}
|
|
7
11
|
|
|
8
12
|
return (
|
|
@@ -69,8 +69,6 @@ export const initialEvents = () => []
|
|
|
69
69
|
|
|
70
70
|
export const isDevMode = {{ is_dev_mode|json_dumps }}
|
|
71
71
|
|
|
72
|
-
export const lastCompiledTimeStamp = {{ last_compiled_time|json_dumps }}
|
|
73
|
-
|
|
74
72
|
export function UploadFilesProvider({ children }) {
|
|
75
73
|
const [filesById, setFilesById] = useState({})
|
|
76
74
|
refs["__clear_selected_files"] = (id) => setFilesById(filesById => {
|
|
@@ -2,9 +2,9 @@ import { route } from "@react-router/dev/routes";
|
|
|
2
2
|
import { flatRoutes } from "@react-router/fs-routes";
|
|
3
3
|
|
|
4
4
|
export default [
|
|
5
|
-
route("
|
|
6
|
-
route("404", "routes/[404]_._index.js", { id: "404" }),
|
|
5
|
+
route("404", "routes/[404]_._index.jsx", { id: "404" }),
|
|
7
6
|
...(await flatRoutes({
|
|
8
|
-
ignoredRouteFiles: ["routes/\\[404\\]_._index.
|
|
7
|
+
ignoredRouteFiles: ["routes/\\[404\\]_._index.jsx"],
|
|
9
8
|
})),
|
|
9
|
+
route("*", "routes/[404]_._index.jsx"),
|
|
10
10
|
];
|
|
@@ -1,11 +1,6 @@
|
|
|
1
1
|
import { useTheme } from "$/utils/react-theme";
|
|
2
2
|
import { createElement } from "react";
|
|
3
|
-
import {
|
|
4
|
-
ColorModeContext,
|
|
5
|
-
defaultColorMode,
|
|
6
|
-
isDevMode,
|
|
7
|
-
lastCompiledTimeStamp,
|
|
8
|
-
} from "$/utils/context";
|
|
3
|
+
import { ColorModeContext, defaultColorMode } from "$/utils/context";
|
|
9
4
|
|
|
10
5
|
export default function RadixThemesColorModeProvider({ children }) {
|
|
11
6
|
const { theme, resolvedTheme, setTheme } = useTheme();
|
|
@@ -8,9 +8,13 @@ import {
|
|
|
8
8
|
useMemo,
|
|
9
9
|
} from "react";
|
|
10
10
|
|
|
11
|
-
import { isDevMode,
|
|
11
|
+
import { isDevMode, defaultColorMode } from "$/utils/context";
|
|
12
12
|
|
|
13
|
-
const ThemeContext = createContext(
|
|
13
|
+
const ThemeContext = createContext({
|
|
14
|
+
theme: defaultColorMode,
|
|
15
|
+
resolvedTheme: defaultColorMode !== "system" ? defaultColorMode : "light",
|
|
16
|
+
setTheme: () => {},
|
|
17
|
+
});
|
|
14
18
|
|
|
15
19
|
export function ThemeProvider({ children, defaultTheme = "system" }) {
|
|
16
20
|
const [theme, setTheme] = useState(defaultTheme);
|
|
@@ -28,11 +32,10 @@ export function ThemeProvider({ children, defaultTheme = "system" }) {
|
|
|
28
32
|
firstRender.current = false;
|
|
29
33
|
|
|
30
34
|
if (isDevMode) {
|
|
31
|
-
const
|
|
32
|
-
|
|
33
|
-
if (lastCompiledTimeInLocalStorage !== lastCompiledTimeStamp) {
|
|
35
|
+
const lastCompiledTheme = localStorage.getItem("last_compiled_theme");
|
|
36
|
+
if (lastCompiledTheme !== defaultColorMode) {
|
|
34
37
|
// on app startup, make sure the application color mode is persisted correctly.
|
|
35
|
-
localStorage.setItem("
|
|
38
|
+
localStorage.setItem("last_compiled_theme", defaultColorMode);
|
|
36
39
|
return;
|
|
37
40
|
}
|
|
38
41
|
}
|
|
@@ -842,7 +842,12 @@ export const useEventLoop = (
|
|
|
842
842
|
const params = useRef(paramsR);
|
|
843
843
|
|
|
844
844
|
useEffect(() => {
|
|
845
|
-
|
|
845
|
+
const { "*": splat, ...remainingParams } = paramsR;
|
|
846
|
+
if (splat) {
|
|
847
|
+
params.current = { ...remainingParams, splat: splat.split("/") };
|
|
848
|
+
} else {
|
|
849
|
+
params.current = remainingParams;
|
|
850
|
+
}
|
|
846
851
|
}, [paramsR]);
|
|
847
852
|
|
|
848
853
|
// Function to add new events to the event queue.
|
reflex/app.py
CHANGED
|
@@ -890,7 +890,7 @@ class App(MiddlewareMixin, LifespanMixin):
|
|
|
890
890
|
def _check_routes_conflict(self, new_route: str):
|
|
891
891
|
"""Verify if there is any conflict between the new route and any existing route.
|
|
892
892
|
|
|
893
|
-
Based on conflicts that
|
|
893
|
+
Based on conflicts that React Router would throw if not intercepted.
|
|
894
894
|
|
|
895
895
|
Raises:
|
|
896
896
|
RouteValueError: exception showing which conflict exist with the route to be added
|
reflex/compiler/compiler.py
CHANGED
|
@@ -4,7 +4,6 @@ from __future__ import annotations
|
|
|
4
4
|
|
|
5
5
|
import sys
|
|
6
6
|
from collections.abc import Iterable, Sequence
|
|
7
|
-
from datetime import datetime
|
|
8
7
|
from inspect import getmodule
|
|
9
8
|
from pathlib import Path
|
|
10
9
|
from typing import TYPE_CHECKING
|
|
@@ -126,21 +125,18 @@ def _compile_contexts(state: type[BaseState] | None, theme: Component | None) ->
|
|
|
126
125
|
if appearance is None or str(LiteralVar.create(appearance)) == '"inherit"':
|
|
127
126
|
appearance = LiteralVar.create(SYSTEM_COLOR_MODE)
|
|
128
127
|
|
|
129
|
-
last_compiled_time = str(datetime.now())
|
|
130
128
|
return (
|
|
131
129
|
templates.CONTEXT.render(
|
|
132
130
|
initial_state=utils.compile_state(state),
|
|
133
131
|
state_name=state.get_name(),
|
|
134
132
|
client_storage=utils.compile_client_storage(state),
|
|
135
133
|
is_dev_mode=not is_prod_mode(),
|
|
136
|
-
last_compiled_time=last_compiled_time,
|
|
137
134
|
default_color_mode=appearance,
|
|
138
135
|
)
|
|
139
136
|
if state
|
|
140
137
|
else templates.CONTEXT.render(
|
|
141
138
|
is_dev_mode=not is_prod_mode(),
|
|
142
139
|
default_color_mode=appearance,
|
|
143
|
-
last_compiled_time=last_compiled_time,
|
|
144
140
|
)
|
|
145
141
|
)
|
|
146
142
|
|
|
@@ -429,7 +425,7 @@ def _compile_stateful_components(
|
|
|
429
425
|
|
|
430
426
|
# Include custom code in the shared component.
|
|
431
427
|
rendered_components.update(
|
|
432
|
-
dict.fromkeys(component._get_all_custom_code()),
|
|
428
|
+
dict.fromkeys(component._get_all_custom_code(export=True)),
|
|
433
429
|
)
|
|
434
430
|
|
|
435
431
|
# Include all imports in the shared component.
|
reflex/compiler/templates.py
CHANGED
|
@@ -113,10 +113,10 @@ def from_string(source: str) -> Template:
|
|
|
113
113
|
# Template for the Reflex config file.
|
|
114
114
|
RXCONFIG = get_template("app/rxconfig.py.jinja2")
|
|
115
115
|
|
|
116
|
-
# Code to render
|
|
116
|
+
# Code to render the Document root.
|
|
117
117
|
DOCUMENT_ROOT = get_template("web/pages/_document.js.jinja2")
|
|
118
118
|
|
|
119
|
-
# Code to render
|
|
119
|
+
# Code to render App root.
|
|
120
120
|
APP_ROOT = get_template("web/pages/_app.js.jinja2")
|
|
121
121
|
|
|
122
122
|
# Template for the theme file.
|
|
@@ -128,7 +128,7 @@ CONTEXT = get_template("web/utils/context.js.jinja2")
|
|
|
128
128
|
# Template to render a component tag.
|
|
129
129
|
COMPONENT = get_template("web/pages/component.js.jinja2")
|
|
130
130
|
|
|
131
|
-
# Code to render a single
|
|
131
|
+
# Code to render a single react page.
|
|
132
132
|
PAGE = get_template("web/pages/index.js.jinja2")
|
|
133
133
|
|
|
134
134
|
# Code to render the custom components page.
|
reflex/compiler/utils.py
CHANGED
|
@@ -5,7 +5,7 @@ from __future__ import annotations
|
|
|
5
5
|
import asyncio
|
|
6
6
|
import concurrent.futures
|
|
7
7
|
import traceback
|
|
8
|
-
from collections.abc import Sequence
|
|
8
|
+
from collections.abc import Mapping, Sequence
|
|
9
9
|
from datetime import datetime
|
|
10
10
|
from pathlib import Path
|
|
11
11
|
from typing import Any
|
|
@@ -174,6 +174,18 @@ def save_error(error: Exception) -> str:
|
|
|
174
174
|
return str(log_path)
|
|
175
175
|
|
|
176
176
|
|
|
177
|
+
def _sorted_keys(d: Mapping[str, Any]) -> dict[str, Any]:
|
|
178
|
+
"""Sort the keys of a dictionary.
|
|
179
|
+
|
|
180
|
+
Args:
|
|
181
|
+
d: The dictionary to sort.
|
|
182
|
+
|
|
183
|
+
Returns:
|
|
184
|
+
A new dictionary with sorted keys.
|
|
185
|
+
"""
|
|
186
|
+
return dict(sorted(d.items(), key=lambda kv: kv[0]))
|
|
187
|
+
|
|
188
|
+
|
|
177
189
|
def compile_state(state: type[BaseState]) -> dict:
|
|
178
190
|
"""Compile the state of the app.
|
|
179
191
|
|
|
@@ -198,10 +210,10 @@ def compile_state(state: type[BaseState]) -> dict:
|
|
|
198
210
|
console.warn(
|
|
199
211
|
f"Had to get initial state in a thread 🤮 {resolved_initial_state}",
|
|
200
212
|
)
|
|
201
|
-
return resolved_initial_state
|
|
213
|
+
return _sorted_keys(resolved_initial_state)
|
|
202
214
|
|
|
203
215
|
# Normally the compile runs before any event loop starts, we asyncio.run is available for calling.
|
|
204
|
-
return asyncio.run(_resolve_delta(initial_state))
|
|
216
|
+
return _sorted_keys(asyncio.run(_resolve_delta(initial_state)))
|
|
205
217
|
|
|
206
218
|
|
|
207
219
|
def _compile_client_storage_field(
|
|
@@ -403,7 +415,10 @@ def create_theme(style: ComponentStyle) -> dict:
|
|
|
403
415
|
|
|
404
416
|
def _format_route_part(part: str) -> str:
|
|
405
417
|
if part.startswith("[") and part.endswith("]"):
|
|
406
|
-
|
|
418
|
+
if part.startswith(("[...", "[[...")):
|
|
419
|
+
return "$"
|
|
420
|
+
# We don't add [] here since we are reusing them from the input
|
|
421
|
+
return "$" + part + "_"
|
|
407
422
|
return "[" + part + "]_"
|
|
408
423
|
|
|
409
424
|
|
|
@@ -411,9 +426,8 @@ def _path_to_file_stem(path: str) -> str:
|
|
|
411
426
|
if path == "index":
|
|
412
427
|
return "_index"
|
|
413
428
|
path = path if path != "index" else "/"
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
).lstrip(".")
|
|
429
|
+
name = ".".join([_format_route_part(part) for part in path.split("/")]).lstrip(".")
|
|
430
|
+
return name + "._index" if not name.endswith("$") else name
|
|
417
431
|
|
|
418
432
|
|
|
419
433
|
def get_page_path(path: str) -> str:
|
|
@@ -429,7 +443,7 @@ def get_page_path(path: str) -> str:
|
|
|
429
443
|
get_web_dir()
|
|
430
444
|
/ constants.Dirs.PAGES
|
|
431
445
|
/ constants.Dirs.ROUTES
|
|
432
|
-
/ (_path_to_file_stem(path) + constants.Ext.
|
|
446
|
+
/ (_path_to_file_stem(path) + constants.Ext.JSX)
|
|
433
447
|
)
|
|
434
448
|
|
|
435
449
|
|
|
@@ -477,7 +491,7 @@ def get_components_path() -> str:
|
|
|
477
491
|
return str(
|
|
478
492
|
get_web_dir()
|
|
479
493
|
/ constants.Dirs.UTILS
|
|
480
|
-
/ (constants.PageNames.COMPONENTS + constants.Ext.
|
|
494
|
+
/ (constants.PageNames.COMPONENTS + constants.Ext.JSX),
|
|
481
495
|
)
|
|
482
496
|
|
|
483
497
|
|
|
@@ -490,7 +504,7 @@ def get_stateful_components_path() -> str:
|
|
|
490
504
|
return str(
|
|
491
505
|
get_web_dir()
|
|
492
506
|
/ constants.Dirs.UTILS
|
|
493
|
-
/ (constants.PageNames.STATEFUL_COMPONENTS + constants.Ext.
|
|
507
|
+
/ (constants.PageNames.STATEFUL_COMPONENTS + constants.Ext.JSX)
|
|
494
508
|
)
|
|
495
509
|
|
|
496
510
|
|
reflex/components/component.py
CHANGED
|
@@ -2293,16 +2293,19 @@ class StatefulComponent(BaseComponent):
|
|
|
2293
2293
|
tag_to_stateful_component: ClassVar[dict[str, StatefulComponent]] = {}
|
|
2294
2294
|
|
|
2295
2295
|
# Reference to the original component that was memoized into this component.
|
|
2296
|
-
component: Component
|
|
2297
|
-
|
|
2298
|
-
|
|
2299
|
-
code: str
|
|
2296
|
+
component: Component = field(
|
|
2297
|
+
default_factory=Component, is_javascript_property=False
|
|
2298
|
+
)
|
|
2300
2299
|
|
|
2301
2300
|
# How many times this component is referenced in the app.
|
|
2302
|
-
references: int = 0
|
|
2301
|
+
references: int = field(default=0, is_javascript_property=False)
|
|
2303
2302
|
|
|
2304
2303
|
# Whether the component has already been rendered to a shared file.
|
|
2305
|
-
rendered_as_shared: bool = False
|
|
2304
|
+
rendered_as_shared: bool = field(default=False, is_javascript_property=False)
|
|
2305
|
+
|
|
2306
|
+
memo_trigger_hooks: list[str] = field(
|
|
2307
|
+
default_factory=list, is_javascript_property=False
|
|
2308
|
+
)
|
|
2306
2309
|
|
|
2307
2310
|
@classmethod
|
|
2308
2311
|
def create(cls, component: Component) -> StatefulComponent | None:
|
|
@@ -2362,8 +2365,7 @@ class StatefulComponent(BaseComponent):
|
|
|
2362
2365
|
# Look up the tag in the cache
|
|
2363
2366
|
stateful_component = cls.tag_to_stateful_component.get(tag_name)
|
|
2364
2367
|
if stateful_component is None:
|
|
2365
|
-
|
|
2366
|
-
code = cls._render_stateful_code(component, tag_name=tag_name)
|
|
2368
|
+
memo_trigger_hooks = cls._fix_event_triggers(component)
|
|
2367
2369
|
# Set the stateful component in the cache for the given tag.
|
|
2368
2370
|
stateful_component = cls.tag_to_stateful_component.setdefault(
|
|
2369
2371
|
tag_name,
|
|
@@ -2371,7 +2373,7 @@ class StatefulComponent(BaseComponent):
|
|
|
2371
2373
|
children=component.children,
|
|
2372
2374
|
component=component,
|
|
2373
2375
|
tag=tag_name,
|
|
2374
|
-
|
|
2376
|
+
memo_trigger_hooks=memo_trigger_hooks,
|
|
2375
2377
|
),
|
|
2376
2378
|
)
|
|
2377
2379
|
# Bump the reference count -- multiple pages referencing the same component
|
|
@@ -2435,26 +2437,38 @@ class StatefulComponent(BaseComponent):
|
|
|
2435
2437
|
f"{component.tag or 'Comp'}_{code_hash}"
|
|
2436
2438
|
).capitalize()
|
|
2437
2439
|
|
|
2438
|
-
@classmethod
|
|
2439
2440
|
def _render_stateful_code(
|
|
2441
|
+
self,
|
|
2442
|
+
export: bool = False,
|
|
2443
|
+
) -> str:
|
|
2444
|
+
if not self.tag:
|
|
2445
|
+
return ""
|
|
2446
|
+
# Render the code for this component and hooks.
|
|
2447
|
+
return STATEFUL_COMPONENT.render(
|
|
2448
|
+
tag_name=self.tag,
|
|
2449
|
+
memo_trigger_hooks=self.memo_trigger_hooks,
|
|
2450
|
+
component=self.component,
|
|
2451
|
+
export=export,
|
|
2452
|
+
)
|
|
2453
|
+
|
|
2454
|
+
@classmethod
|
|
2455
|
+
def _fix_event_triggers(
|
|
2440
2456
|
cls,
|
|
2441
2457
|
component: Component,
|
|
2442
|
-
|
|
2443
|
-
) -> str:
|
|
2458
|
+
) -> list[str]:
|
|
2444
2459
|
"""Render the code for a stateful component.
|
|
2445
2460
|
|
|
2446
2461
|
Args:
|
|
2447
2462
|
component: The component to render.
|
|
2448
|
-
tag_name: The tag name for the stateful component (see _get_tag_name).
|
|
2449
2463
|
|
|
2450
2464
|
Returns:
|
|
2451
|
-
The
|
|
2465
|
+
The memoized event trigger hooks for the component.
|
|
2452
2466
|
"""
|
|
2453
2467
|
# Memoize event triggers useCallback to avoid unnecessary re-renders.
|
|
2454
2468
|
memo_event_triggers = tuple(cls._get_memoized_event_triggers(component).items())
|
|
2455
2469
|
|
|
2456
2470
|
# Trigger hooks stored separately to write after the normal hooks (see stateful_component.js.jinja2)
|
|
2457
|
-
memo_trigger_hooks = []
|
|
2471
|
+
memo_trigger_hooks: list[str] = []
|
|
2458
2472
|
|
|
2459
2473
|
if memo_event_triggers:
|
|
2460
2474
|
# Copy the component to avoid mutating the original.
|
|
@@ -2468,12 +2482,7 @@ class StatefulComponent(BaseComponent):
|
|
|
2468
2482
|
memo_trigger_hooks.append(memo_trigger_hook)
|
|
2469
2483
|
component.event_triggers[event_trigger] = memo_trigger
|
|
2470
2484
|
|
|
2471
|
-
|
|
2472
|
-
return STATEFUL_COMPONENT.render(
|
|
2473
|
-
tag_name=tag_name,
|
|
2474
|
-
memo_trigger_hooks=memo_trigger_hooks,
|
|
2475
|
-
component=component,
|
|
2476
|
-
)
|
|
2485
|
+
return memo_trigger_hooks
|
|
2477
2486
|
|
|
2478
2487
|
@staticmethod
|
|
2479
2488
|
def _get_hook_deps(hook: str) -> list[str]:
|
|
@@ -2631,15 +2640,20 @@ class StatefulComponent(BaseComponent):
|
|
|
2631
2640
|
return set()
|
|
2632
2641
|
return self.component._get_all_dynamic_imports()
|
|
2633
2642
|
|
|
2634
|
-
def _get_all_custom_code(self) -> set[str]:
|
|
2643
|
+
def _get_all_custom_code(self, export: bool = False) -> set[str]:
|
|
2635
2644
|
"""Get custom code for the component.
|
|
2636
2645
|
|
|
2646
|
+
Args:
|
|
2647
|
+
export: Whether to export the component.
|
|
2648
|
+
|
|
2637
2649
|
Returns:
|
|
2638
2650
|
The custom code.
|
|
2639
2651
|
"""
|
|
2640
2652
|
if self.rendered_as_shared:
|
|
2641
2653
|
return set()
|
|
2642
|
-
return self.component._get_all_custom_code().union(
|
|
2654
|
+
return self.component._get_all_custom_code().union(
|
|
2655
|
+
{self._render_stateful_code(export=export)}
|
|
2656
|
+
)
|
|
2643
2657
|
|
|
2644
2658
|
def _get_all_refs(self) -> set[str]:
|
|
2645
2659
|
"""Get the refs for the children of the component.
|
|
@@ -3,13 +3,12 @@
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
5
|
import dataclasses
|
|
6
|
-
import typing
|
|
7
6
|
from typing import ClassVar, Literal
|
|
8
7
|
|
|
9
8
|
from reflex.components.component import Component, ComponentNamespace
|
|
10
9
|
from reflex.components.core.cond import color_mode_cond
|
|
11
10
|
from reflex.components.lucide.icon import Icon
|
|
12
|
-
from reflex.components.markdown.markdown import
|
|
11
|
+
from reflex.components.markdown.markdown import MarkdownComponentMap
|
|
13
12
|
from reflex.components.radix.themes.components.button import Button
|
|
14
13
|
from reflex.components.radix.themes.layout.box import Box
|
|
15
14
|
from reflex.constants.colors import Color
|
|
@@ -315,7 +314,7 @@ def construct_theme_var(theme: str) -> Var[Theme]:
|
|
|
315
314
|
theme,
|
|
316
315
|
_var_data=VarData(
|
|
317
316
|
imports={
|
|
318
|
-
f"react-syntax-highlighter/dist/
|
|
317
|
+
f"react-syntax-highlighter/dist/esm/styles/prism/{format.to_kebab_case(theme)}": [
|
|
319
318
|
ImportVar(tag=theme, is_default=True, install=False)
|
|
320
319
|
]
|
|
321
320
|
}
|
|
@@ -502,75 +501,6 @@ class CodeBlock(Component, MarkdownComponentMap):
|
|
|
502
501
|
def _exclude_props(self) -> list[str]:
|
|
503
502
|
return ["can_copy", "copy_button"]
|
|
504
503
|
|
|
505
|
-
@classmethod
|
|
506
|
-
def _get_language_registration_hook(cls, language_var: Var = _LANGUAGE) -> Var:
|
|
507
|
-
"""Get the hook to register the language.
|
|
508
|
-
|
|
509
|
-
Args:
|
|
510
|
-
language_var: The const/literal Var of the language module to import.
|
|
511
|
-
For markdown, uses the default placeholder _LANGUAGE. For direct use,
|
|
512
|
-
a LiteralStringVar should be passed via the language prop.
|
|
513
|
-
|
|
514
|
-
Returns:
|
|
515
|
-
The hook to register the language.
|
|
516
|
-
"""
|
|
517
|
-
language_in_there = Var.create(typing.get_args(LiteralCodeLanguage)).contains(
|
|
518
|
-
language_var
|
|
519
|
-
)
|
|
520
|
-
async_load = f"""
|
|
521
|
-
(async () => {{
|
|
522
|
-
try {{
|
|
523
|
-
const module = await import(`react-syntax-highlighter/dist/cjs/languages/prism/${{{language_var!s}}}`);
|
|
524
|
-
SyntaxHighlighter.registerLanguage({language_var!s}, module.default);
|
|
525
|
-
}} catch (error) {{
|
|
526
|
-
console.error(`Language ${{{language_var!s}}} is not supported for code blocks inside of markdown: `, error);
|
|
527
|
-
}}
|
|
528
|
-
}})();
|
|
529
|
-
"""
|
|
530
|
-
return Var(
|
|
531
|
-
f"""
|
|
532
|
-
if ({language_var!s}) {{
|
|
533
|
-
if (!{language_in_there!s}) {{
|
|
534
|
-
console.warn(`Language \\`${{{language_var!s}}}\\` is not supported for code blocks inside of markdown.`);
|
|
535
|
-
{language_var!s} = '';
|
|
536
|
-
}} else {{
|
|
537
|
-
{async_load!s}
|
|
538
|
-
}}
|
|
539
|
-
}}
|
|
540
|
-
"""
|
|
541
|
-
if not isinstance(language_var, LiteralVar)
|
|
542
|
-
else f"""
|
|
543
|
-
if ({language_var!s}) {{
|
|
544
|
-
{async_load!s}
|
|
545
|
-
}}""",
|
|
546
|
-
_var_data=VarData(
|
|
547
|
-
imports={
|
|
548
|
-
cls.get_fields()["library"].default_value(): [
|
|
549
|
-
ImportVar(tag="PrismAsyncLight", alias="SyntaxHighlighter")
|
|
550
|
-
]
|
|
551
|
-
},
|
|
552
|
-
),
|
|
553
|
-
)
|
|
554
|
-
|
|
555
|
-
@classmethod
|
|
556
|
-
def get_component_map_custom_code(cls) -> Var:
|
|
557
|
-
"""Get the custom code for the component.
|
|
558
|
-
|
|
559
|
-
Returns:
|
|
560
|
-
The custom code for the component.
|
|
561
|
-
"""
|
|
562
|
-
return cls._get_language_registration_hook()
|
|
563
|
-
|
|
564
|
-
def add_hooks(self) -> list[str | Var]:
|
|
565
|
-
"""Add hooks for the component.
|
|
566
|
-
|
|
567
|
-
Returns:
|
|
568
|
-
The hooks for the component.
|
|
569
|
-
"""
|
|
570
|
-
return [
|
|
571
|
-
self._get_language_registration_hook(language_var=self.language),
|
|
572
|
-
]
|
|
573
|
-
|
|
574
504
|
|
|
575
505
|
class CodeblockNamespace(ComponentNamespace):
|
|
576
506
|
"""Namespace for the CodeBlock component."""
|
|
@@ -987,9 +987,6 @@ class CodeBlock(Component, MarkdownComponentMap):
|
|
|
987
987
|
"""
|
|
988
988
|
|
|
989
989
|
def add_style(self): ...
|
|
990
|
-
@classmethod
|
|
991
|
-
def get_component_map_custom_code(cls) -> Var: ...
|
|
992
|
-
def add_hooks(self) -> list[str | Var]: ...
|
|
993
990
|
|
|
994
991
|
class CodeblockNamespace(ComponentNamespace):
|
|
995
992
|
themes = Theme
|
|
@@ -3,11 +3,11 @@
|
|
|
3
3
|
# ------------------- DO NOT EDIT ----------------------
|
|
4
4
|
# This file was generated by `reflex/utils/pyi_generator.py`!
|
|
5
5
|
# ------------------------------------------------------
|
|
6
|
+
import dataclasses
|
|
6
7
|
from collections.abc import Mapping, Sequence
|
|
7
8
|
from enum import Enum
|
|
8
9
|
from typing import Any, Literal, TypedDict, overload
|
|
9
10
|
|
|
10
|
-
from reflex.base import Base
|
|
11
11
|
from reflex.components.component import NoSSRComponent
|
|
12
12
|
from reflex.components.core.breakpoints import Breakpoints
|
|
13
13
|
from reflex.event import EventType, PointerEventInfo
|
|
@@ -43,7 +43,8 @@ class GridColumnIcons(Enum):
|
|
|
43
43
|
Uri = "uri"
|
|
44
44
|
VideoUri = "video_uri"
|
|
45
45
|
|
|
46
|
-
|
|
46
|
+
@dataclasses.dataclass
|
|
47
|
+
class DataEditorThemeBase:
|
|
47
48
|
accent_color: str | None
|
|
48
49
|
accent_fg: str | None
|
|
49
50
|
accent_light: str | None
|
|
@@ -77,6 +78,9 @@ class DataEditorTheme(Base):
|
|
|
77
78
|
text_light: str | None
|
|
78
79
|
text_medium: str | None
|
|
79
80
|
|
|
81
|
+
@dataclasses.dataclass(init=False)
|
|
82
|
+
class DataEditorTheme(DataEditorThemeBase): ...
|
|
83
|
+
|
|
80
84
|
class Bounds(TypedDict):
|
|
81
85
|
x: int
|
|
82
86
|
y: int
|
reflex/components/dynamic.py
CHANGED
|
@@ -123,16 +123,18 @@ class Link(RadixThemesComponent, A, MemoizationLeaf, MarkdownComponentMap):
|
|
|
123
123
|
|
|
124
124
|
if "as_child" not in props:
|
|
125
125
|
# Extract props for the ReactRouterLink, the rest go to the Link/A element.
|
|
126
|
-
|
|
126
|
+
react_router_link_props = {}
|
|
127
127
|
for prop in props.copy():
|
|
128
128
|
if prop in _KNOWN_REACT_ROUTER_LINK_PROPS:
|
|
129
|
-
|
|
129
|
+
react_router_link_props[prop] = props.pop(prop)
|
|
130
130
|
|
|
131
|
-
|
|
131
|
+
react_router_link_props["to"] = react_router_link_props.pop(
|
|
132
|
+
"href", href
|
|
133
|
+
)
|
|
132
134
|
|
|
133
135
|
# If user does not use `as_child`, by default we render using react_router_link to avoid page refresh during internal navigation
|
|
134
136
|
return super().create(
|
|
135
|
-
ReactRouterLink.create(*children, **
|
|
137
|
+
ReactRouterLink.create(*children, **react_router_link_props),
|
|
136
138
|
as_child=True,
|
|
137
139
|
**props,
|
|
138
140
|
)
|
|
@@ -3,10 +3,10 @@
|
|
|
3
3
|
# ------------------- DO NOT EDIT ----------------------
|
|
4
4
|
# This file was generated by `reflex/utils/pyi_generator.py`!
|
|
5
5
|
# ------------------------------------------------------
|
|
6
|
+
import dataclasses
|
|
6
7
|
from collections.abc import Mapping, Sequence
|
|
7
8
|
from typing import Any, Literal, overload
|
|
8
9
|
|
|
9
|
-
from reflex.base import Base
|
|
10
10
|
from reflex.components.component import Component, ComponentNamespace
|
|
11
11
|
from reflex.components.core.breakpoints import Breakpoints
|
|
12
12
|
from reflex.components.lucide.icon import Icon
|
|
@@ -32,7 +32,8 @@ toast_ref = Var(
|
|
|
32
32
|
_var_data=VarData(imports={f"$/{Dirs.STATE_PATH}": [ImportVar(tag="refs")]}),
|
|
33
33
|
)
|
|
34
34
|
|
|
35
|
-
|
|
35
|
+
@dataclasses.dataclass
|
|
36
|
+
class ToastAction:
|
|
36
37
|
label: str
|
|
37
38
|
on_click: Any
|
|
38
39
|
|
reflex/constants/__init__.py
CHANGED
|
@@ -16,7 +16,6 @@ from .base import (
|
|
|
16
16
|
Dirs,
|
|
17
17
|
Env,
|
|
18
18
|
LogLevel,
|
|
19
|
-
Next,
|
|
20
19
|
Ping,
|
|
21
20
|
ReactRouter,
|
|
22
21
|
Reflex,
|
|
@@ -101,13 +100,13 @@ __all__ = [
|
|
|
101
100
|
"LogLevel",
|
|
102
101
|
"MemoizationDisposition",
|
|
103
102
|
"MemoizationMode",
|
|
104
|
-
"Next",
|
|
105
103
|
"Node",
|
|
106
104
|
"PackageJson",
|
|
107
105
|
"Page404",
|
|
108
106
|
"PageNames",
|
|
109
107
|
"Ping",
|
|
110
108
|
"PyprojectToml",
|
|
109
|
+
"ReactRouter",
|
|
111
110
|
"Reflex",
|
|
112
111
|
"RequirementsTxt",
|
|
113
112
|
"RouteArgType",
|
reflex/constants/base.py
CHANGED
|
@@ -22,7 +22,7 @@ class Dirs(SimpleNamespace):
|
|
|
22
22
|
"""Various directories/paths used by Reflex."""
|
|
23
23
|
|
|
24
24
|
# The frontend directories in a project.
|
|
25
|
-
# The web folder where the
|
|
25
|
+
# The web folder where the frontend app is compiled to.
|
|
26
26
|
WEB = ".web"
|
|
27
27
|
# The directory where uploaded files are stored.
|
|
28
28
|
UPLOADED_FILES = "uploaded_files"
|
|
@@ -208,19 +208,6 @@ class Javascript(SimpleNamespace):
|
|
|
208
208
|
PACKAGE_LOCK = "package-lock.json"
|
|
209
209
|
|
|
210
210
|
|
|
211
|
-
class Next(Javascript):
|
|
212
|
-
"""Constants related to NextJS."""
|
|
213
|
-
|
|
214
|
-
# The NextJS config file
|
|
215
|
-
CONFIG_FILE = "next.config.js"
|
|
216
|
-
|
|
217
|
-
# The sitemap config file.
|
|
218
|
-
SITEMAP_CONFIG_FILE = "next-sitemap.config.js"
|
|
219
|
-
|
|
220
|
-
# Regex to check for message displayed when frontend comes up
|
|
221
|
-
FRONTEND_LISTENING_REGEX = "Local:[\\s]+(.*)"
|
|
222
|
-
|
|
223
|
-
|
|
224
211
|
class ReactRouter(Javascript):
|
|
225
212
|
"""Constants related to React Router."""
|
|
226
213
|
|
reflex/constants/compiler.py
CHANGED
reflex/constants/installer.py
CHANGED
|
@@ -104,10 +104,9 @@ class PackageJson(SimpleNamespace):
|
|
|
104
104
|
class Commands(SimpleNamespace):
|
|
105
105
|
"""The commands to define in package.json."""
|
|
106
106
|
|
|
107
|
-
DEV = "
|
|
107
|
+
DEV = "react-router dev"
|
|
108
108
|
EXPORT = "react-router build"
|
|
109
|
-
|
|
110
|
-
PROD = "serve --single ./build/client"
|
|
109
|
+
PROD = "serve ./build/client"
|
|
111
110
|
|
|
112
111
|
PATH = "package.json"
|
|
113
112
|
|
reflex/constants/route.py
CHANGED
|
@@ -36,13 +36,25 @@ ROUTER_DATA_INCLUDE = {RouteVar.PATH, RouteVar.ORIGIN, RouteVar.QUERY}
|
|
|
36
36
|
class RouteRegex(SimpleNamespace):
|
|
37
37
|
"""Regex used for extracting route args in route."""
|
|
38
38
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
#
|
|
45
|
-
|
|
39
|
+
_DOT_DOT_DOT = r"\.\.\."
|
|
40
|
+
_OPENING_BRACKET = r"\["
|
|
41
|
+
_CLOSING_BRACKET = r"\]"
|
|
42
|
+
_ARG_NAME = r"[a-zA-Z_]\w*"
|
|
43
|
+
|
|
44
|
+
# match a single arg (i.e. "[slug]"), returns the name of the arg
|
|
45
|
+
ARG = re.compile(rf"{_OPENING_BRACKET}({_ARG_NAME}){_CLOSING_BRACKET}")
|
|
46
|
+
# match a single catch-all arg (i.e. "[...slug]" or "[[...slug]]"), returns the name of the arg
|
|
47
|
+
CATCHALL = re.compile(
|
|
48
|
+
rf"({_OPENING_BRACKET}?{_OPENING_BRACKET}{_DOT_DOT_DOT}[^[{_CLOSING_BRACKET}]*{_CLOSING_BRACKET}?{_CLOSING_BRACKET})"
|
|
49
|
+
)
|
|
50
|
+
# match a single non-optional catch-all arg (i.e. "[...slug]"), returns the name of the arg
|
|
51
|
+
STRICT_CATCHALL = re.compile(
|
|
52
|
+
rf"{_OPENING_BRACKET}{_DOT_DOT_DOT}({_ARG_NAME}){_CLOSING_BRACKET}"
|
|
53
|
+
)
|
|
54
|
+
# match a snigle optional catch-all arg (i.e. "[[...slug]]"), returns the name of the arg
|
|
55
|
+
OPT_CATCHALL = re.compile(
|
|
56
|
+
rf"{_OPENING_BRACKET * 2}{_DOT_DOT_DOT}({_ARG_NAME}){_CLOSING_BRACKET * 2}"
|
|
57
|
+
)
|
|
46
58
|
SINGLE_SEGMENT = "__SINGLE_SEGMENT__"
|
|
47
59
|
DOUBLE_SEGMENT = "__DOUBLE_SEGMENT__"
|
|
48
60
|
SINGLE_CATCHALL_SEGMENT = "__SINGLE_CATCHALL_SEGMENT__"
|
reflex/route.py
CHANGED
|
@@ -17,14 +17,13 @@ def verify_route_validity(route: str) -> None:
|
|
|
17
17
|
ValueError: If the route is invalid.
|
|
18
18
|
"""
|
|
19
19
|
pattern = catchall_in_route(route)
|
|
20
|
-
if pattern
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
f"
|
|
26
|
-
|
|
27
|
-
raise ValueError(msg)
|
|
20
|
+
if pattern:
|
|
21
|
+
if pattern != "[[...splat]]":
|
|
22
|
+
msg = f"Catchall pattern `{pattern}` is not valid. Only `[[...splat]]` is allowed."
|
|
23
|
+
raise ValueError(msg)
|
|
24
|
+
if not route.endswith(pattern):
|
|
25
|
+
msg = f"Catchall pattern `{pattern}` must be at the end of the route."
|
|
26
|
+
raise ValueError(msg)
|
|
28
27
|
|
|
29
28
|
|
|
30
29
|
def get_route_args(route: str) -> dict[str, str]:
|
|
@@ -81,6 +80,14 @@ def get_route_args(route: str) -> dict[str, str]:
|
|
|
81
80
|
def catchall_in_route(route: str) -> str:
|
|
82
81
|
"""Extract the catchall part from a route.
|
|
83
82
|
|
|
83
|
+
Example:
|
|
84
|
+
>>> catchall_in_route("/posts/[...slug]")
|
|
85
|
+
'[...slug]'
|
|
86
|
+
>>> catchall_in_route("/posts/[[...slug]]")
|
|
87
|
+
'[[...slug]]'
|
|
88
|
+
>>> catchall_in_route("/posts/[slug]")
|
|
89
|
+
''
|
|
90
|
+
|
|
84
91
|
Args:
|
|
85
92
|
route: the route from which to extract
|
|
86
93
|
|
|
@@ -91,19 +98,6 @@ def catchall_in_route(route: str) -> str:
|
|
|
91
98
|
return match_.group() if match_ else ""
|
|
92
99
|
|
|
93
100
|
|
|
94
|
-
def catchall_prefix(route: str) -> str:
|
|
95
|
-
"""Extract the prefix part from a route that contains a catchall.
|
|
96
|
-
|
|
97
|
-
Args:
|
|
98
|
-
route: the route from which to extract
|
|
99
|
-
|
|
100
|
-
Returns:
|
|
101
|
-
str: the prefix part of the URI
|
|
102
|
-
"""
|
|
103
|
-
pattern = catchall_in_route(route)
|
|
104
|
-
return route.replace(pattern, "") if pattern else ""
|
|
105
|
-
|
|
106
|
-
|
|
107
101
|
def replace_brackets_with_keywords(input_string: str) -> str:
|
|
108
102
|
"""Replace brackets and everything inside it in a string with a keyword.
|
|
109
103
|
|
reflex/testing.py
CHANGED
|
@@ -241,7 +241,7 @@ class AppHarness:
|
|
|
241
241
|
def _initialize_app(self):
|
|
242
242
|
# disable telemetry reporting for tests
|
|
243
243
|
|
|
244
|
-
os.environ["
|
|
244
|
+
os.environ["REFLEX_TELEMETRY_ENABLED"] = "false"
|
|
245
245
|
CustomComponent.create().get_component.cache_clear()
|
|
246
246
|
self.app_path.mkdir(parents=True, exist_ok=True)
|
|
247
247
|
if self.app_source is not None:
|
reflex/utils/build.py
CHANGED
|
@@ -9,7 +9,6 @@ from pathlib import Path
|
|
|
9
9
|
from rich.progress import MofNCompleteColumn, Progress, TimeElapsedColumn
|
|
10
10
|
|
|
11
11
|
from reflex import constants
|
|
12
|
-
from reflex.config import get_config
|
|
13
12
|
from reflex.utils import console, path_ops, prerequisites, processes
|
|
14
13
|
from reflex.utils.exec import is_in_app_harness
|
|
15
14
|
|
|
@@ -149,24 +148,36 @@ def zip_app(
|
|
|
149
148
|
)
|
|
150
149
|
|
|
151
150
|
|
|
152
|
-
def
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
"""Build the app for deployment.
|
|
151
|
+
def _duplicate_index_html_to_parent_dir(directory: Path):
|
|
152
|
+
"""Duplicate index.html in the child directories to the given directory.
|
|
153
|
+
|
|
154
|
+
This makes accessing /route and /route/ work in production.
|
|
157
155
|
|
|
158
156
|
Args:
|
|
159
|
-
|
|
160
|
-
for_export: Whether the build is for export.
|
|
157
|
+
directory: The directory to duplicate index.html to.
|
|
161
158
|
"""
|
|
159
|
+
for child in directory.iterdir():
|
|
160
|
+
if child.is_dir():
|
|
161
|
+
# If the child directory has an index.html, copy it to the parent directory.
|
|
162
|
+
index_html = child / "index.html"
|
|
163
|
+
if index_html.exists():
|
|
164
|
+
target = directory / (child.name + ".html")
|
|
165
|
+
if not target.exists():
|
|
166
|
+
console.debug(f"Copying {index_html} to {target}")
|
|
167
|
+
path_ops.cp(index_html, target)
|
|
168
|
+
else:
|
|
169
|
+
console.debug(f"Skipping {index_html}, already exists at {target}")
|
|
170
|
+
# Recursively call this function for the child directory.
|
|
171
|
+
_duplicate_index_html_to_parent_dir(child)
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
def build():
|
|
175
|
+
"""Build the app for deployment."""
|
|
162
176
|
wdir = prerequisites.get_web_dir()
|
|
163
177
|
|
|
164
178
|
# Clean the static directory if it exists.
|
|
165
179
|
path_ops.rm(str(wdir / constants.Dirs.BUILD_DIR))
|
|
166
180
|
|
|
167
|
-
# The export command to run.
|
|
168
|
-
command = "export"
|
|
169
|
-
|
|
170
181
|
checkpoints = [
|
|
171
182
|
"building for production",
|
|
172
183
|
"building SSR bundle for production",
|
|
@@ -175,7 +186,11 @@ def build(
|
|
|
175
186
|
|
|
176
187
|
# Start the subprocess with the progress bar.
|
|
177
188
|
process = processes.new_process(
|
|
178
|
-
[
|
|
189
|
+
[
|
|
190
|
+
*prerequisites.get_js_package_executor(raise_on_none=True)[0],
|
|
191
|
+
"run",
|
|
192
|
+
"export",
|
|
193
|
+
],
|
|
179
194
|
cwd=wdir,
|
|
180
195
|
shell=constants.IS_WINDOWS,
|
|
181
196
|
env={
|
|
@@ -184,6 +199,7 @@ def build(
|
|
|
184
199
|
},
|
|
185
200
|
)
|
|
186
201
|
processes.show_progress("Creating Production Build", process, checkpoints)
|
|
202
|
+
_duplicate_index_html_to_parent_dir(wdir / constants.Dirs.STATIC)
|
|
187
203
|
|
|
188
204
|
|
|
189
205
|
def setup_frontend(
|
|
@@ -210,7 +226,7 @@ def setup_frontend_prod(
|
|
|
210
226
|
root: The root path of the project.
|
|
211
227
|
"""
|
|
212
228
|
setup_frontend(root)
|
|
213
|
-
build(
|
|
229
|
+
build()
|
|
214
230
|
|
|
215
231
|
|
|
216
232
|
def _looks_like_venv_dir(dir_to_check: str | Path) -> bool:
|
reflex/utils/export.py
CHANGED
reflex/utils/prerequisites.py
CHANGED
|
@@ -611,19 +611,19 @@ def get_redis_sync() -> RedisSync | None:
|
|
|
611
611
|
|
|
612
612
|
|
|
613
613
|
def parse_redis_url() -> str | None:
|
|
614
|
-
"""Parse the
|
|
614
|
+
"""Parse the REFLEX_REDIS_URL in config if applicable.
|
|
615
615
|
|
|
616
616
|
Returns:
|
|
617
617
|
If url is non-empty, return the URL as it is.
|
|
618
618
|
|
|
619
619
|
Raises:
|
|
620
|
-
ValueError: If the
|
|
620
|
+
ValueError: If the REFLEX_REDIS_URL is not a supported scheme.
|
|
621
621
|
"""
|
|
622
622
|
config = get_config()
|
|
623
623
|
if not config.redis_url:
|
|
624
624
|
return None
|
|
625
625
|
if not config.redis_url.startswith(("redis://", "rediss://", "unix://")):
|
|
626
|
-
msg = "
|
|
626
|
+
msg = "REFLEX_REDIS_URL must start with 'redis://', 'rediss://', or 'unix://'."
|
|
627
627
|
raise ValueError(msg)
|
|
628
628
|
return config.redis_url
|
|
629
629
|
|
|
@@ -1125,19 +1125,19 @@ def update_react_router_config(prerender_routes: bool = False):
|
|
|
1125
1125
|
"""
|
|
1126
1126
|
react_router_config_file_path = get_web_dir() / constants.ReactRouter.CONFIG_FILE
|
|
1127
1127
|
|
|
1128
|
-
|
|
1128
|
+
new_react_router_config = _update_react_router_config(
|
|
1129
1129
|
get_config(), prerender_routes=prerender_routes
|
|
1130
1130
|
)
|
|
1131
1131
|
|
|
1132
1132
|
# Overwriting the config file triggers a full server reload, so make sure
|
|
1133
1133
|
# there is actually a diff.
|
|
1134
|
-
|
|
1134
|
+
old_react_router_config = (
|
|
1135
1135
|
react_router_config_file_path.read_text()
|
|
1136
1136
|
if react_router_config_file_path.exists()
|
|
1137
1137
|
else ""
|
|
1138
1138
|
)
|
|
1139
|
-
if
|
|
1140
|
-
react_router_config_file_path.write_text(
|
|
1139
|
+
if old_react_router_config != new_react_router_config:
|
|
1140
|
+
react_router_config_file_path.write_text(new_react_router_config)
|
|
1141
1141
|
|
|
1142
1142
|
|
|
1143
1143
|
def _update_react_router_config(config: Config, prerender_routes: bool = False):
|
reflex/utils/processes.py
CHANGED
|
@@ -320,7 +320,8 @@ def stream_logs(
|
|
|
320
320
|
|
|
321
321
|
# Windows uvicorn bug
|
|
322
322
|
# https://github.com/reflex-dev/reflex/issues/2335
|
|
323
|
-
|
|
323
|
+
# 130 is the exit code that react router returns when it is interrupted by a signal.
|
|
324
|
+
accepted_return_codes = [0, -2, 15, 130] if constants.IS_WINDOWS else [0, -2, 130]
|
|
324
325
|
if process.returncode not in accepted_return_codes and not suppress_errors:
|
|
325
326
|
console.error(f"{message} failed with exit code {process.returncode}")
|
|
326
327
|
if "".join(logs).count("CERT_HAS_EXPIRED") > 0:
|
|
@@ -2,7 +2,7 @@ reflex/__init__.py,sha256=S_nJPFaTYwyxSzfOpACFxlSe2Vc8rQGr5ZDeyRSDiYQ,10264
|
|
|
2
2
|
reflex/__init__.pyi,sha256=xyNthKRk7NquzHFlg3FgBccSFya-YmmDmlh8SFecTIo,11167
|
|
3
3
|
reflex/__main__.py,sha256=6cVrGEyT3j3tEvlEVUatpaYfbB5EF3UVY-6vc_Z7-hw,108
|
|
4
4
|
reflex/admin.py,sha256=Nbc38y-M8iaRBvh1W6DQu_D3kEhO8JFvxrog4q2cB_E,434
|
|
5
|
-
reflex/app.py,sha256
|
|
5
|
+
reflex/app.py,sha256=_echcweBHf0Ys4V93XdoF5D_6JcnP4Zz2qGQmi-Pkas,75083
|
|
6
6
|
reflex/assets.py,sha256=l5O_mlrTprC0lF7Rc_McOe3a0OtSLnRdNl_PqCpDCBA,3431
|
|
7
7
|
reflex/base.py,sha256=Oh664QL3fZEHErhUasFqP7fE4olYf1y-9Oj6uZI2FCU,1173
|
|
8
8
|
reflex/config.py,sha256=7-OHwPa9UGlz8fxQx6SumT4netp6NgWRHJ3UvUL-opg,16631
|
|
@@ -12,10 +12,10 @@ reflex/model.py,sha256=xED7blemoiKxPFaOkCMrSayjjon7AJp8t5g459p7dGs,17646
|
|
|
12
12
|
reflex/page.py,sha256=Bn8FTlUtjjKwUtpQA5r5eaWE_ZUb8i4XgrQi8FWbzNA,1880
|
|
13
13
|
reflex/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
14
14
|
reflex/reflex.py,sha256=eUP0GevShUc1nodfA5_ewB3hgefWU0_x166HGCY8QTs,21606
|
|
15
|
-
reflex/route.py,sha256=
|
|
15
|
+
reflex/route.py,sha256=7JXP7-dpqdbUS3iSEqQ5UjOHV3pNxD0wKn6BBCRQggQ,4078
|
|
16
16
|
reflex/state.py,sha256=yM9bvTISBXpZqhP7gNcIBjBtAC9LCyyDSco9rlXDaNc,90976
|
|
17
17
|
reflex/style.py,sha256=JxbXXA4MTnXrk0XHEoMBoNC7J-M2oL5Hl3W_QmXvmBg,13222
|
|
18
|
-
reflex/testing.py,sha256=
|
|
18
|
+
reflex/testing.py,sha256=Qx7StvOsFn47ToE8vy97zb4e-kANiTDTjjHEbdhtgyg,38678
|
|
19
19
|
reflex/.templates/apps/blank/assets/favicon.ico,sha256=baxxgDAQ2V4-G5Q4S2yK5uUJTUGkv-AOWBQ0xd6myUo,4286
|
|
20
20
|
reflex/.templates/apps/blank/code/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
21
21
|
reflex/.templates/apps/blank/code/blank.py,sha256=UmGz7aDxGULYINwLgotQoj-9qqpy7EOfAEpLmOT7C_k,917
|
|
@@ -33,11 +33,11 @@ reflex/.templates/jinja/web/pages/component.js.jinja2,sha256=1Pui62uSL7LYA7FXZrh
|
|
|
33
33
|
reflex/.templates/jinja/web/pages/custom_component.js.jinja2,sha256=xUOfUwREPp4h2kozr6mEqSAASnNLzC9b9XHCXVsUQjg,485
|
|
34
34
|
reflex/.templates/jinja/web/pages/index.js.jinja2,sha256=7sXw99TfjlcLYiLKlWvD3k-3IuFzLO4Y63mvSU97uds,360
|
|
35
35
|
reflex/.templates/jinja/web/pages/macros.js.jinja2,sha256=RtMZ6eufmMrHghNDMKpueSAhd-znKjgBbJXAAHFc7vU,901
|
|
36
|
-
reflex/.templates/jinja/web/pages/stateful_component.js.jinja2,sha256=
|
|
36
|
+
reflex/.templates/jinja/web/pages/stateful_component.js.jinja2,sha256=gAipi5MiAVgHntadfThsogunlqpmUwLk5ROLyJJGgUM,387
|
|
37
37
|
reflex/.templates/jinja/web/pages/stateful_components.js.jinja2,sha256=BfHi7ckH9u5xOliKWxjgmnia6AJbNnII97SC-dt_KSU,101
|
|
38
38
|
reflex/.templates/jinja/web/pages/utils.js.jinja2,sha256=12v0-q-o-m0Oxr0H35GTtoJqGRpmbZSrRd5js95F5fI,3156
|
|
39
39
|
reflex/.templates/jinja/web/styles/styles.css.jinja2,sha256=4-CvqGR8-nRzkuCOSp_PdqmhPEmOs_kOhskOlhLMEUg,141
|
|
40
|
-
reflex/.templates/jinja/web/utils/context.js.jinja2,sha256=
|
|
40
|
+
reflex/.templates/jinja/web/utils/context.js.jinja2,sha256=l1k-H4Y0DmOdeMr8xVEwkSzeBpVc1o94cOjJJ3B2WSY,4103
|
|
41
41
|
reflex/.templates/jinja/web/utils/theme.js.jinja2,sha256=OSpBMh0Z9tTeqb10js4ZtnE9s1RV4gJfE8629csST8M,26
|
|
42
42
|
reflex/.templates/web/.gitignore,sha256=3tT0CtVkCL09D_Y3Hd4myUgGcBuESeavCa0WHU5ifJ4,417
|
|
43
43
|
reflex/.templates/web/jsconfig.json,sha256=rhQZZRBYxBWclFYTeU6UakzbGveM4qyRQZUpEAVhyqY,118
|
|
@@ -45,12 +45,12 @@ reflex/.templates/web/postcss.config.js,sha256=6Hf540Ny078yfmJ_-tniZtmgHW6euyEyx
|
|
|
45
45
|
reflex/.templates/web/react-router.config.js,sha256=5K1FBryYdPusn1nE513GwB5_5UdPzoyH8ZMANUbpodQ,84
|
|
46
46
|
reflex/.templates/web/vite.config.js,sha256=rfhF8ttx3q6j6JzEAw_VqwauqvrAP8IMC27FLF47Zm4,755
|
|
47
47
|
reflex/.templates/web/app/entry.client.js,sha256=2Jv-5SQWHhHmA07BP50f1ew1V-LOsX5VoLtSInnFDj8,264
|
|
48
|
-
reflex/.templates/web/app/routes.js,sha256=
|
|
49
|
-
reflex/.templates/web/components/reflex/radix_themes_color_mode_provider.js,sha256=
|
|
48
|
+
reflex/.templates/web/app/routes.js,sha256=GerImlcrkF3qnKxHBS_dgTEHmXOBVtSUHt1BvQWN1KI,315
|
|
49
|
+
reflex/.templates/web/components/reflex/radix_themes_color_mode_provider.js,sha256=dnDHW49imtdalZJQqj7J_u7cj2z8Sve7OlhtOO0FbKE,916
|
|
50
50
|
reflex/.templates/web/components/shiki/code.js,sha256=4Es1pxsr-lX4hTQ5mglrwwC6O_SI-z-O60k03z8VFzQ,1144
|
|
51
51
|
reflex/.templates/web/utils/client_side_routing.js,sha256=zK_Se1BMjrAHvYqcGH1cu3_UfUhXJ5KxeSt8Xgg2-70,1619
|
|
52
|
-
reflex/.templates/web/utils/react-theme.js,sha256=
|
|
53
|
-
reflex/.templates/web/utils/state.js,sha256=
|
|
52
|
+
reflex/.templates/web/utils/react-theme.js,sha256=4CNLOcjLS5tiRp0TIgKK7trf8bSLWtmeDVhFP6BLe80,2349
|
|
53
|
+
reflex/.templates/web/utils/state.js,sha256=Bz_D4G8faACDYY3AFtjyCrr8VniDSpV3dDcXVoIhG3g,34146
|
|
54
54
|
reflex/.templates/web/utils/helpers/dataeditor.js,sha256=pG6MgsHuStDR7-qPipzfiK32j9bKDBa-4hZ0JSUo4JM,1623
|
|
55
55
|
reflex/.templates/web/utils/helpers/debounce.js,sha256=xGhtTRtS_xIcaeqnYVvYJNseLgQVk-DW-eFiHJYO9As,528
|
|
56
56
|
reflex/.templates/web/utils/helpers/paste.js,sha256=ef30HsR83jRzzvZnl8yV79yqFP8TC_u8SlN99cCS_OM,1799
|
|
@@ -61,13 +61,13 @@ reflex/app_mixins/lifespan.py,sha256=9rrdVUY0nHyk3gj31WJm7mw6I7KHBNtvSs9tZdwUm4I
|
|
|
61
61
|
reflex/app_mixins/middleware.py,sha256=BKhe0jUFO1_TylEC48LUZyaeYyPmAYW-NV4H5Rw221k,2848
|
|
62
62
|
reflex/app_mixins/mixin.py,sha256=R1YncalqDrbdPZvpKVbm72ZKmQZxYAWfuFq9JknzTqQ,305
|
|
63
63
|
reflex/compiler/__init__.py,sha256=r8jqmDSFf09iV2lHlNhfc9XrTLjNxfDNwPYlxS4cmHE,27
|
|
64
|
-
reflex/compiler/compiler.py,sha256=
|
|
65
|
-
reflex/compiler/templates.py,sha256=
|
|
66
|
-
reflex/compiler/utils.py,sha256=
|
|
64
|
+
reflex/compiler/compiler.py,sha256=YRVoN2FqHZEZ8B6wOSYrTXjA-7nIjDJEgP3v2FtGIiU,29307
|
|
65
|
+
reflex/compiler/templates.py,sha256=mQifVgvE7cKyzMFL9F5jxdJb9KFxucWJa7nuOp09ZUo,6002
|
|
66
|
+
reflex/compiler/utils.py,sha256=FrO_nnWab847kwvkKSWUA2tXcd766Q9H0ZEALdH7f2E,18239
|
|
67
67
|
reflex/components/__init__.py,sha256=55uockd2mEBsaA-fmDO_R4vJewzGPZUk-6UZFNHBSdc,568
|
|
68
68
|
reflex/components/__init__.pyi,sha256=w3ytnNHEwibvm5Z_7udLu2JdQijWrjU0TVGFkg_jlGs,744
|
|
69
|
-
reflex/components/component.py,sha256=
|
|
70
|
-
reflex/components/dynamic.py,sha256=
|
|
69
|
+
reflex/components/component.py,sha256=yjVYLZ4LGlfj7uV9O3QpM3-f_OKvHK9lHcNOdJI3mpo,97642
|
|
70
|
+
reflex/components/dynamic.py,sha256=AyOjAW5LQZlDShIFJ7d9P2dFTI-1pr1tZR32E2Rhr9s,7422
|
|
71
71
|
reflex/components/field.py,sha256=j5JZFzNlET3GAIW91m1L31RypXylMAxJNm0-CJbtykM,5745
|
|
72
72
|
reflex/components/literals.py,sha256=hogLnwTJxFJODIvqihg-GD9kFZVsEBDoYzaRit56Nuk,501
|
|
73
73
|
reflex/components/props.py,sha256=BH7RiRu_EI2BRkB1PyBVp6tLeFTTV4FzGEdDIXXQ9Bk,14378
|
|
@@ -121,10 +121,10 @@ reflex/components/core/upload.pyi,sha256=znpNNiJdACw825qCiMw_UUNXIIDbBL55wJhHU_8
|
|
|
121
121
|
reflex/components/core/layout/__init__.py,sha256=znldZaj_NGt8qCZDG70GMwjMTskcvCf_2N_EjCAHwdc,30
|
|
122
122
|
reflex/components/datadisplay/__init__.py,sha256=L8pWWKNHWdUD2fbZRoEKjd_8c_hpDdGYO463hwkoIi4,438
|
|
123
123
|
reflex/components/datadisplay/__init__.pyi,sha256=rYMwO_X4NvUex6IL2MMTnhdFRp8Lz5zweMwXaW_l7nc,588
|
|
124
|
-
reflex/components/datadisplay/code.py,sha256=
|
|
125
|
-
reflex/components/datadisplay/code.pyi,sha256=
|
|
124
|
+
reflex/components/datadisplay/code.py,sha256=jmt5pCFnHbbx8JzU5LvevwDL6omlIsdf_AbPsW7s5TI,12418
|
|
125
|
+
reflex/components/datadisplay/code.pyi,sha256=fp-__tDq6lfjDetBsKq5KVZv2SXzFuK8Z3E41_FGwsA,41575
|
|
126
126
|
reflex/components/datadisplay/dataeditor.py,sha256=SxvIDyKl9TILOlx6Zga9jCcu0LBc4E1WhrUFJGO6lKs,13496
|
|
127
|
-
reflex/components/datadisplay/dataeditor.pyi,sha256
|
|
127
|
+
reflex/components/datadisplay/dataeditor.pyi,sha256=-Z1CmQSf7bsuaMC0okNqsALx8bF76UHkxlwMyVZcWSQ,12470
|
|
128
128
|
reflex/components/datadisplay/logo.py,sha256=xvg5TRVRSi2IKn7Kg4oYzWcaFMHfXxUaCp0cQmuKSn0,1993
|
|
129
129
|
reflex/components/datadisplay/shiki_code_block.py,sha256=KmohJnAYo6gPERhBT_6o90bzgi6TLQ-AajRVeEcavbQ,24392
|
|
130
130
|
reflex/components/datadisplay/shiki_code_block.pyi,sha256=iU3sH_KEGBg5R3qwvh0fXG2gP2bw8uX_83--KE2gxQg,57393
|
|
@@ -298,7 +298,7 @@ reflex/components/radix/themes/typography/code.py,sha256=sSshc5GsSOsJPi_SbR7nkAe
|
|
|
298
298
|
reflex/components/radix/themes/typography/code.pyi,sha256=rsDiLZJinQCF1YCGfCVtEASuUluV8kG9WjS2F9QhDW4,11780
|
|
299
299
|
reflex/components/radix/themes/typography/heading.py,sha256=YVoQu9cLx5SJSNkliNp5UyVhrwu7vgpIMj1X43jifd0,1575
|
|
300
300
|
reflex/components/radix/themes/typography/heading.pyi,sha256=EVgYHfpGtlq681UQLpPJyog9PxD62ZMrADhQutxScu0,12598
|
|
301
|
-
reflex/components/radix/themes/typography/link.py,sha256
|
|
301
|
+
reflex/components/radix/themes/typography/link.py,sha256=-wnjg_b2xjGpyfppsqy_53Z_r0Kky2p1gxjDZAmbx84,5013
|
|
302
302
|
reflex/components/radix/themes/typography/link.pyi,sha256=FBiFOj8ivnaBP46ZgAimkl24rgkR6Z-TB3ewZ3_Q7KE,25956
|
|
303
303
|
reflex/components/radix/themes/typography/text.py,sha256=qnpZuqyabh-VuKGBtlOmu3dfZloBXehjCtEk4AmZQLg,2843
|
|
304
304
|
reflex/components/radix/themes/typography/text.pyi,sha256=mqhURMNgLum1rRk9OzGK0v71hfKZ4-tdqE1rMYbZjZw,73469
|
|
@@ -323,22 +323,22 @@ reflex/components/recharts/recharts.py,sha256=jrKDiTpIYVDli2s58xmD-ZvCvQupoRilsm
|
|
|
323
323
|
reflex/components/recharts/recharts.pyi,sha256=2RoCZ3gbIcSXOVflgHcL8slbgZvL4KeICquG4edpd3A,7414
|
|
324
324
|
reflex/components/sonner/__init__.py,sha256=L_mdRIy7-ccRGSz5VK6J8O-c-e-D1p9xWw29_ErrvGg,68
|
|
325
325
|
reflex/components/sonner/toast.py,sha256=3wEwvI_2OyTdDcWJwwpyVeNox902iDQGv6Itgqv1Okw,12392
|
|
326
|
-
reflex/components/sonner/toast.pyi,sha256=
|
|
326
|
+
reflex/components/sonner/toast.pyi,sha256=At5H-1ONwJ76E5R1TeyqM2j4FerXAeJOmM4cYYrCSRM,7835
|
|
327
327
|
reflex/components/tags/__init__.py,sha256=Pc0JU-Tv_W7KCsydXgbKmu7w2VtHNkI6Cx2hTkNhW_Q,152
|
|
328
328
|
reflex/components/tags/cond_tag.py,sha256=YHxqq34PD-1D88YivO7kn7FsbW8SfPS2McNg7j_nncI,588
|
|
329
329
|
reflex/components/tags/iter_tag.py,sha256=R7bOI3Xx3mHcSmr6tz8qUlBoDwXsAh2Q6Esd3nsBros,4410
|
|
330
330
|
reflex/components/tags/match_tag.py,sha256=3lba1H5pCcKkqxEHzM6DZb5s9s0yJLN4Se3vdhzar24,580
|
|
331
331
|
reflex/components/tags/tag.py,sha256=BRPODHi1R5g4VwkYLztIUJBMyDgrGPZRqB-QP_u67jk,3665
|
|
332
332
|
reflex/components/tags/tagless.py,sha256=qO7Gm4V0ITDyymHkyltfz53155ZBt-W_WIPDYy93ca0,587
|
|
333
|
-
reflex/constants/__init__.py,sha256=
|
|
334
|
-
reflex/constants/base.py,sha256=
|
|
333
|
+
reflex/constants/__init__.py,sha256=q2Jf-LBbNcGrOmx5M7QotIAYW_t3m02TsmmdtJ5_IhM,2190
|
|
334
|
+
reflex/constants/base.py,sha256=sFv9DhRZtEM2fix6U8SwTcBn05zl5Z_X8X-bqr3fh2E,9065
|
|
335
335
|
reflex/constants/colors.py,sha256=n-FN7stNrvk5rCN0TAvE28dqwUeQZHue-b5q1CO0EyQ,2048
|
|
336
|
-
reflex/constants/compiler.py,sha256=
|
|
336
|
+
reflex/constants/compiler.py,sha256=JjUL7myEoRi6-VRo5vxiND2WFaDTBbplfy6iLswazqk,5814
|
|
337
337
|
reflex/constants/config.py,sha256=8OIjiBdZZJrRVHsNBheMwopE9AwBFFzau0SXqXKcrPg,1715
|
|
338
338
|
reflex/constants/custom_components.py,sha256=joJt4CEt1yKy7wsBH6vYo7_QRW0O_fWXrrTf0VY2q14,1317
|
|
339
339
|
reflex/constants/event.py,sha256=tgoynWQi2L0_Kqc3XhXo7XXL76A-OKhJGHRrNjm7gFw,2885
|
|
340
|
-
reflex/constants/installer.py,sha256=
|
|
341
|
-
reflex/constants/route.py,sha256=
|
|
340
|
+
reflex/constants/installer.py,sha256=f4JgHgC0BiMEf72kykKjONBo62oURJvzt5hVYsvPw9A,4098
|
|
341
|
+
reflex/constants/route.py,sha256=ZClrIF6Wog7tV3R2gLBrfLyO8Wc_jGZy2b1toy1f1Lk,2619
|
|
342
342
|
reflex/constants/state.py,sha256=uF_7-M9Gid-P3DjAOq4F1ERplyZhiNccowo_jLrdJrg,323
|
|
343
343
|
reflex/constants/utils.py,sha256=e1ChEvbHfmE_V2UJvCSUhD_qTVAIhEGPpRJSqdSd6PA,780
|
|
344
344
|
reflex/custom_components/__init__.py,sha256=R4zsvOi4dfPmHc18KEphohXnQFBPnUCb50cMR5hSLDE,36
|
|
@@ -363,22 +363,22 @@ reflex/plugins/sitemap.py,sha256=dbbqIWaim4zl1LEU6Su-gyxd0BgM3E6S8gCExDfkTRo,615
|
|
|
363
363
|
reflex/plugins/tailwind_v3.py,sha256=CvRWAEmY8zW9MwkfN7ZDf6Ltci4btF7fq7rgDcX2tPE,4860
|
|
364
364
|
reflex/plugins/tailwind_v4.py,sha256=BICNY_xTsEfujRo57aR0yHGELZBaN5SEUIT24SYcf0o,5266
|
|
365
365
|
reflex/utils/__init__.py,sha256=y-AHKiRQAhk2oAkvn7W8cRVTZVK625ff8tTwvZtO7S4,24
|
|
366
|
-
reflex/utils/build.py,sha256=
|
|
366
|
+
reflex/utils/build.py,sha256=lk8hE69onG95dv-LxRhjtEugct1g-KcWPUDorzqeGIE,7964
|
|
367
367
|
reflex/utils/codespaces.py,sha256=kEQ-j-jclTukFpXDlYgNp95kYMGDrQmP3VNEoYGZ1u4,3052
|
|
368
368
|
reflex/utils/compat.py,sha256=aSJH_M6iomgHPQ4onQ153xh1MWqPi3HSYDzE68N6gZM,2635
|
|
369
369
|
reflex/utils/console.py,sha256=OFyXqnyhpAgXCDM7m5lokoUMjvXMohc2ftgrmcf62nc,11500
|
|
370
370
|
reflex/utils/decorator.py,sha256=DVrlVGljV5OchMs-5_y1CbbqnCWlH6lv-dFko8yHxVY,1738
|
|
371
371
|
reflex/utils/exceptions.py,sha256=Wwu7Ji2xgq521bJKtU2NgjwhmFfnG8erirEVN2h8S-g,8884
|
|
372
372
|
reflex/utils/exec.py,sha256=q4mk1QezowCQzd07TCH_UNg1hl_upP6W3qhhAA66_HM,20848
|
|
373
|
-
reflex/utils/export.py,sha256=
|
|
373
|
+
reflex/utils/export.py,sha256=Z2AHuhkxGQzOi9I90BejQ4qEcD0URr2i-ZU5qTJt7eQ,2562
|
|
374
374
|
reflex/utils/format.py,sha256=TGPrbqByYMkUjXgFatk_UvMy4tMP8ByzVYvOB7Z6-Xo,21302
|
|
375
375
|
reflex/utils/imports.py,sha256=tcLE4hLdNolFMe1EyDOOyYIc6FSjjtwx7-n18Pcg6pE,3867
|
|
376
376
|
reflex/utils/lazy_loader.py,sha256=UREKeql_aSusSFMn6qldyol4n8qD3Sm9Wg7LLICjJgQ,4136
|
|
377
377
|
reflex/utils/misc.py,sha256=VquggT3rJB5afQtW3oLekLaF7emM96BL6LVJ6sNr-Ek,1504
|
|
378
378
|
reflex/utils/net.py,sha256=HEHA8L5g7L9s0fFG4dTiZzB9PFO_0WRrlbMgpZr_GAQ,4093
|
|
379
379
|
reflex/utils/path_ops.py,sha256=_RS17IQDNr5vcoLLGZx2-z1E5WP-JgDHvaRAOgqrZiU,8154
|
|
380
|
-
reflex/utils/prerequisites.py,sha256=
|
|
381
|
-
reflex/utils/processes.py,sha256=
|
|
380
|
+
reflex/utils/prerequisites.py,sha256=JuQg_8d5CqLG8uUsilK_yg100ZyCRFGEWMnmlPekFv0,66179
|
|
381
|
+
reflex/utils/processes.py,sha256=yc64mWPcOYdUWMGHClGpvW1sDkNCOEitztsEOUk1Cp8,16671
|
|
382
382
|
reflex/utils/pyi_generator.py,sha256=gqwMZNs6SNPooA-4p1E7QFGEjaGDuvYuErrs4Sb2oXA,46296
|
|
383
383
|
reflex/utils/redir.py,sha256=3JG0cRdfIZnFIBHHN32ynD5cfbUZa7gLRxzrxRGGl5I,1751
|
|
384
384
|
reflex/utils/registry.py,sha256=DEF7csYQ5VnrZhy6ULVfMlceh7XVH0pks96lIyyThuc,1882
|
|
@@ -394,8 +394,8 @@ reflex/vars/number.py,sha256=tO7pnvFaBsedq1HWT4skytnSqHWMluGEhUbjAUMx8XQ,28190
|
|
|
394
394
|
reflex/vars/object.py,sha256=BDmeiwG8v97s_BnR1Egq3NxOKVjv9TfnREB3cz0zZtk,17322
|
|
395
395
|
reflex/vars/sequence.py,sha256=1kBrqihspyjyQ1XDqFPC8OpVGtZs_EVkOdIKBro5ilA,55249
|
|
396
396
|
scripts/hatch_build.py,sha256=-4pxcLSFmirmujGpQX9UUxjhIC03tQ_fIQwVbHu9kc0,1861
|
|
397
|
-
reflex-0.8.
|
|
398
|
-
reflex-0.8.
|
|
399
|
-
reflex-0.8.
|
|
400
|
-
reflex-0.8.
|
|
401
|
-
reflex-0.8.
|
|
397
|
+
reflex-0.8.0a2.dist-info/METADATA,sha256=FpZZUmZMmqtA836969_GROu1CweV7js-7MVlmnEge8I,12344
|
|
398
|
+
reflex-0.8.0a2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
399
|
+
reflex-0.8.0a2.dist-info/entry_points.txt,sha256=Rxt4dXc7MLBNt5CSHTehVPuSe9Xqow4HLX55nD9tQQ0,45
|
|
400
|
+
reflex-0.8.0a2.dist-info/licenses/LICENSE,sha256=dw3zLrp9f5ObD7kqS32vWfhcImfO52PMmRqvtxq_YEE,11358
|
|
401
|
+
reflex-0.8.0a2.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|