From 6a0f99c2373e19a5136e64241c6f766ad65c36e4 Mon Sep 17 00:00:00 2001 From: lawrence3699 Date: Fri, 10 Apr 2026 11:27:08 +1000 Subject: [PATCH] fix: collect imports from components in props in _get_all_imports() Fixes #6312 _get_all_imports() only walked self.children to collect transitive imports. Components embedded in props (e.g. a fallback: Component prop) were skipped, causing missing JS imports and ReferenceError at runtime. The sibling methods _get_all_custom_code() and _get_all_dynamic_imports() already call self._get_components_in_props() for this case. This brings _get_all_imports() in line with them. --- .../src/reflex_base/components/component.py | 7 ++++- tests/units/components/test_component.py | 26 +++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/packages/reflex-base/src/reflex_base/components/component.py b/packages/reflex-base/src/reflex_base/components/component.py index a1d6c8c8956..8f47f447c7d 100644 --- a/packages/reflex-base/src/reflex_base/components/component.py +++ b/packages/reflex-base/src/reflex_base/components/component.py @@ -1750,7 +1750,12 @@ def _get_all_imports(self, collapse: bool = False) -> ParsedImportDict: The import dict with the required imports. """ imports_ = imports.merge_parsed_imports( - self._get_imports(), *[child._get_all_imports() for child in self.children] + self._get_imports(), + *[child._get_all_imports() for child in self.children], + *[ + component._get_all_imports() + for component in self._get_components_in_props() + ], ) return imports.collapse_imports(imports_) if collapse else imports_ diff --git a/tests/units/components/test_component.py b/tests/units/components/test_component.py index 5b3e601f176..de397442311 100644 --- a/tests/units/components/test_component.py +++ b/tests/units/components/test_component.py @@ -522,6 +522,32 @@ def test_get_imports(component1, component2): } +def test_get_all_imports_includes_components_in_props(): + """Test that _get_all_imports collects imports from components in props.""" + + class InnerComponent(Component): + """A component that requires a specific import.""" + + def _get_imports(self) -> ParsedImportDict: + return {"some-library": [ImportVar(tag="SomeTag")]} + + class OuterComponent(Component): + """A component with a component-typed prop.""" + + fallback: Component | None = None + + def _get_imports(self) -> ParsedImportDict: + return {"outer-library": [ImportVar(tag="OuterTag")]} + + inner = InnerComponent.create() + outer = OuterComponent.create(fallback=inner) + all_imports = outer._get_all_imports() + assert "some-library" in all_imports, ( + "_get_all_imports() should collect imports from components in props" + ) + assert "outer-library" in all_imports + + def test_get_custom_code(component1: Component, component2: Component): """Test getting the custom code of a component.