Laminar v0.7.1 Release Notes

Release Date: 2019-08-01 // 3 months ago
    • 🏗 Fix: Due to a bug in Scala DOM Builder, it would make mistakes tracking ReactiveElements' children when Laminar was reordering them e.g. using children <-- X. This would then result in "cannot read nextSibling of null" errors and potentially other inconsistencies.
      • I fixed the issue in Scala DOM Builder v0.9.2, and added another reordering test for this particular scenario in Laminar
      • Thanks to @gabrielgiussi for reporting, and nailing the test case!
    • 🆕 New: Use DOM Props to set Reflected Attributes.
      • Better performance than setting HTML attributes
      • I do not expect a change in behaviour due to the largely symmetrical nature of reflected attributes. At least not when using reflected attributes for writing values. Reading might yield subtle differences as mentioned in the link above.
      • This change is also potentially breaking because the types of identifiers like href changed from ReactiveHtmlAttr to ReactiveProp. Unless you reference those types or their non-common ancestors in your code you should be fine.
    • API: Return EventStream type for documentEvents and windowEvents props, not the unnecessarily specific DomEventStream.
      • Note: small chance of breakage if you rely on DomEventStream type in your code
    • 🆕 New: maybe method for keys. You can now do attr.maybe(optionOfValue) instead of optionOfValue.map(attr := _)
    • 🆕 New: emptyNode to make an empty Node (implemented as a comment node)
    • 🆕 New: WriteBus.contracomposeWriter and other improvements from Airstream v0.7.1
    • API: Use Child / Children / ChildrenCommand types more consistently internally; expose aliases in Laminar.scala
    • 🚚 Misc: Move code examples from main into test fixtures to remove them from the JS bundle
    • Misc: Bump Scala DOM Types to v0.9.4

Previous changes from v0.7

    • 🆕 New: Airstream v0.5.1 -> v0.7 – split, composeChanges, flatMap, etc.
      • See Laminar docs for using split to efficiently render dynamic lists of children
    • API: Hide ancestorMountEvents and thisNodeMountEvents (#42)
      • Migration: use mountEvents, maybeParentSignal or parentChangeEvents instead