From b9a88a903142b4425f4f92ecab4b9122267e9bba Mon Sep 17 00:00:00 2001 From: Iisakki Rotko Date: Thu, 9 Jan 2025 09:34:35 +0100 Subject: [PATCH] fix: throw when creating components Previously we rendered a div with the error inside. However, this causes issues in contexts where a div can't be rendered, for example if we're inside a three.js `Canvas`. --- src/widget.tsx | 18 +++++------------- tests/ui/basics_test.py | 31 +++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 13 deletions(-) diff --git a/src/widget.tsx b/src/widget.tsx index 2a74735..5407212 100644 --- a/src/widget.tsx +++ b/src/widget.tsx @@ -593,29 +593,21 @@ export class ReactModel extends DOMWidgetModel { ); module = await importShim(this.codeUrl); if (!module) { - return () =>
error loading module
; + throw new Error(`Error loading module`); } } else { module = await importShim(moduleName); if (!module) { - return () =>
no module found with name {moduleName}
; + throw new Error(`no module found with name ${moduleName}`); } } let component = module[type || "default"]; if (!component) { if (type) { - return () => ( -
- no component found in module {moduleName} (with name {type}) -
- ); + throw new Error(`no component ${type} found in module ${moduleName}`); } else { - return () => ( -
- no component found in module {moduleName} (it should be exported - as default) -
- ); + throw new Error(` + no component found in module ${moduleName} (it should be exported as default)`); } } else { if (this.compiledCode) { diff --git a/tests/ui/basics_test.py b/tests/ui/basics_test.py index 8054a08..657cf2e 100644 --- a/tests/ui/basics_test.py +++ b/tests/ui/basics_test.py @@ -82,3 +82,34 @@ def test_update_props_after_create(solara_test, page_session: playwright.sync_ap display(b) page_session.locator(".test-button-updated >> text=Button").wait_for() + + +def test_error_module(solara_test, page_session: playwright.sync_api.Page): + b = ipyreact.Widget( + _type="Foo", + _module="bar", + children=["should not be shown"], + ) + display(b) + page_session.locator("text=Unable to resolve specifier").wait_for() + + +def test_error_type(solara_test, page_session: playwright.sync_api.Page): + ipyreact.define_module( + "my-module", + """ + import * as React from "react"; + + export function ClickButton({value, setValue}) { + return React.createElement("button", { + className: "counter-widget", + onClick: () => setValue(value + 1), + children: [`${value|| 0} clicks`], + }) + }; + """, + ) + + b = ipyreact.ValueWidget(_module="my-module", _type="ClickButtonMistyped") + display(b) + page_session.locator("text=no component ClickButtonMistyped found in module my-module").wait_for()