Skip to content

MESH v0.13.0

Choose a tag to compare

@github-actions github-actions released this 17 Oct 04:22
· 61 commits to main since this release
a9f6200

MESH v0.13.0 release notes

Prepared 2026-10-17 (not yet released: v0.12.0 is the latest release).

v0.13 fixes how MPRX reads a space between two interpolations. <text>{first} {last}</text> rendered AdaLovelace: the space is a whitespace-only text child, and whitespace-only text is formatting (spec §3) and is dropped. A Valance application found it writing #{r.id} {r.customer} and worked around it with a separator character. A change in rendered text, so a minor version; nothing else changes.

Highlights

  • A space on the line is content. A whitespace-only text child that has no line break and an interpolation immediately before and after it is kept verbatim, as part of the text run. {first} {last} reads "Ada Lovelace"; {a} {b} (two spaces) keeps both; #{id} {name} ! is one run.
  • Layout is still layout. A line break is formatting wherever it is: {a} and {b} on separate lines read ab, as before, so a person or a formatter that re-wraps a template between two interpolations changes nothing it renders. Whitespace next to an element, a block, a slot or the start or end of the content is dropped as before (<b>x</b> <i>y</i> still has no space between the two elements; nothing asks for that yet, and a stray text child is not harmless on every target).
  • {" "} still works where a space must sit at a line break or beside an element.

The rule is the one JSX and Vue (condensed) use: whitespace with a line break is layout, whitespace without one is content, narrowed here to the case the spec's own model of a text run already implied (§9.7: a run is literal text and interpolations concatenated).

Upgrading

Move @valancex/mesh-runtime, @valancex/mesh-compiler and @valancex/mesh-lsp to ^0.13.0 together (before 1.0 a minor is a new range). Search your templates for a space between two interpolations: {a} {b} on one line now renders its space. A template with none renders exactly what it did, with the same keys and handler identifiers; templates, manifests and programs compiled with 0.12 mean the same under 0.13 apart from this.

Compatibility

  • Rendered text. The one change, above. The semantic model keeps a whitespace-only text child it used to drop (spec §3), so a template compiled with 0.13 has a text child in that place and one compiled with 0.12 has none; both are valid mesh-template documents and run on either runtime.
  • Rust and npm. No API changes. All packages move to 0.13.0 together.
  • Tooling. mesh-format and the language server leave the space alone (it is content); the grammar does not change.
  • No diagnostics change.

Stability

The rule (a space with no line break between two interpolations is content; a line break is formatting; neighbours other than interpolations are unchanged) is stable on release. Whether whitespace between two inline elements should be content too is open, and would be a later minor with its own note.

Verification

cargo test --workspace, cargo clippy --workspace --all-targets -- -D warnings, cargo fmt --check, cargo doc with warnings as errors; five new runtime tests (mesh-runtime/tests/whitespace.rs: three fail without the change) and one formatter test; the design note is docs/superpowers/specs/2026-10-16-mprx-whitespace-between-interpolations.md.