haori 0.40.0 → 0.41.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/README.ja.md +1 -1
- package/README.md +1 -1
- package/dist/haori.cjs.js +17 -17
- package/dist/haori.es.js +1487 -1322
- package/dist/haori.iife.js +17 -17
- package/dist/index.d.ts +151 -13
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -90,6 +90,11 @@ export declare class Core {
|
|
|
90
90
|
* 描画確定ごとに同じ警告を出し続けないために使用します。
|
|
91
91
|
*/
|
|
92
92
|
private static readonly EACH_RENDERED_CHANGE_WARNED;
|
|
93
|
+
/**
|
|
94
|
+
* `data-each-key` の重複を警告済みの項目名。
|
|
95
|
+
* 描画のたびに同じ警告を出し続けないために使用します。
|
|
96
|
+
*/
|
|
97
|
+
private static readonly WARNED_DUPLICATE_EACH_KEYS;
|
|
93
98
|
/**
|
|
94
99
|
* 遅延属性かどうか(完全名で判定)を判定します。
|
|
95
100
|
*
|
|
@@ -285,7 +290,7 @@ export declare class Core {
|
|
|
285
290
|
* `options.kind` に `'nonSupply'` を渡します。
|
|
286
291
|
*
|
|
287
292
|
* 解除の範囲は呼び出し側が選びません。**供給はその操作の通番までの編集を解除し、
|
|
288
|
-
*
|
|
293
|
+
* それより後の編集は残します**(仕様「ユーザー編集と宣言バインドの権威」)。飛行中の通信の応答が、送出後に
|
|
289
294
|
* 行われた編集を消さないのはこの規則によるものです。
|
|
290
295
|
*
|
|
291
296
|
* @param element 対象要素
|
|
@@ -362,6 +367,12 @@ export declare class Core {
|
|
|
362
367
|
* 置き換えます。`data-each-arg` が無い構成では要素データのキーがそのまま行スコープ
|
|
363
368
|
* へ広がるため、上位の宣言を接頭に付けます。
|
|
364
369
|
*
|
|
370
|
+
* **`null` を返す 3 つの分岐は、振る舞いとしては観測できません。** 空の宣言や前置の
|
|
371
|
+
* 不一致では、`null` を返さずに組み立てを続けても `rows.` や `.items` のような経路に
|
|
372
|
+
* ならない文字列ができるだけで、呼び出し側の照合はどちらでも一致しません。意図を
|
|
373
|
+
* 明示するために残していますが、**これらを対象にした回帰テストは書けません**
|
|
374
|
+
* (`docs/ja/testing.md` の規則 2 に照らして、落ちないテストは足さない)。
|
|
375
|
+
*
|
|
365
376
|
* @param element `data-each` を持つ要素
|
|
366
377
|
* @param root 起点の要素(経路の基準)
|
|
367
378
|
* @returns 絶対経路。式が空、または経路として扱えない場合は null
|
|
@@ -815,6 +826,18 @@ export declare class Core {
|
|
|
815
826
|
* @param newList 新しいリスト
|
|
816
827
|
*/
|
|
817
828
|
private static updateDiff;
|
|
829
|
+
/**
|
|
830
|
+
* `data-each-key` の値が重複していることを開発モードで警告します。
|
|
831
|
+
*
|
|
832
|
+
* 仕様「`data-each`」は `data-each-key` を一意なキーの項目名と定めています。
|
|
833
|
+
* 重複しても行は出現順で対応付けるため描画は崩れませんが、キーによる行の識別
|
|
834
|
+
* (差分更新での再利用、`data-form-list` の行の対応付け、行イベントのキー)は
|
|
835
|
+
* 意図した働きをしません。指定漏れに気づけるよう、項目名ごとに一度だけ知らせます。
|
|
836
|
+
*
|
|
837
|
+
* @param keyArg `data-each-key` に指定された項目名
|
|
838
|
+
* @returns 戻り値はありません。
|
|
839
|
+
*/
|
|
840
|
+
private static warnDuplicateEachKey;
|
|
818
841
|
/**
|
|
819
842
|
* 再利用した `data-each` の行を、新しい並び順の位置へ移動します。
|
|
820
843
|
*
|
|
@@ -843,6 +866,12 @@ export declare class Core {
|
|
|
843
866
|
* 挿入すると以降の行は別の要素データを担当することになるため、変化した再利用行への
|
|
844
867
|
* 適用は必要です(これを省くと挿入位置以降の入力値が前の行のまま残ります)。
|
|
845
868
|
*
|
|
869
|
+
* 取得元(`data-each`)と収集先(`data-form-list`)が**別の配列**を指す構成では
|
|
870
|
+
* 反映しません。要素データが権威なのは「行の入力欄が集まって配列要素になる」
|
|
871
|
+
* 場合だけで、別の配列を繰り返している行では、要素データは入力欄を表しません。
|
|
872
|
+
* 反映すると、要素データに無い `name` の欄(選択のチェックボックスなど)が
|
|
873
|
+
* 空になります(`Form.isCollectedListFromEachSource()`)。
|
|
874
|
+
*
|
|
846
875
|
* @param parent `data-each` コンテナのフラグメント
|
|
847
876
|
* @param row 行のフラグメント
|
|
848
877
|
* @param item 行の要素データ
|
|
@@ -938,7 +967,7 @@ declare class ElementFragment extends Fragment {
|
|
|
938
967
|
/**
|
|
939
968
|
* このフラグメントへ最後に適用された明示的な値の供給の通番(未適用は 0)。
|
|
940
969
|
*
|
|
941
|
-
*
|
|
970
|
+
* 供給同士は後勝ちです(仕様「反映待ちの間に起きた変化」)。古い供給が後から届いた供給を上書きしない
|
|
942
971
|
* よう、供給を起こした操作の通番と比べて判定します。初期化も 1 つの供給として
|
|
943
972
|
* 同じ列で数えます(`isSupplyStale()`)。
|
|
944
973
|
*/
|
|
@@ -1001,7 +1030,7 @@ declare class ElementFragment extends Fragment {
|
|
|
1001
1030
|
* ミラーできず、属性と in-memory が食い違って残る不具合になっていました)。
|
|
1002
1031
|
*
|
|
1003
1032
|
* 値は書き込みの完了 Promise です。**同じ属性へ内部から届いた書き込みは捨てず**、
|
|
1004
|
-
* この Promise
|
|
1033
|
+
* この Promise を待ってから改めて反映します(後勝ち、仕様「反映待ちの間に起きた変化」)。捨てるのは
|
|
1005
1034
|
* オブザーバー由来の書き戻し(=自分の書き込みのエコー。ここがループの断ち口)と
|
|
1006
1035
|
* 削除だけです。
|
|
1007
1036
|
*/
|
|
@@ -1232,7 +1261,7 @@ declare class ElementFragment extends Fragment {
|
|
|
1232
1261
|
* 指定した通番の供給がすでに古くなっているかを返します。
|
|
1233
1262
|
*
|
|
1234
1263
|
* 真の場合、その供給より後の供給がこの宛先へ適用済みです。古い供給を載せると
|
|
1235
|
-
*
|
|
1264
|
+
* 「最後に供給された値が残る」(仕様「反映待ちの間に起きた変化」)が崩れるため、適用してはいけません。
|
|
1236
1265
|
*
|
|
1237
1266
|
* @param sequence 判定したい供給の通番
|
|
1238
1267
|
* @returns より新しい供給が適用済みなら true
|
|
@@ -2446,15 +2475,38 @@ export declare class Form {
|
|
|
2446
2475
|
* 未編集の欄まで編集の権威を得てしまいます。編集された経路だけを示すために使います
|
|
2447
2476
|
* (`ValueChangeOrigin.editedPaths`)。
|
|
2448
2477
|
*
|
|
2478
|
+
* `data-if` が偽の分岐で収集から**除外された**キーの経路も含めます。除外は
|
|
2479
|
+
* 「その入力欄がフォームから外れた」ことを意味するため、以前その欄で行われた編集が
|
|
2480
|
+
* その経路の権威を持ち続けてはいけません。含めないと、非供給更新は「編集が確定した
|
|
2481
|
+
* 宛先へは適用しない」規則(仕様「ユーザー編集と宣言バインドの権威」)で棄却され、
|
|
2482
|
+
* 除外したキーが土台の値のまま
|
|
2483
|
+
* 残ります(表示条件から外れた項目が保存値・送信データに残る)。除外を引き起こした
|
|
2484
|
+
* のは利用者の編集(分岐の条件を変える操作)そのものです。
|
|
2485
|
+
*
|
|
2449
2486
|
* 配列(`data-form-list` の行)は対象外です。行と配列要素の対応はリストキーで
|
|
2450
2487
|
* 決まり、収集値からは同じ規則で経路を組み立てられません。行の編集は応答の反映側
|
|
2451
2488
|
* (`Procedure` の `reconcileRowUserEdits()`)で保護します。
|
|
2452
2489
|
*
|
|
2453
2490
|
* @param form 対象のフォームフラグメント
|
|
2454
2491
|
* @param prefix 経路の接頭辞(`data-form-arg` のキーなど。無い場合は空文字)
|
|
2492
|
+
* @param collected この更新が運ぶ収集値。除外されたキーの判定に使います。
|
|
2493
|
+
* **重ね合わせへ渡すものと同じオブジェクトを渡してください**(明示的に与えた
|
|
2494
|
+
* 値が収集値へ重なっている場合、そのキーは除外の対象外になります)。省略時は
|
|
2495
|
+
* ここで収集し直します
|
|
2455
2496
|
* @returns 編集された経路の集合
|
|
2456
2497
|
*/
|
|
2457
|
-
static collectEditedPaths(form: ElementFragment, prefix?: string): ReadonlySet<string>;
|
|
2498
|
+
static collectEditedPaths(form: ElementFragment, prefix?: string, collected?: Record<string, unknown> | null): ReadonlySet<string>;
|
|
2499
|
+
/**
|
|
2500
|
+
* 収集値をたどって、除外されたキーの経路を集めます。
|
|
2501
|
+
*
|
|
2502
|
+
* 除外は階層ごとに控えてあります(`COLLECTED_EXCLUDED_KEYS`)。表示中の分岐にも
|
|
2503
|
+
* 同じキーがある場合は収集値に現れるため、経路には加えません。
|
|
2504
|
+
*
|
|
2505
|
+
* @param value たどる値
|
|
2506
|
+
* @param path ここまでの経路
|
|
2507
|
+
* @param paths 集める先
|
|
2508
|
+
*/
|
|
2509
|
+
private static walkExcludedPaths;
|
|
2458
2510
|
/**
|
|
2459
2511
|
* 収集した編集値をたどって葉の経路を集めます。
|
|
2460
2512
|
*
|
|
@@ -2471,6 +2523,8 @@ export declare class Form {
|
|
|
2471
2523
|
* @param values オブジェクトに追加する値のオブジェクト
|
|
2472
2524
|
* @param minUserEditSequence 指定した場合、この通し番号より後にユーザーが編集した
|
|
2473
2525
|
* 入力欄だけを収集する(`data-form-list` の行位置は空オブジェクトで保持する)
|
|
2526
|
+
* @param excluded この階層で `data-if-false` により除外されたキーを集める先。
|
|
2527
|
+
* null の場合は集めない(編集分だけの収集では使わない)
|
|
2474
2528
|
* @returns values と同じオブジェクト
|
|
2475
2529
|
*/
|
|
2476
2530
|
private static getPartValues;
|
|
@@ -2598,6 +2652,16 @@ export declare class Form {
|
|
|
2598
2652
|
* @returns 宣言されている最上位のキー名
|
|
2599
2653
|
*/
|
|
2600
2654
|
static collectDeclaredFieldKeys(root: ElementFragment): Set<string>;
|
|
2655
|
+
/**
|
|
2656
|
+
* フラグメントの配下で収集対象として**宣言されている**最上位のキー名を列挙します。
|
|
2657
|
+
*
|
|
2658
|
+
* `collectDeclaredFieldKeys()` の実体です。収集で除外した部分木が宣言している
|
|
2659
|
+
* キーを知るために、除外側(`getPartValues()`)からも呼びます。
|
|
2660
|
+
*
|
|
2661
|
+
* @param root 走査の起点フラグメント
|
|
2662
|
+
* @returns 宣言されている最上位のキー名
|
|
2663
|
+
*/
|
|
2664
|
+
private static collectDeclaredKeysInFragment;
|
|
2601
2665
|
/**
|
|
2602
2666
|
* `data-validity` の条件を評価し、`setCustomValidity()` へ反映します。
|
|
2603
2667
|
*
|
|
@@ -2666,6 +2730,15 @@ export declare class Form {
|
|
|
2666
2730
|
* 配列そのものを鍵にして控えます。参照が失われた場合は出現順の対応へ退きます。
|
|
2667
2731
|
*/
|
|
2668
2732
|
private static readonly COLLECTED_ROW_IDENTITY;
|
|
2733
|
+
/**
|
|
2734
|
+
* 収集値の各階層で、`data-if-false` により収集から除外されたキー。
|
|
2735
|
+
*
|
|
2736
|
+
* 収集値は素のオブジェクトなので、それ単体では「収集されなかったキー」と
|
|
2737
|
+
* 「そもそも宣言が無いキー」を区別できません。重ね合わせは前者を落とし後者を
|
|
2738
|
+
* 土台から引き継ぐ必要があるため、収集の時点でしか分からない除外を、階層ごとの
|
|
2739
|
+
* オブジェクトそのものを鍵にして控えます。
|
|
2740
|
+
*/
|
|
2741
|
+
private static readonly COLLECTED_EXCLUDED_KEYS;
|
|
2669
2742
|
/** 出現順への退避を知らせた理由(同じ理由を繰り返さないため) */
|
|
2670
2743
|
private static readonly warnedPositionalRowFallbacks;
|
|
2671
2744
|
/**
|
|
@@ -2674,16 +2747,25 @@ export declare class Form {
|
|
|
2674
2747
|
* @param rows 収集した行配列
|
|
2675
2748
|
* @param keyArg `data-each-key` の指定(無ければ null)
|
|
2676
2749
|
* @param keys 行ごとのリストキー(`rows` と同じ並び)
|
|
2750
|
+
* @param identifiesItems リストキーで収集先の配列要素を識別できるかどうか
|
|
2677
2751
|
*/
|
|
2678
2752
|
private static registerCollectedRowIdentity;
|
|
2679
2753
|
/**
|
|
2680
|
-
*
|
|
2754
|
+
* 収集値の階層に、除外されたキーの集合を結び付けます。
|
|
2681
2755
|
*
|
|
2682
|
-
*
|
|
2683
|
-
*
|
|
2756
|
+
* @param values その階層の収集値
|
|
2757
|
+
* @param keys 除外されたキー
|
|
2758
|
+
*/
|
|
2759
|
+
private static registerCollectedExcludedKeys;
|
|
2760
|
+
/**
|
|
2761
|
+
* 収集値に控えた情報を、複製した値へ引き継ぎます。
|
|
2684
2762
|
*
|
|
2685
|
-
*
|
|
2686
|
-
*
|
|
2763
|
+
* 収集値をたどって作り直す処理(`File` の正規化など)は配列やオブジェクトを
|
|
2764
|
+
* 複製するため、引き継がないと重ね合わせが出現順の対応へ退いたり、非表示分岐で
|
|
2765
|
+
* 除外したキーが土台から復活したりします。
|
|
2766
|
+
*
|
|
2767
|
+
* @param from 元の値
|
|
2768
|
+
* @param to 複製した値
|
|
2687
2769
|
*/
|
|
2688
2770
|
static carryCollectedRowIdentity(from: object, to: object): void;
|
|
2689
2771
|
/**
|
|
@@ -2710,6 +2792,14 @@ export declare class Form {
|
|
|
2710
2792
|
* ない場合は**出現順**の対応へ退きます。要素数はこの対応付けの結果に従うため、
|
|
2711
2793
|
* 行の追加・削除はそのまま反映されます。
|
|
2712
2794
|
*
|
|
2795
|
+
* **`data-if` が偽の分岐で収集から除外されたキーは、土台からも落とします。**
|
|
2796
|
+
* 除外は「表示中の分岐の入力値だけが直列化され、非表示分岐の値との競合は発生
|
|
2797
|
+
* しません」(仕様の `data-if-false` 分岐とフォーム送信)を保証するためのもので、
|
|
2798
|
+
* 土台の値が残るとこの保証が崩れ、表示条件から外れた項目が保存値・送信データに
|
|
2799
|
+
* 残ります。引き継ぐのは**宣言の無いキー**だけです(`id` や表示専用のラベル
|
|
2800
|
+
* など、そもそもどの入力欄も表さないキー)。この区別は条件式の評価スコープ
|
|
2801
|
+
* (`buildConditionScope()`)が使うものと同じです。
|
|
2802
|
+
*
|
|
2713
2803
|
* プロトタイプ汚染につながるキー(`__proto__` など)は読み飛ばします。式評価は
|
|
2714
2804
|
* これらをバインドキーとして受け付けないため、載せても参照できず、`__proto__` に
|
|
2715
2805
|
* 至っては代入でオブジェクトのプロトタイプが差し替わってしまいます。
|
|
@@ -2727,6 +2817,54 @@ export declare class Form {
|
|
|
2727
2817
|
* @returns 重ね合わせた値
|
|
2728
2818
|
*/
|
|
2729
2819
|
private static overlayCollectedValue;
|
|
2820
|
+
/**
|
|
2821
|
+
* 式の先頭にある素の経路を切り出す正規表現。
|
|
2822
|
+
*
|
|
2823
|
+
* 1 つめの捕獲が経路、2 つめが残りです。`data-each` は式なので、経路として読める
|
|
2824
|
+
* ものだけを経路として扱います。
|
|
2825
|
+
*/
|
|
2826
|
+
private static readonly LEADING_PATH_PATTERN;
|
|
2827
|
+
/**
|
|
2828
|
+
* 式の先頭にある素の経路を返します。
|
|
2829
|
+
*
|
|
2830
|
+
* `rows` や `candidates.content` のような素の経路と、既定値を添えただけの
|
|
2831
|
+
* `rows || []` / `rows ?? []` を経路として扱います。それ以外(関数呼び出しや
|
|
2832
|
+
* 添字など)は経路として読めないものとして null を返します。
|
|
2833
|
+
*
|
|
2834
|
+
* `null` を返す 2 つの分岐は、呼び出し側から見て同じ結論(判定できないので従来
|
|
2835
|
+
* どおりリストキーを使う)になるため、**振る舞いとしては区別できません**。回帰
|
|
2836
|
+
* テストで押さえられるのは「`|| []` を経路として読む」側だけです
|
|
2837
|
+
* (`tests/each-source-differs-from-form-list.test.ts`)。
|
|
2838
|
+
*
|
|
2839
|
+
* @param expression 対象の式
|
|
2840
|
+
* @returns 先頭の経路。経路として読めない場合は null
|
|
2841
|
+
*/
|
|
2842
|
+
private static resolveLeadingPath;
|
|
2843
|
+
/**
|
|
2844
|
+
* `data-each` の取得元が `data-form-list` の収集先と同じ配列かを判定します。
|
|
2845
|
+
*
|
|
2846
|
+
* 行のリストキーは `data-each` の**取得元**の要素から作ります(`data-each-key` は
|
|
2847
|
+
* 取得元の項目名です)。そのキーで収集先の配列を引けるのは、取得元と収集先が同じ
|
|
2848
|
+
* 配列のときだけです。別の配列を指す構成(候補一覧を繰り返して、選択結果を別の
|
|
2849
|
+
* キーへ集める)では、どの行のキーも収集先には無いため、リストキーによる対応付け
|
|
2850
|
+
* は全滅します。収集では全行が「配列から消えた行」と判定されて収集値が空配列に
|
|
2851
|
+
* なり、書き戻しでは全行が「対応する要素なし」になります。同じ前提は要素データを
|
|
2852
|
+
* 行の入力欄へ反映する経路(`Core.applyRowFormValues()`)にもあり、取得元の要素
|
|
2853
|
+
* データで行の入力欄を上書きするため、取得元に無い `name` の欄が空になります。
|
|
2854
|
+
*
|
|
2855
|
+
* 判定は宣言だけで行います(実行時の値に依らせると、配列が一時的に空のときに
|
|
2856
|
+
* 判定が揺れます)。`data-each` の式の先頭の経路の**末尾の区間**を `data-form-list`
|
|
2857
|
+
* の名前と比べます。収集先の名前は収集構造の 1 区間なので、同じ配列であれば
|
|
2858
|
+
* 取得元の経路の末尾もその名前になります(`items` / `dialog.items` / `r.items`)。
|
|
2859
|
+
*
|
|
2860
|
+
* 経路として読めない式(関数呼び出しなど)は判定できないため true を返し、
|
|
2861
|
+
* 従来どおりリストキーで対応付けます。判定できないことを理由に対応付けを緩めると、
|
|
2862
|
+
* 行の挿入・削除で値がずれる問題(0.39.2 で修正)が戻ってしまいます。
|
|
2863
|
+
*
|
|
2864
|
+
* @param container `data-form-list` を持つコンテナのフラグメント
|
|
2865
|
+
* @returns 同じ配列を指す場合、または判定できない場合は true
|
|
2866
|
+
*/
|
|
2867
|
+
static isCollectedListFromEachSource(container: ElementFragment): boolean;
|
|
2730
2868
|
/**
|
|
2731
2869
|
* 配列要素のリストキーと、その要素の位置の対応表を作ります。
|
|
2732
2870
|
*
|
|
@@ -2889,9 +3027,9 @@ export declare class Form {
|
|
|
2889
3027
|
* 対象フラグメントとその子孫要素の値を初期化します。
|
|
2890
3028
|
* 値の初期化とメッセージのクリアを行います。
|
|
2891
3029
|
*
|
|
2892
|
-
* 初期化は「初期 `data-bind` 宣言の値を供給する 1
|
|
3030
|
+
* 初期化は「初期 `data-bind` 宣言の値を供給する 1 つの操作」です(仕様「`data-{event}-reset`」)。
|
|
2893
3031
|
* したがって他の供給と同じ後勝ちの規則に従い、**この初期化より後に供給された値が
|
|
2894
|
-
*
|
|
3032
|
+
* すでに載っている宛先へは書き込みません**(仕様「反映待ちの間に起きた変化」)。
|
|
2895
3033
|
*
|
|
2896
3034
|
* @param fragment 対象フラグメント
|
|
2897
3035
|
* @param operationSequence 初期化を要求した操作の通番。**操作が起きた時点**
|
|
@@ -3703,7 +3841,7 @@ declare interface ValueChangeOrigin {
|
|
|
3703
3841
|
* リリース時に `package.json` と揃えて更新します(`tests/version.test.ts` が
|
|
3704
3842
|
* 一致を検査します)。
|
|
3705
3843
|
*/
|
|
3706
|
-
export declare const version = "0.
|
|
3844
|
+
export declare const version = "0.41.0";
|
|
3707
3845
|
|
|
3708
3846
|
/**
|
|
3709
3847
|
* すべてのレンダリングタスク(追従投入分を含む)の完了を待ちます。
|