@wcstack/state 2.1.0 → 2.1.1

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/dist/index.esm.js CHANGED
@@ -9182,7 +9182,7 @@ async function buildBindings(root) {
9182
9182
  }
9183
9183
  }
9184
9184
 
9185
- var version = "2.1.0";
9185
+ var version = "2.1.1";
9186
9186
  var pkg = {
9187
9187
  version: version};
9188
9188
 
@@ -14675,6 +14675,34 @@ function notifyWrite(address, absAddress, receiver, handler, keyedMergePath) {
14675
14675
  // $postUpdate の手動リフレッシュは従来通り全行展開のまま)
14676
14676
  { listExpansion: "diff", keyedMergePath });
14677
14677
  }
14678
+ /**
14679
+ * 書き込み完了後のキャッシュ整合(Issue #234)。
14680
+ *
14681
+ * ワイルドカードのデータパス(リスト行)は代入値がそのまま格納値なので、
14682
+ * 代入値を dirty:false で載せて次回の読みを省く。
14683
+ *
14684
+ * アクセサペア(getterPaths に載るパス)は getter が正本であり、setter は
14685
+ * 命令的な代入に過ぎない。代入値を getter の評価結果として固定すると
14686
+ * - setter が正規化・分配した結果と読みが食い違う
14687
+ * - getter が一度も評価されず動的依存が張られない → 依存先を書いても
14688
+ * walkDependency がこのキャッシュを dirty にできず、永続的に stale になる
14689
+ * (プリミティブ代入は同値ガードの旧値読みで偶然 getter が走るが、
14690
+ * オブジェクト代入は同値ガードを素通りするため救済がない)
14691
+ * ため、キャッシュを dirty にして次回の読みで getter を再評価させる。
14692
+ */
14693
+ function commitWriteCache(stateElement, path, absAddress, value, cacheable) {
14694
+ if (!cacheable) {
14695
+ return;
14696
+ }
14697
+ if (stateElement.getterPaths.has(path)) {
14698
+ dirtyCacheEntryByAbsoluteStateAddress(absAddress);
14699
+ return;
14700
+ }
14701
+ setCacheEntryByAbsoluteStateAddress(absAddress, {
14702
+ value: value,
14703
+ dirty: false
14704
+ });
14705
+ }
14678
14706
  function _setByAddress(target, address, absAddress, value, receiver, handler, keyedMergePath) {
14679
14707
  try {
14680
14708
  if (address.pathInfo.path in target) {
@@ -14896,12 +14924,7 @@ function setByAddressCore(target, address, value, receiver, handler, keyedMergeP
14896
14924
  }
14897
14925
  finally {
14898
14926
  notifyWrite(address, absAddress, receiver, handler, keyedMergePath);
14899
- if (cacheable) {
14900
- setCacheEntryByAbsoluteStateAddress(absAddress, {
14901
- value: value,
14902
- dirty: false
14903
- });
14904
- }
14927
+ commitWriteCache(stateElement, path, absAddress, value, cacheable);
14905
14928
  // DCC bindable イベントディスパッチ(完全一致 + サブパス → 先頭セグメント、§2.1)
14906
14929
  dispatchBindableEvent(stateElement, address.pathInfo, { value });
14907
14930
  }
@@ -14948,12 +14971,7 @@ function setByAddressCore(target, address, value, receiver, handler, keyedMergeP
14948
14971
  }
14949
14972
  }
14950
14973
  finally {
14951
- if (cacheable) {
14952
- setCacheEntryByAbsoluteStateAddress(absAddress, {
14953
- value: value,
14954
- dirty: false
14955
- });
14956
- }
14974
+ commitWriteCache(stateElement, path, absAddress, value, cacheable);
14957
14975
  // DCC bindable イベントディスパッチ(完全一致 + サブパス → 先頭セグメント、§2.1)
14958
14976
  dispatchBindableEvent(stateElement, address.pathInfo, { value });
14959
14977
  }