Skip to content

beta-0.2.1

Latest

Choose a tag to compare

@clholgat clholgat released this 19 Oct 17:45

What's new

A stability-focused release: runtime teardown and threading fixes, rendering fixes on iOS and Android, faster hot paths, and Xcode 27 support.

Runtime stability

  • Hardened runtime teardown at app termination: JS dispatch is refused once the JS queue is torn down, visibility observers are no longer flushed into a destroyed context, and the native context stays retained across in-flight Java calls.
  • Deadline-bounded synchronous JS calls now fail fast while the JS thread is stalled instead of blocking the caller.
  • Fixed a race in the initial auto-render publication on Android.
  • Promises handed to native code are no longer reported as unhandled.
  • QuickJS dumpMemoryStatistics is now O(1), removing a source of JS-thread stalls.
  • iOS arm64e: ObjC block invoke pointers are authenticated with the block ABI.
  • Android: avoid a legacy reflection crash in function lookup.
  • Null image-download cancellation handles are handled safely.

Rendering and views

  • iOS views with layout callbacks are now recyclable.
  • iOS text views redraw on resize instead of stretching a stale bitmap.
  • Dashed and dotted iOS borders animate with the corner radius.
  • Image views reuse images that JS already preloaded; Android skips drawing recycled bitmaps.
  • Pickers re-measure when their value changes.
  • Attributed-text tap recognizers are removed when a label switches to plain text.
  • Android: selectable text inputs restore their movement method when they become editable.
  • New iOS DateFormatting module so Valdi-formatted times honor the system 24-Hour Time setting.

Performance

  • Removed per-render allocations and global-lock interning from hot paths.
  • Module loading skips an always-missing source map lookup.
  • View pool hits, misses, and drops are reported per module.
  • Added headless microbenchmarks for layout, render, and runtime init.

Compiler and code generation

  • Generated C++ int enums now carry their TypeScript values.
  • Vue template attributes are emitted in source order.

Build and tooling

  • Xcode 27 / macOS 27 builds are supported.
  • Maven dependencies are pinned with lock files, avoiding Maven Central rate-limit (429) failures during builds.
  • com_android_dex is fetched from the AOSP GitHub mirror.
  • The Linux Swift toolchain is no longer fetched on macOS.
  • Web: build-system groundwork for the web target (no renderer changes yet).

Docs and project

  • New VERSIONING.md and an RFC process; refreshed ROADMAP.md.
  • Contribution rules, governance, and support docs; PR expectations in CONTRIBUTING.md; YAML issue forms.
  • SECURITY.md scope clarified; clean MIT LICENSE.
  • Setup docs and codelab fixes, including an Xcode 26.5/27 support note.

Valdi_Widgets

  • CoreTextField can now shrink inside fixed-width parents (Snapchat/Valdi_Widgets#23).
  • The release branch pins rules_android 0.6.5 to match Valdi.

Community contributions

Thank you to everyone who contributed to this release:

  • @bjdodson-openai: portable ClientSQL runtime and debugger (#181)
  • @tx3stn: ArrayBuffer typing fix for TypeScript 5.7+ (#186)
  • @tx3stn: createDirectorySync no longer reports success without creating the directory (#187)
  • @kwy404: spawnCliCommand no longer re-prints accumulated output (#190)

Upgrading

  • Install or update the CLI: npm i -g @snap/valdi@1.2.1. New projects from valdi bootstrap pin Valdi and Valdi_Widgets to beta-0.2.1.
  • Existing projects: set VALDI_TAG = "beta-0.2.1" in MODULE.bazel (update the integrity hash), and point the registry in .bazelrc at https://raw.githubusercontent.com/Snapchat/Valdi/beta-0.2.1/registry.
  • Valdi_Widgets users: use the beta-0.2.1 tag (from the release/beta-0.2.1 branch).
  • If you build with Xcode 27, upgrade: beta-0.2.0 (the CLI 1.2.0 default) does not build there.
  • CLI 1.2.1 fixes valdi install ios --simulator, which was inverted and built for a device.

Known issues

  • //valdi:valdi_ios_objc_test can abort intermittently on macOS due to a Hermes ES6 class transform bug (#195). This predates beta-0.2.0.