@ape-egg/vibe 1.9.9 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## [2.0.0] - 2026-06-06
4
+
5
+ Version rolled to 2.0.0. **Still Beta — no behavior changes since 1.9.9.** The major bump consolidates the 1.9.x line (runtime reactive core, components, optional compiler, `$.unsafe` raw-HTML, plus the recent reactivity-correctness, iteration teardown-leak, and scoped-state performance fixes); it does not signal a stability promotion or any breaking change.
6
+
7
+ ---
8
+
3
9
  ## [1.9.9] - 2026-06-06
4
10
 
5
11
  ### Fixed
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Vibe
2
2
 
3
- **Version 1.9.9 (Beta)** — A runtime-first reactive framework with optional compilation.
3
+ **Version 2.0.0 (Beta)** — A runtime-first reactive framework with optional compilation.
4
4
 
5
5
  No virtual DOM. No build step required. Just modern JavaScript. When you need production optimizations, add the optional Rust-based compiler.
6
6
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ape-egg/vibe",
3
- "version": "1.9.9",
3
+ "version": "2.0.0",
4
4
  "type": "module",
5
5
  "description": "Runtime-first reactivity with optional compiler",
6
6
  "main": "index.js",
@@ -388,6 +388,15 @@ const refreshIterationComponentProps = (clonedNodes, scopedState) => {
388
388
  for (const { id, expr } of el._vibeIterPropExprs) {
389
389
  try {
390
390
  const value = evalInScope(expr, scopedState, el);
391
+ // Don't clobber a slot with undefined — mirrors the mount-time guard in
392
+ // resolveIterationComponentProps. forEachIterWrapper reaches every
393
+ // [data-vibe-iter-prop] descendant, including components owned by a
394
+ // DEEPER iteration (e.g. a cell component inside a nested each). Their
395
+ // prop expressions reference the inner each's alias, which isn't in this
396
+ // (outer) row's scope, so they evaluate to undefined here. Skipping keeps
397
+ // the value the inner iteration's own update already set with the correct
398
+ // scope, instead of wiping it to undefined and leaving raw @[...] bindings.
399
+ if (value === undefined) continue;
391
400
  if (registry[id] !== value) {
392
401
  registry[id] = value;
393
402
  changed.add(id);