Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
72 commits
Select commit Hold shift + click to select a range
15f363b
Add compiler plugin hooks and move compilation pipeline out of App
FarhanAliRaza Apr 3, 2026
b425f01
Fix memo component ordering and Var-backed page title handling
FarhanAliRaza Apr 3, 2026
2ab0557
Fix app wrap component collection for stateful components
FarhanAliRaza Apr 3, 2026
baee2bd
Merge remote-tracking branch 'upstream/main' into compiler-hooks
FarhanAliRaza Apr 3, 2026
18319ea
pyi hashes
FarhanAliRaza Apr 3, 2026
db4059c
pyi hashes
FarhanAliRaza Apr 3, 2026
94f0d5f
added comparison benchmark
FarhanAliRaza Apr 3, 2026
e64a091
Replace global StatefulComponent cache with compile-scoped cache
FarhanAliRaza Apr 3, 2026
1948394
fixed benchmarks and cache render and deduplicate functions
FarhanAliRaza Apr 4, 2026
4b04b09
fixed benchmarks and cache render and deduplicate functionsand merge
FarhanAliRaza Apr 4, 2026
1cf4962
fix import
FarhanAliRaza Apr 4, 2026
ddaf242
fix broken _get_vars cache and add imports/hooks caches
FarhanAliRaza Apr 5, 2026
41204c1
Simplify compiler hooks: merge tree walkers and remove optimization f…
FarhanAliRaza Apr 6, 2026
733f4e5
Fix stateful component imports not included in all_imports
FarhanAliRaza Apr 6, 2026
292d095
Remove CompilerPlugin and PageDefinition protocols, use concrete types
FarhanAliRaza Apr 6, 2026
a0255f9
pyi hashes
FarhanAliRaza Apr 6, 2026
4eaa2da
removed orphaned code used by legacy compiler
FarhanAliRaza Apr 6, 2026
92c30de
Merge remote-tracking branch 'upstream/main' into compiler-hooks
FarhanAliRaza Apr 7, 2026
d7f43b8
fixed borken merge
FarhanAliRaza Apr 7, 2026
c50b245
fix reflex dep as git url exclusion for reflex-web CI
masenf Apr 7, 2026
0f91a26
reflex web fix
FarhanAliRaza Apr 7, 2026
9f226a4
Merge branch 'compiler-hooks' of https://github.com/FarhanAliRaza/ref…
FarhanAliRaza Apr 7, 2026
d391cd0
integration-tests.yml: do not reinstall reflex from git
masenf Apr 7, 2026
ee4dcb4
Replace StatefulComponent with MemoizeStatefulPlugin compiler plugin
FarhanAliRaza Apr 7, 2026
50e8877
Add _validate_component_children bypass for experimental memo wrappers
FarhanAliRaza Apr 7, 2026
5f09c98
fix test
FarhanAliRaza Apr 8, 2026
d87e637
Merge branch 'main' into compiler-hooks
FarhanAliRaza Apr 8, 2026
3dc14f1
fixed buffer upload
FarhanAliRaza Apr 8, 2026
af85fa2
fixed buffer upload by shortcircuiting
FarhanAliRaza Apr 8, 2026
620c84d
Skip buffered upload handler when probe chunk detects client disconnect
FarhanAliRaza Apr 8, 2026
f1e7b67
Merge branch 'main' into compiler-hooks
FarhanAliRaza Apr 8, 2026
e7dfb81
pyi hashes
FarhanAliRaza Apr 8, 2026
2e47971
fix: collect imports from component-valued props
FarhanAliRaza Apr 13, 2026
3530727
Merge remote-tracking branch 'upstream/main' into compiler-hooks
FarhanAliRaza Apr 13, 2026
731b3e3
feat: add on_disconnect callback to DisconnectAwareStreamingResponse
FarhanAliRaza Apr 14, 2026
6b76d16
fix: replace asyncio.wait with anyio task group in ASGI 2.4 disconnec…
FarhanAliRaza Apr 14, 2026
d012632
fix: simplify DisconnectAwareStreamingResponse ASGI 2.4 path
FarhanAliRaza Apr 14, 2026
99aad2c
pyi hashes
FarhanAliRaza Apr 14, 2026
2b32ba2
feat: decouple Radix Themes into an opt-in compiler plugin
FarhanAliRaza Apr 16, 2026
c7117d6
Merge remote-tracking branch 'upstream/main' into compiler-hooks
FarhanAliRaza Apr 16, 2026
482208c
removed the final library reset to fix the hydration error
FarhanAliRaza Apr 16, 2026
553b761
Merge branch 'main' into compiler-hooks
masenf Apr 21, 2026
de521cc
memoize: generated components contain hook calls (#4)
masenf Apr 22, 2026
ec21152
removed unused kwargs del
FarhanAliRaza Apr 22, 2026
43b9ccb
fix: clone components on write during compile to avoid cross-page mut…
FarhanAliRaza Apr 23, 2026
47c2bed
Merge remote-tracking branch 'upstream/main' into compiler-hooks
FarhanAliRaza Apr 23, 2026
45ad77b
fix: per memo file and treeshaking
FarhanAliRaza Apr 23, 2026
6eac92c
revert unrelated change
FarhanAliRaza Apr 23, 2026
707c215
Preserve nested memo imports while keeping passthrough memo bodies ro…
FarhanAliRaza Apr 23, 2026
9d626bc
Rebuild passthrough auto-memo definitions per compile
FarhanAliRaza Apr 23, 2026
63b3a40
feat: add PRE/NORMAL/POST ordering for compiler component hooks
FarhanAliRaza Apr 23, 2026
8aa1275
Fix auto-memo snapshot handling for structural forms
FarhanAliRaza Apr 24, 2026
f95a642
Separately memoize Cond and Match children (#11)
masenf Apr 28, 2026
47a4b88
perf: extend memo imports in place instead of remerging per memo
FarhanAliRaza Apr 28, 2026
7adeee9
Merge branch 'main' into compiler-hooks
FarhanAliRaza Apr 28, 2026
536a06c
pyi hash
FarhanAliRaza Apr 28, 2026
c576860
perf: fold _deterministic_hash into a single incremental hasher
FarhanAliRaza Apr 28, 2026
09d274a
Use SNAPSHOT strategy for Cond as well
masenf Apr 28, 2026
07cadf3
Make Cond and Match use PASSTHROUGH style memo strategy
masenf Apr 29, 2026
129b186
Ensure global client_state setters have proper VarData
masenf Apr 29, 2026
b75858a
Merge remote-tracking branch 'upstream/main' into compiler-hooks
masenf Apr 29, 2026
55c3a10
Fix windows path issue in unit test
masenf Apr 29, 2026
b9970d3
Handle auto-memoized form children
masenf Apr 29, 2026
b867952
Memoize snapshot boundaries when subtree carries reactive data
FarhanAliRaza Apr 29, 2026
18b4cf4
Address CR feedback
masenf Apr 29, 2026
ac84ceb
Merge remote-tracking branch 'upstream/main' into compiler-hooks
masenf Apr 29, 2026
c287af1
lifespan: ignore uninitialized state_manager during lifespan cleanup
masenf Apr 29, 2026
3f08dd7
Do not auto-memoize components with imports-only VarData
masenf Apr 30, 2026
b73b8b4
fix: render dynamic components as React elements via createElement
FarhanAliRaza Apr 30, 2026
4d74b68
Revert state.js dynamic component createElement wrap and integration …
FarhanAliRaza Apr 30, 2026
9a744f2
Restore evalReactComponent createElement wrap and integration test
FarhanAliRaza Apr 30, 2026
67a450d
Move `createElement` to dynamic component hook code
masenf Apr 30, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
111 changes: 97 additions & 14 deletions packages/reflex-base/src/reflex_base/compiler/templates.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@

if TYPE_CHECKING:
from reflex.compiler.utils import _ImportDict
from reflex_base.components.component import Component, StatefulComponent
from reflex_base.components.component import Component


def _sort_hooks(
Expand Down Expand Up @@ -348,7 +348,12 @@ def context_template(
export const initialState = {"{}" if not initial_state else json_dumps(initial_state)}

export const defaultColorMode = {default_color_mode}
export const ColorModeContext = createContext(null);
export const ColorModeContext = createContext({{
colorMode: defaultColorMode,
resolvedColorMode: defaultColorMode === "dark" ? "dark" : "light",
toggleColorMode: () => {{}},
setColorMode: () => {{}},
}});
export const UploadFilesContext = createContext(null);
export const DispatchContext = createContext(null);
export const StateContexts = {{{state_contexts_str}}};
Expand Down Expand Up @@ -417,7 +422,7 @@ def context_template(
}}"""


def component_template(component: Component | StatefulComponent):
def component_template(component: Component):
"""Template to render a component tag.

Args:
Expand Down Expand Up @@ -618,40 +623,41 @@ def vite_config_template(
}}));"""


def stateful_component_template(
tag_name: str, memo_trigger_hooks: list[str], component: Component, export: bool
):
"""Template for stateful component.
def dynamic_component_template(
tag_name: str, component: Component, export: bool
) -> str:
"""Template for a dynamic SSR component function declaration.

Args:
tag_name: The tag name for the component.
memo_trigger_hooks: The memo trigger hooks for the component.
component: The component to render.
export: Whether to export the component.

Returns:
Rendered stateful component code as string.
Rendered dynamic component code as string.
"""
all_hooks = component._get_all_hooks()
return f"""
{"export " if export else ""}function {tag_name} () {{
{_render_hooks(all_hooks, memo_trigger_hooks)}
{_render_hooks(all_hooks)}
return (
{_RenderUtils.render(component.render())}
)
}}
"""


def stateful_components_template(imports: list[_ImportDict], memoized_code: str) -> str:
"""Template for stateful components.
def dynamic_components_module_template(
imports: list[_ImportDict], memoized_code: str
) -> str:
"""Template for a dynamic-SSR components module.

Args:
imports: List of import statements.
memoized_code: Memoized code for stateful components.
memoized_code: Code for the module body.

Returns:
Rendered stateful components code as string.
Rendered module code as string.
"""
imports_str = "\n".join([_RenderUtils.get_import(imp) for imp in imports])
return f"{imports_str}\n{memoized_code}"
Expand Down Expand Up @@ -709,6 +715,83 @@ def memo_components_template(
{components_code}"""


def memo_single_component_template(
imports: list[_ImportDict],
component: dict[str, Any],
dynamic_imports: Iterable[str],
custom_codes: Iterable[str],
) -> str:
"""Template for a single memoized component in its own module.

Args:
imports: List of import statements for this memo only.
component: The single component definition to render.
dynamic_imports: Dynamic import statements scoped to this memo.
custom_codes: Custom code snippets scoped to this memo.

Returns:
The rendered standalone memo module code.
"""
imports_str = "\n".join([_RenderUtils.get_import(imp) for imp in imports])
dynamic_imports_str = "\n".join(dynamic_imports)
custom_code_str = "\n".join(custom_codes)

component_code = f"""
export const {component["name"]} = memo(({component["signature"]}) => {{
{_render_hooks(component.get("hooks", {}))}
return(
{_RenderUtils.render(component["render"])}
)
}});
"""

return f"""
{imports_str}

{dynamic_imports_str}

{custom_code_str}

{component_code}"""


def memo_single_function_template(
imports: list[_ImportDict],
function: dict[str, Any],
) -> str:
"""Template for a single function memo in its own module.

Args:
imports: List of import statements for this memo only.
function: The single function memo definition.

Returns:
The rendered standalone function memo module code.
"""
imports_str = "\n".join([_RenderUtils.get_import(imp) for imp in imports])
return f"""
{imports_str}

export const {function["name"]} = {function["function"]};
"""


def memo_index_template(reexports: Iterable[tuple[str, str]]) -> str:
"""Template for the memo index module that re-exports every memo file.

Args:
reexports: Iterable of ``(export_name, relative_module_specifier)``.

Returns:
The rendered index module code.
"""
lines = [
f'export {{ {export_name} }} from "{specifier}";'
for export_name, specifier in reexports
]
return "\n".join(lines) + "\n"


def styles_template(stylesheets: list[str]) -> str:
"""Template for styles.css.

Expand Down
Loading
Loading