ivue@2.2.1 — field fixes: order-correct method binding, $ means stable identity
View on GitHub ↗Released July 27, 2026
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 wrappedClassis now safe by construction. ReactiveClass<C>preserves static members. The type was a bare construct signature, so every static member vanished fromReactive()'s return type — and from theStatic(Reactive($Class))composition. It is now a mapped intersection: statics typecheck, construction still yieldsReactiveInstance. 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.setand 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 publishesClass = 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.