schultek / jaspr

Modern web framework for building websites in Dart. Supports SPAs and SSR.
https://jasprpad.schultek.de
MIT License
1k stars 59 forks source link

fix: Raw HTML with no input string causes error #187

Closed walsha2 closed 4 months ago

walsha2 commented 4 months ago

Description

yield text(
  "",
  rawHtml: true,
);

Will result in

errors.dart:297 Uncaught Error: Bad state: No elements
    at Object.throw_ [as throw] (errors.dart:297:3)
    at get [dartx.first] (html_dart2js.dart:23664:5)
    at dom_render_object.DomRenderObject.new.updateText (dom_render_object.dart:153:24)
    at framework.TextElement.new.updateRenderObject (dom_component.dart:191:5)
    at [_firstBuild] (render_object.dart:35:7)
    at framework.TextElement.new.mount (dom_component.dart:165:5)
    at framework.StatefulElement.new.inflateComponent (framework.dart:448:13)
    at framework.StatefulElement.new.updateChild (framework.dart:314:18)
    at framework.StatefulElement.new.updateChildren (multi_child_element.dart:197:32)
    at framework.StatefulElement.new.performRebuild (multi_child_element.dart:69:17)
    at framework.StatefulElement.new.performRebuild (stateful_component.dart:680:11)
    at framework.BuildOwner.new.performRebuildOn (build_owner.dart:85:12)
    at framework.StatefulElement.new.rebuild (framework.dart:793:5)
    at [_firstBuild] (multi_child_element.dart:37:5)
    at [_firstBuild] (stateful_component.dart:645:11)
    at framework.StatefulElement.new.mount (multi_child_element.dart:31:5)
    at framework.StatelessElement.new.inflateComponent (framework.dart:448:13)
    at framework.StatelessElement.new.updateChild (framework.dart:314:18)
    at framework.StatelessElement.new.updateChildren (multi_child_element.dart:197:32)
    at framework.StatelessElement.new.performRebuild (multi_child_element.dart:69:17)
    at framework.BuildOwner.new.performRebuildOn (build_owner.dart:85:12)
    at framework.StatelessElement.new.rebuild (framework.dart:793:5)
    at [_firstBuild] (multi_child_element.dart:37:5)
    at [_firstBuild] (stateless_component.dart:148:11)
    at framework.StatelessElement.new.mount (multi_child_element.dart:31:5)
    at framework.InheritedElement.new.inflateComponent (framework.dart:448:13)
    at framework.InheritedElement.new.updateChild (framework.dart:314:18)
    at framework.InheritedElement.new.performRebuild (single_child_element.dart:61:14)
    at framework.BuildOwner.new.performRebuildOn (build_owner.dart:85:12)
    at framework.InheritedElement.new.rebuild (framework.dart:793:5)
    at [_firstBuild] (single_child_element.dart:31:5)
    at framework.InheritedElement.new.mount (single_child_element.dart:25:5)
    at framework.StatelessElement.new.inflateComponent (framework.dart:448:13)
    at framework.StatelessElement.new.updateChild (framework.dart:314:18)
    at framework.StatelessElement.new.updateChildren (multi_child_element.dart:197:32)
    at framework.StatelessElement.new.performRebuild (multi_child_element.dart:69:17)
    at framework.BuildOwner.new.performRebuildOn (build_owner.dart:85:12)
    at framework.StatelessElement.new.rebuild (framework.dart:793:5)
    at [_firstBuild] (multi_child_element.dart:37:5)
    at [_firstBuild] (stateless_component.dart:148:11)
    at framework.StatelessElement.new.mount (multi_child_element.dart:31:5)
    at framework.InheritedElement.new.inflateComponent (framework.dart:448:13)
    at framework.InheritedElement.new.updateChild (framework.dart:314:18)
    at framework.InheritedElement.new.performRebuild (single_child_element.dart:61:14)
    at framework.BuildOwner.new.performRebuildOn (build_owner.dart:85:12)
    at framework.InheritedElement.new.rebuild (framework.dart:793:5)
    at [_firstBuild] (single_child_element.dart:31:5)
    at framework.InheritedElement.new.mount (single_child_element.dart:25:5)
    at framework.StatefulElement.new.inflateComponent (framework.dart:448:13)
    at framework.StatefulElement.new.updateChild (framework.dart:314:18)
    at framework.StatefulElement.new.updateChildren (multi_child_element.dart:197:32)
    at framework.StatefulElement.new.performRebuild (multi_child_element.dart:69:17)
    at framework.StatefulElement.new.performRebuild (stateful_component.dart:680:11)
    at framework.BuildOwner.new.performRebuildOn (build_owner.dart:85:12)
    at framework.StatefulElement.new.rebuild (framework.dart:793:5)
    at [_firstBuild] (multi_child_element.dart:37:5)
    at [_firstBuild] (stateful_component.dart:645:11)
    at framework.StatefulElement.new.mount (multi_child_element.dart:31:5)
    at framework.DomElement.new.inflateComponent (framework.dart:448:13)
    at framework.DomElement.new.updateChild (framework.dart:314:18)
    at framework.DomElement.new.updateChildren (multi_child_element.dart:197:32)
    at framework.DomElement.new.performRebuild (multi_child_element.dart:69:17)
    at framework.BuildOwner.new.performRebuildOn (build_owner.dart:85:12)
    at framework.DomElement.new.rebuild (framework.dart:793:5)
    at framework.DomElement.new.update (dom_component.dart:76:5)
    at framework.InheritedElement.new.updateChild (framework.dart:305:14)
    at framework.InheritedElement.new.performRebuild (single_child_element.dart:61:14)
    at framework.BuildOwner.new.performRebuildOn (build_owner.dart:85:12)
    at framework.InheritedElement.new.rebuild (framework.dart:793:5)
    at framework.InheritedElement.new.update (inherited_component.dart:168:5)
    at framework.StatefulElement.new.updateChild (framework.dart:305:14)
    at framework.StatefulElement.new.updateChildren (multi_child_element.dart:143:32)
    at framework.StatefulElement.new.performRebuild (multi_child_element.dart:69:17)
    at framework.StatefulElement.new.performRebuild (stateful_component.dart:680:11)
    at framework.BuildOwner.new.performRebuildOn (build_owner.dart:85:12)
    at framework.StatefulElement.new.rebuild (framework.dart:793:5)
    at framework.BuildOwner.new.performBuild (build_owner.dart:146:18)
    at [_handleFrame] (scheduler.dart:19:5)
    at scheduler.dart:14:25
    at browser_binding.dart:81:7

Reproduce

Run a basic SSR app with the snippet above.

[✓] Current Project
  • Dependencies on core packages:
    • jaspr: ^0.10.0
    • jaspr_builder: ^0.10.0 (dev)
    • jaspr_web_compilers: ^4.0.9 (dev)
    • jaspr_riverpod: ^0.3.9
    • jaspr_router: ^0.3.1
  • Uses server-side rendering: true
  • Uses experimental compilers: true
  • Uses flutter embedding: false

Feedback

@schultek maybe this gets resolved in #184? If you have not tested this yet, take a look at this edge case.

Could be as simply as "if string is empty, ignore component" added to new raw() builder.

schultek commented 4 months ago

Yes this is already covered by the mr.