Skip to content

ivue@2.2.1 — field fixes: order-correct method binding, $ means stable identity

Choose a tag to compare

@infinite-system infinite-system released this 27 Jul 15:04
· 193 commits to main since this release

ivue@2.2.1 — field fixes: order-correct method binding, $ means stable identity

Same-day fixes from field evidence against 2.2.0, reported by the
first production consumer.

Fixed

  • Static method binding was order-dependent. The bound function
    was installed as an own named property on the receiving class, so a
    parent-first read planted a parent-bound method where every
    descendant's chain lookup would find it — subclass overrides of
    this-dispatched members were silently ignored depending on read
    order. Methods now cache their bound function under a per-receiver
    symbol own-property (the same discipline as $-caches): each class
    binds itself on its own first read, in any order. Extending the
    wrapped Class is now safe by construction.
  • ReactiveClass<C> preserves static members. The type was a bare
    construct signature, so every static member vanished from
    Reactive()'s return type — and from the
    Static(Reactive($Class)) composition. It is now a mapped
    intersection: statics typecheck, construction still yields
    ReactiveInstance. Types only — zero runtime change.

Changed

  • $-cached values are no longer frozen. Field evidence showed
    the shallow freeze forbade the one mutation shape it could see
    (plain-object writes — crashing a real app's boot) while allowing
    every collection mutation (Map.set and kin) — partial protection
    that misleads. The contract is now stated plainly: the $ prefix
    promises stable identity per receiver, nothing more; whether the
    cached value is immutable config or a deliberately mutable memo
    table is the author's design.
  • Composition is documented and tested: a class needing instance
    reactivity and static $-caches publishes
    Class = Static(Reactive($Class)) — both contracts verified to hold
    through the composed class. $ semantics are granted by the
    transform, on both the instance and static sides.

Measured

188 tests at 100% coverage on every metric, including both read orders
of the binding fix. Core entry 1,112 B gzipped, ivue/extras 493 B.