haori 0.17.0 → 0.17.2

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.d.ts CHANGED
@@ -218,7 +218,7 @@ export declare class Core {
218
218
  * @param value 属性値
219
219
  * @returns Promise (DOM操作が完了したときに解決される)
220
220
  */
221
- static setBindingData(element: HTMLElement, data: Record<string, unknown>, skipFragments?: ReadonlySet<ElementFragment>): Promise<void>;
221
+ static setBindingData(element: HTMLElement, data: Record<string, unknown>, skipFragments?: ReadonlySet<ElementFragment>, reentrant?: boolean): Promise<void>;
222
222
  /**
223
223
  * 指定要素のバインディングデータを取得します。`setBindingData` の対となる
224
224
  * 公式の読み取り API です。
@@ -589,11 +589,6 @@ declare class ElementFragment extends Fragment {
589
589
  * チェーン。同一フラグメントへの並行呼出による適用順の逆転を防ぐ。
590
590
  */
591
591
  private bindingWorkChain;
592
- /**
593
- * バインドデータ更新処理を実行中かどうか。更新処理の内部から同一フラグメントへ
594
- * 再帰的に呼ばれた場合(data-url-param 等)の自己待機デッドロックを防ぐ。
595
- */
596
- private processingBindingWork;
597
592
  /** 生成時点の data-bind 属性の生値(リセット時の初期状態復元用) */
598
593
  private readonly initialBindAttribute;
599
594
  /** 子孫要素へ公開する派生バインドデータ */
@@ -702,6 +697,27 @@ declare class ElementFragment extends Fragment {
702
697
  * @returns 生のバインドデータ
703
698
  */
704
699
  getRawBindingData(): Record<string, unknown> | null;
700
+ /**
701
+ * Haori 自身が `data-bind` 属性へ書き込んだ値の多重集合。MutationObserver が
702
+ * 自身の書き込みのエコーを in-memory へ再取り込みして、並行更新時に古い値へ
703
+ * 巻き戻すのを防ぐために使う。外部からの `data-bind` 変更(記録に無い値)は
704
+ * 従来どおり取り込む。
705
+ */
706
+ private readonly selfWrittenBind;
707
+ /**
708
+ * `data-bind` 属性への自己書き込みを記録します(DOM へ実際に書き込んだ時に呼ぶ)。
709
+ *
710
+ * @param value 書き込んだ属性値
711
+ */
712
+ recordSelfWrittenBind(value: string): void;
713
+ /**
714
+ * 指定値が Haori 自身の `data-bind` 書き込みのエコーかどうかを判定し、該当すれば
715
+ * 記録を 1 つ消費します。
716
+ *
717
+ * @param value MutationObserver が観測した属性値
718
+ * @returns 自己書き込みのエコーであれば true(再取り込みをスキップしてよい)
719
+ */
720
+ consumeSelfWrittenBind(value: string): boolean;
705
721
  /**
706
722
  * 生の派生バインドデータを取得します。
707
723
  *
@@ -719,9 +735,12 @@ declare class ElementFragment extends Fragment {
719
735
  * (FIFO)で直列実行します。並行呼出による適用順の逆転(古いデータが後から
720
736
  * 適用されて新しい値を上書きする現象)を防ぎます。
721
737
  *
722
- * 更新処理の内部から同一フラグメントへ再帰的に呼ばれた場合(data-url-param
723
- * よる再評価中の再設定など)は、自己待機によるデッドロックを避けるため即時
724
- * 実行します。
738
+ * 純粋な FIFO(並行呼出を決して即時インライン実行しない)です。以前は実行中
739
+ * フラグでの「再入即時実行」を行っていましたが、await をまたいで届く**独立した
740
+ * 並行呼出**まで再入扱いしてインライン実行し、`skipMutationAttributes` 中の
741
+ * `data-bind` 書き込みが破棄されて古い値が後勝ちする競合の原因になっていました。
742
+ * 真の再入(data-url-param 等)は呼出側がキューを介さず実行するため、ここでは
743
+ * 一律にチェーンへ積みます。
725
744
  *
726
745
  * @param work 直列化したいバインドデータ更新処理
727
746
  * @returns work の完了 Promise
@@ -1706,7 +1725,7 @@ declare class TextFragment extends Fragment {
1706
1725
  evaluate(): Promise<void>;
1707
1726
  }
1708
1727
 
1709
- export declare const version = "0.17.0";
1728
+ export declare const version = "0.17.2";
1710
1729
 
1711
1730
  /**
1712
1731
  * すべてのレンダリングタスク(追従投入分を含む)の完了を待ちます。
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "haori",
3
- "version": "0.17.0",
3
+ "version": "0.17.2",
4
4
  "description": "A lightweight HTML-first UI engine powered by declarative data bindings and expressions.",
5
5
  "scripts": {
6
6
  "dev": "vite",