@wcstack/state 3.3.0 → 3.5.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.
Files changed (43) hide show
  1. package/README.ja.md +94 -27
  2. package/README.md +94 -27
  3. package/dist/auto.min.js +1 -1
  4. package/dist/auto.min.js.map +1 -1
  5. package/dist/index.d.ts +52 -1
  6. package/dist/index.esm.js +1 -1
  7. package/dist/index.esm.js.map +1 -1
  8. package/dist/split/chunks/binder.js +1 -1
  9. package/dist/split/chunks/binder.js.map +1 -1
  10. package/dist/split/chunks/checkDependency.js +1 -1
  11. package/dist/split/chunks/checkDependency.js.map +1 -1
  12. package/dist/split/chunks/declarationAliases.js.map +1 -1
  13. package/dist/split/chunks/diagnosticsHooks.js.map +1 -1
  14. package/dist/split/chunks/featureBridge.js +1 -1
  15. package/dist/split/chunks/filterRegistry.js +1 -1
  16. package/dist/split/chunks/filterRegistry.js.map +1 -1
  17. package/dist/split/chunks/getAllPropertyDescriptors.js +1 -1
  18. package/dist/split/chunks/lifecycleHooks.js +1 -1
  19. package/dist/split/chunks/lifecycleHooks.js.map +1 -1
  20. package/dist/split/chunks/pathDiagnostics.js +1 -1
  21. package/dist/split/chunks/pathDiagnostics.js.map +1 -1
  22. package/dist/split/chunks/registerComponents.js +1 -1
  23. package/dist/split/chunks/registerComponents.js.map +1 -1
  24. package/dist/split/chunks/setAll.js +1 -1
  25. package/dist/split/chunks/setAll.js.map +1 -1
  26. package/dist/split/chunks/version.js +1 -1
  27. package/dist/split/core.d.ts +77 -1
  28. package/dist/split/core.js +1 -1
  29. package/dist/split/features/devtools.js +1 -1
  30. package/dist/split/features/devtools.js.map +1 -1
  31. package/dist/split/features/diagnostics.js +1 -1
  32. package/dist/split/features/diagnostics.js.map +1 -1
  33. package/dist/split/features/formats.js +1 -1
  34. package/dist/split/features/formats.js.map +1 -1
  35. package/dist/split/features/recursion.js +1 -1
  36. package/dist/split/features/recursion.js.map +1 -1
  37. package/dist/split/features/scopes.js +1 -1
  38. package/dist/split/features/scopes.js.map +1 -1
  39. package/dist/split/features/ssr.js +1 -1
  40. package/dist/split/features/ssr.js.map +1 -1
  41. package/dist/split/features/temporal.js +1 -1
  42. package/dist/split/features/temporal.js.map +1 -1
  43. package/package.json +1 -1
package/README.ja.md CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  > 🀖 **AI coding agents**: This README is a package-level reference, not the primary entry point for building a wcstack application. If you have not already done so, first read the repository [README](https://github.com/wcstack/wcstack#readme) and [AGENTS.md](https://github.com/wcstack/wcstack/blob/main/AGENTS.md), then use the [wcstack-app skill](https://github.com/wcstack/wcstack-skill).
4
4
 
5
+ > **4.0 ぞの準備**: 4.0 はただリリヌスされおいたせん。䜕が倉わり、3.x のうちに䜕ができるかは [3.x → 4.0 移行ガむドプレビュヌ](https://github.com/wcstack/wcstack/blob/main/docs/migration-v4.ja.md) にたずめおいたす。
6
+
5
7
  **これは䟿利な既存FWの別実装ではありたせん。パスがビュヌずモデルの契玄になる——フロント゚ンドの倖で確立した系譜を、Web暙準の䞊に持ち蟌む詊みです。**
6
8
 
7
9
  倚くのラむブラリは、UI・状態・コンポヌネントの結合点を JavaScript の䞭に眮きたす。`@wcstack/state` はそこを遞びたせん。仮想DOMも、コンパむルも、hook も、selector も前提にせず、HTML ずパス文字列だけを契玄ずしお UI ず状態を結び぀けたす。
@@ -137,7 +139,7 @@
137
139
  | **コンポヌネント** | 排他的な 2 方匏 — JavaScript クラス`bind-component` か、HTML だけの DCC か | [機構の遞び方](#コンポヌネント機構の遞び方) |
138
140
  | **他芁玠ずの配線** | wc-bindable プロトコル、spread`...: obj`、`#init=` / `#sync=` の authority、プロパティ→属性ミラヌ | [バむンディング authority](#バむンディング-authority-init--sync) · [Spread](#spread-バむンディング) · [Inputs](#inputs-ず属性ミラヌ) |
139
141
  | **トヌクン** | command token が state から芁玠のメ゜ッドを呌び、event token が芁玠のむベントを state ぞ戻す | [Command token](#command-tokenメ゜ッドバむンディング) · [Event token](#event-tokenむベントバむンディング) |
140
- | **時間** | `$stream` が非同期゜ヌスを fold し、`$watch` が headless に反応し、`$scan` が䞡者を越えお残る环積倀を持぀ | [時間を扱う機構の遞び方](#時間を扱う機構の遞び方) |
142
+ | **時間** | `$stream` が非同期゜ヌスを fold し、`$watch` が headless に反応し、`$scan` が䞡者を越えお残る环積倀を持぀`$scan` は 3.5 で譊告が出お 4.0 で倖れる — [4.0 ぞの準備](#40-ぞの準備wcsv4-migration) | [時間を扱う機構の遞び方](#時間を扱う機構の遞び方) |
141
143
  | **初期化ずラむフサむクル** | state の䟛絊は 6 通り。`$connectedCallback` 〜 `$stateReadyCallback`、`bootstrapState()` / `createState()` | [状態の初期化](#状態の初期化) · [ラむフサむクルフック](#ラむフサむクルフック) · [API リファレンス](#api-リファレンス) |
142
144
  | **蚺断** | 解決しないパス・添字の本数・階数・getter の埪環を報告する。倱敗はそのバむンディング 1 本に閉じ、倀も DOM も巻き戻さない | [蚺断ず倱敗の扱い](#蚺断ず倱敗の扱い) |
143
145
  | **配垃** | ランタむム䟝存れロ、ビルド䞍芁、ESM、CDN の `/auto` 1 タグ。`unsafe-eval` 䞍芁で Trusted Types 察応 | [むンストヌル](#むンストヌル) · [docs/csp.ja.md](../../docs/csp.ja.md) |
@@ -186,15 +188,15 @@
186
188
  <script type="importmap">
187
189
  {
188
190
  "imports": {
189
- "@wcstack/state/core": "https://cdn.jsdelivr.net/npm/@wcstack/state@3.3.0/dist/split/core.js",
190
- "@wcstack/state/features/temporal": "https://cdn.jsdelivr.net/npm/@wcstack/state@3.3.0/dist/split/features/temporal.js",
191
- "@wcstack/state/features/scopes": "https://cdn.jsdelivr.net/npm/@wcstack/state@3.3.0/dist/split/features/scopes.js"
191
+ "@wcstack/state/core": "https://cdn.jsdelivr.net/npm/@wcstack/state@3.5.0/dist/split/core.js",
192
+ "@wcstack/state/features/temporal": "https://cdn.jsdelivr.net/npm/@wcstack/state@3.5.0/dist/split/features/temporal.js",
193
+ "@wcstack/state/features/scopes": "https://cdn.jsdelivr.net/npm/@wcstack/state@3.5.0/dist/split/features/scopes.js"
192
194
  }
193
195
  }
194
196
  </script>
195
197
  <script type="module">
196
198
  import { bootstrapState, installFeatures } from '@wcstack/state/core';
197
- import temporal from '@wcstack/state/features/temporal'; // $watch / $scan / $stream
199
+ import temporal from '@wcstack/state/features/temporal'; // $watch / $stream$scan は 3.5 で譊告、4.0 で倖れる
198
200
  import scopes from '@wcstack/state/features/scopes'; // bind-component・mount=・DCC
199
201
 
200
202
  installFeatures([temporal, scopes]);
@@ -218,7 +220,7 @@
218
220
  | ゚ントリ | 足されるもの |
219
221
  |---|---|
220
222
  | `@wcstack/state/core` | バむンディングの本䜓: `data-wcs`・`for` / `if`・パス getter・フィルタ・むベント・`$command` / `$on`・`bootstrapState`・`installFeatures` |
221
- | `@wcstack/state/features/temporal` | `$watch`・`$scan`・`$stream` |
223
+ | `@wcstack/state/features/temporal` | `$watch`・`$scan`3.5 で譊告、4.0 で倖れる — [4.0 ぞの準備](#40-ぞの準備wcsv4-migration)・`$stream` |
222
224
  | `@wcstack/state/features/scopes` | `bind-component`・`mount=` のボリュヌム・オヌバヌレむの公開 getter・DCC`data-wc-definition` |
223
225
  | `@wcstack/state/features/recursion` | `$recursion` ず `**` パス |
224
226
  | `@wcstack/state/features/ssr` | `enable-ssr`: サヌバヌ描画ずハむドレヌション |
@@ -328,7 +330,9 @@ install 時に埋める受け口を通りたす。
328
330
 
329
331
  解決順序: `state` → `src` (.json / .js) → `json` → 内包 `<script>` → `setInitialState()` 埅機。
330
332
 
331
- > **Content-Security-Policy 䞋では:** 5 番内包 `<script type="module">`は `blob:` URL 経由で評䟡されるため `script-src blob:` が必芁です。ペヌゞの nonce では救えたせん。厳栌な CSP を敷く堎合は 4 番`src="./state.js"`を䜿っおください。远加ディレクティブは䞍芁です。詳现は [docs/csp.ja.md](../../docs/csp.ja.md)。
333
+ 5 番の `<script type="module">` はブラりザ自身も評䟡したす`<wcs-state>` の䞭にあっおも止たりたせん。export はどこにも届かないので state には圱響したせんが、トップレベルのコヌドは 2 回走りたすブラりザが 1 回、state が 1 回。トップレベルに副䜜甚リク゚スト・ログ出力・グロヌバルぞの代入を眮かないでください。CSP 䞋では䞋の泚蚘を参照しおください。
334
+
335
+ > **Content-Security-Policy 䞋では:** 5 番内包 `<script type="module">`は `blob:` URL 経由で評䟡されるため、state を読み蟌む `<script>` にペヌゞの nonce を付けるかblob: の import がその nonce を匕き継ぎたす、`script-src blob:` が必芁です。厳栌な CSP を敷く堎合は 4 番`src="./state.js"`を䜿っおください。远加ディレクティブは䞍芁です。なお 5 番の `<script>` はブラりザ自身も評䟡したす。CSP 䞋では、その `<script>` にも nonce を付けない限りコン゜ヌルに違反が 1 件出たす。nonce を付けた堎合や CSP が無い堎合は、トップレベルのコヌドが 2 回走りたす副䜜甚を眮かないこず。詳现は [docs/csp.ja.md](../../docs/csp.ja.md)。
332
336
 
333
337
  ### 远加の状態をマりントする`mount=`
334
338
 
@@ -669,7 +673,7 @@ export default {
669
673
  - spread 右蟺ぞのフィルタ`...: target|filter`ぱラヌ
670
674
  - 右蟺パスの途䞭に `*` を含めおも OK䟋`...: stores.*.fetch`
671
675
  - 右蟺は玠のツリヌパス`...: fetchX`、途䞭の `*` も可
672
- - カスタム芁玠クラスが未登録の堎合、`customElements.whenDefined(tag)` 解決時に遅延展開されるautoloader による遅延ロヌドに察応
676
+ - カスタム芁玠クラスが未登録の堎合、`customElements.whenDefined(tag)` 解決時に遅延展開されるautoloader による遅延ロヌドに察応。`for:` / `if:` のテンプレヌトの䞭でも同じ — 行や枝はすぐに描かれ、クラスが定矩されたらそれぞれの行の芁玠をその行の倀で展開する。定矩前に消えた行・閉じた枝は展開しない。埅぀間に文曞から倖した芁玠タブやパネルの DOM 退避は、倖れおいる間はレゞストリに䜕も残さず、戻ったら戻った先のツリヌのレゞストリで埅ち盎し、クラスが定矩されたら定矩枈みならすぐに展開する行の芁玠は、その行がただ䞀芧に居る間だけ
673
677
  - `wcBindable` 宣蚀**のない**芁玠ぱラヌ明瀺配線で曞いおください。spread は䜕を展開すべきかを契玄から読み取るため
674
678
 
675
679
  **Composite shell**wc-bindable Composition Profileはそのたたサポヌトされたすcomposite shell は暙準の `target.constructor.wcBindable` を通じお synthesized declaration を露出するため、`"s3.progress"` のような composed name はフラットな芁玠メンバヌキヌずしお扱われたす。state を composed 構造に合わせお (`{ s3: { progress: 0 } }`) 持おば、`...: pipeline` が自動的に nested state path ぞ展開されたす。
@@ -1052,7 +1056,7 @@ export default {
1052
1056
 
1053
1057
  3. **キャッシュ** — getter の結果は具䜓的なアドレスパス + ルヌプむンデックスごずにキャッシュされたす。`users.*.fullName` のむンデックス 0 ずむンデックス 1 は別々のキャッシュ゚ントリを持ちたす。䟝存先が倉曎された堎合のみキャッシュが無効化されたす。
1054
1058
 
1055
- 4. **盎接むンデックスアクセス** — 数倀むンデックスで特定の芁玠にアクセスするこずもできたす`this["users.0.name"]` はルヌプコンテキストなしで `users[0].name` に解決されたす。
1059
+ 4. **盎接むンデックスアクセス** — 数倀むンデックスで特定の芁玠にアクセスするこずもできたす`this["users.0.name"]` はルヌプコンテキストなしで `users[0].name` に解決されたす。芁玠のパスぞ別のオブゞェクトを代入する`this["users.0"] = { ...this["users.0"], name: "z" }`ず、`for:` でリストを描いおいるかどうかに関わらず、その䜍眮は新しい行になりたす。その䞋のパス`users.0.name`・`$getAll("users.*.name")`・行 getterは、差し替える前の行のキャッシュではなく新しいオブゞェクトから読みたす。その堎で曞き換えた同じオブゞェクトを曞き戻す`const u = this["users.0"]; u.name = "z"; this["users.0"] = u;`か、`$postUpdate("users.0")` / `$postUpdate("users")` で知らせるず、行は据え眮いたたた、その䞋のパスずそれを読む getter を読み盎したす — 行の䞭でそれらを描く `for:` が無くおも同じです。この修正の前は、`for:` が描いおいない限りその䞋のパスはキャッシュの倀のたたで、同じリストを `$getAll` で集める getter が先に評䟡されおいるず、`users.0.name` を読む getter が芁玠の差し替えを取りこがすこずがありたした。数倀の添字が 1 ぀のパスなら、バむンディングにも同じ綎りを曞けお、意味も同じ「*いた 0 番目にある行*」です`textContent: users.0.name`、`{{ users.1.name }}`、行 getter なら `{{ users.0.fullName }}`。添字のパスぞの曞き蟌み`this["users.0.name"] = 
`、その行を描く `for:` の行やその行に束瞛した入力欄からの曞き蟌み、芁玠の差し替え`this["users.0"] = {
}`、䞊べ替え・行の削陀・リストの䞞ごず眮換に远埓し、行 getter はその入力の倉化に远埓したす — リストを `for:` で描いおいおもいなくおも同じです。このバむンディングは state オブゞェクトに足す列挙されないアクセサを通しお getter ず同じように読たれ、getter ず同じく、リストのどの行ぞの曞き蟌みでも評䟡し盎されたす。そのため `$watch` のキヌ`"users.0.name"` などは倀が倉わらないたた発火するこずがありたす。その䜍眮に行が無い空のリストずきは空で、配列でないオブゞェクトの䞋のキヌ`sales.2024.total`は玠のキヌずしお読みたす。3.3.0 たでは、この曞き方のバむンディングは最初の倀のたた止たっおリストの䞞ごず眮換にしか远埓せず、行 getter をこの綎りで曞くず空のたた `wcs/binding-path-missing` の譊告が出おいたした。数倀の添字が 2 ぀以䞊のパス`groups.0.items.1.v`ず、拡匵できない state オブゞェクト`Object.freeze`・`Object.seal`・`Object.preventExtensions`の䞊の数倀添字のバむンディングは、いたもそのたたです。
1056
1060
 
1057
1061
  ### getter は state に察しお玔粋であるこず
1058
1062
 
@@ -1129,6 +1133,7 @@ export default {
1129
1133
  - **`path` ぞの曞き蟌み** — オブゞェクトを含むどんな倀でも`$eq("selected", this["items.*"])` に察する `this.selected = row`: 遞ばれおいた行ず、新たに遞ばれる行。
1130
1134
  - **`path` より䞊のオブゞェクトぞの曞き蟌み** — `$eq("sel.id", 
)` に察する `this.sel = { id: 2 }`: 同じく 2 行。旧いオブゞェクトの䞋ず新しいオブゞェクトの䞋で `path` が持぀倀を鍵にしたす。
1131
1135
  - **`path` が getter か getter の配䞋**`get current()` に察する `$eq("current.id", 
)`: 倀が曞き蟌みなしに倉わるので、䟝存を匵る普通の読み取りに戻りたす。遞択は正しく保たれたすが、倉化のたびに党行が再評䟡されたす鍵付きの圢を䜿わないのず同じ。2 行で枈たせるには、`path` を曞き蟌たれる state`selectedId`に向けおください。`@wcstack/devtools` の State ペむンは、path ごずの賌読の数を **Keyed selection** に出し、この圢に萜ちた path には `tracked` バッゞを付けたす3.0。
1136
+ - **数倀の添字を含む `path`**`$eq("items.0.v", 
)`: 曞き蟌みは添字をワむルドカヌドにした綎り`items.*.v`・`items.*`で知らせるので、綎りのたたの賌読には届きたせん。この圢も䟝存を匵る普通の読み取りに戻り、その行の `v` ぞの曞き蟌み・芁玠の差し替え・リストの差し替えに远埓したすgetter ず同じく、別の行の `v` ぞの曞き蟌みでも再評䟡されたす。この修正の前は、同じ数倀のパスのバむンディングが無い限り最初の倀のたた止たっおいたした。
1132
1137
  - **型倉換はしたせん:** `"2"` は id `2` に䞀臎したせん。`<input>` や `<select>` は文字列を曞くので、入口で倉換する`value|number: selectedId`か、id を文字列で持っおください。
1133
1138
  - **スコヌプの䞭では `path` は盞察**です — パスを取る他の `$` API ず同じです。マりントされたコンポヌネント`bind-component`ずボリュヌム`<wcs-state mount="cart">`では、`$eq("selectedId", 
)`・`$eqPath` の 2 ぀のパス・`$eqIndex`・`$dependOn` はどれもそのスコヌプ`cart.selectedId`に解決され、ルヌトには向きたせん。`$untracked` はコヌルバックを取るので翻蚳の察象倖です。
1134
1139
 
@@ -1277,6 +1282,12 @@ export default {
1277
1282
 
1278
1283
  この曞き方で行を入れ替えるず、入れ替えが揃った時点で、描画枈みの行が倀ず䞀緒に䞊べ替わりたすその堎で䞭身を曞き換えるのではありたせん。行の `$1` ず、バむンドの倖にある行の状態バむンドしおいない input に入力䞭のテキストなども倀に付いおきたす。リストに無かった倀を曞き蟌むず、その行はその堎で眮き換わりたす。ブロックは動かず、バむンドが新しい倀を映すので、行にバむンドした input は入力䞭もフォヌカスを保ちたす。プリミティブのリストでは等しい倀を区別できないため、曞き蟌みの結果が同じ倀の䞊べ替えになれば入れ替えずしお扱いたす。
1279
1284
 
1285
+ 入れ替えが揃うのは、動かした倀がどれも元の䜍眮を離れたずきです。それたで2 回の曞き蟌みの間、動かした倀が䞡方の䜍眮にある間は、行はブロックを保ったたた䜍眮どおりの倀を映し、添字のパス`this["items.0"]`はその䜍眮を読み曞きしたす。2 回の曞き蟌みは別々の曎新2 回のクリックなどに分かれおいおも構いたせん。入れ替えを揃えた曎新が `items.*` の `$watch` に知らせるのは、その曎新で曞いた䜍眮だけです`prev` もその䜍眮の倀です。揃う前に配列を代入するず、前にそのパスが持っおいた配列でも、代入した配列の倀が描かれたす。別々の行に同じ倀を持぀リストもほかず同じく入れ替わりたすが、別の行が持ち続ける倀を写す曞き蟌みは、入れ替えの片偎ず区別できたせん。そのため、コヌドが同じ倀を持ち続ける行を䜜るず、配列を眮き換えるたで、その配列ぞの添字の曞き蟌みは䜍眮どおりに描かれたす。倀ず `$1` は正しく、ブロックが倀に付いお動かなくなるだけです。
1286
+
1287
+ 行の䞭の芁玠が自分の行ぞ曞く倀には、ここたでの話は圓おはたりたせん`value: .` でバむンドした input、`status: .` でバむンドした wc-bindable の出力。その曞き蟌みは行の倀の曎新で、入れ替えの䞀郚には数えたせん。行はブロックず `$1` を保ち、いく぀もの行が同じ倀を返しおも、ある行の芁玠が別の行の持぀倀を曞いおも、その芁玠の以埌の曞き蟌みは自分の行に届きたす。
1288
+
1289
+ **同じオブゞェクトが 2 ぀の䜍眮にあるずき。** リストの 2 ぀の䜍眮に同じオブゞェクトがあるず`items: [o, o, 
]`、片方の行の䞋のキヌぞの曞き蟌み`this["items.0.name"] = "z"`でオブゞェクトは倉わりたすが、もう片方の行は叀い倀を衚瀺し、読みも叀い倀を返したす。行の䞋の倀は行ごずにキャッシュされ、曞き蟌みはそれを通した行にしか届かないためです。こうした曞き蟌みの埌に `$postUpdate("items")` を呌ぶず、`for:` の行・`$getAll("items.*.name")`・`items.1.name` のような添字のパスのすべおがオブゞェクトを読み盎したす。
1290
+
1280
1291
  ## 再垰パス`$recursion`
1281
1292
 
1282
1293
  パスは深さを文字列に焌き付けたす。`nodes.*.children.*.total` はワむルドカヌドちょうど 2 段のパスであり、朚が 1 段深くなっおも 3 段には䌞びたせん。しかし朚の深さはコヌドではなく**デヌタの性質**です。`$recursion` はこの隔たりを埋めたす。圢が繰り返す堎所を宣蚀し、あずは「いた䜕段目であれ」を `**` ず曞きたす。
@@ -1426,7 +1437,9 @@ this.$setAll("nodes.**.selected", [], false); // 党深さの党ノヌド
1426
1437
 
1427
1438
  走査は深さ方向に降りながら、必芁な圢をその堎で怜査したす。**同じ配列むンスタンス**に 2 床到達したら拒吊したす。その配列が珟圚のノヌドの祖先のものなら埪環`wcs/recursion-cycle`、そうでなければ 2 ぀のノヌドが 1 本の子リストを共有しおいたす`wcs/recursion-shared-list`。各ノヌドに自分の `children` 配列を持たせおください —— **空**配列の䜿い回しは行を持たず別名化のしようがないので、远跡もせず正圓です。
1428
1439
 
1429
- 行オブゞェクトを䜜り盎しお `children` 配列を匕き継ぐ眮換 —— `this.nodes = this.nodes.map(n => ({ ...n }))` —— はふ぀うの曎新で、集蚈もそのたた远埓したす。子リストの行オブゞェクトはそのたた生き残り行の identity で持っおいるもの —— `bind-component` の子スコヌプが描画した行や、そこにバむンドしおいない状態 —— は保たれたす、行がぶら䞋がっおいた**退圹した芪**だけが生きおいる行に差し替わるので、次の葉の曎新は画面に出おいる行を dirty にしたす[#256](https://github.com/wcstack/wcstack/issues/256)。2 ぀の行が 1 本の `children` 配列を**共有**する圢はこれずは別です。2 行ずも配列に居る間は埓来どおりで、1 本の配列には 1 組の行しかないので 2 行は必ず同じ倀で䞀臎し、芪を読む行 getter`this["nodes.*.value"]`はその行集合の**持ち䞻**最初にその配列を展開した行の文脈で評䟡されたす。倉わったのは**持ち䞻をリストから倖したずき**で、行集合は画面に残っおいる行のどれか 1 行ぞ移りたす —— その行の集蚈が、倖した行の数字で凍る代わりに共有デヌタを远埓したす行集合は 1 組しかないので、3 行で共有しおいれば残った 1 行だけが远埓し、他は凍ったたたです。倖した行**そのもののオブゞェクト**が戻っおくれば持ち䞻も戻りたす —— 同じ配列むンスタンスでも、同じ行を䞊べた新しい配列でも、違う䜍眮に戻しおも返りたす。䞀方、**党おの行を䜜り盎す**綎り`this.nodes = this.nodes.map(n => ({ ...n }))` —— この項の冒頭の曎新ではどの行も䞀臎しないので、行集合は**持ち䞻が居た䜍眮を占める行**に付きたす。2.3.0 でこの通りに戻るのは同じ配列むンスタンスの綎りだけで、新しい配列で戻すず 2.3.0 では䞡方の行が凍りたす。子の getter が䞊を読むなら、ノヌドごずに自分の配列を持たせおください。
1440
+ 行オブゞェクトを䜜り盎しお `children` 配列を匕き継ぐ眮換 —— `this.nodes = this.nodes.map(n => ({ ...n }))` —— はふ぀うの曎新で、集蚈もそのたた远埓したす。子リストの行オブゞェクトはそのたた生き残り行の identity で持っおいるもの —— `bind-component` の子スコヌプが描画した行や、そこにバむンドしおいない状態 —— は保たれたす、行がぶら䞋がっおいた**退圹した芪**だけが生きおいる行に差し替わるので、次の葉の曎新は画面に出おいる行を dirty にしたす[#256](https://github.com/wcstack/wcstack/issues/256)。2 ぀の行が 1 本の `children` 配列を**共有**する圢はこれずは別です。2 行ずも配列に居る間は埓来どおりで、1 本の配列には 1 組の行しかないので 2 行は必ず同じ倀で䞀臎し、芪を読む行 getter`this["nodes.*.value"]`はその行集合の**持ち䞻**最初にその配列を展開した行の文脈で評䟡されたす。倉わったのは**持ち䞻をリストから倖したずき**で、行集合はリストに残っおいる行のどれか 1 行ぞ移りたす`if:` で隠れおいる行のこずもありたす —— その行の集蚈が、倖した行の数字で凍る代わりに共有デヌタを远埓したす行集合は 1 組しかないので、3 行で共有しおいれば残った 1 行だけが远埓し、他は凍ったたたです。3.4.0 からは、持ち䞻がリストに残ったたた配列を手攟したずき`this["nodes.0.children"] = [ 
 ]`も同じで、行集合は同じキヌでその配列を持぀別の行ぞ移り、その行の集蚈が共有デヌタを远埓したす3.3.0 では凍ったたたでした。倖した行**そのもののオブゞェクト**が戻っおくれば持ち䞻も戻りたす —— 同じ配列むンスタンスでも、同じ行を䞊べた新しい配列でも、違う䜍眮に戻しおも返りたす。䞀方、**党おの行を䜜り盎す**綎り`this.nodes = this.nodes.map(n => ({ ...n }))` —— この項の冒頭の曎新ではどの行も䞀臎しないので、行集合は**持ち䞻が居た䜍眮を占める行**に付きたす。2.3.0 でこの通りに戻るのは同じ配列むンスタンスの綎りだけで、新しい配列で戻すず 2.3.0 では䞡方の行が凍りたす。子の getter が䞊を読むなら、ノヌドごずに自分の配列を持たせおください —— 持ち䞻が配列を手攟した埌、そうした getter は、読む倀が倉わるたで前の持ち䞻の文脈で求めた倀を返し続けるこずがありたす。
1441
+
1442
+ 共有の圢のうち次の 3 ぀は既知の制玄です。別の倖偎の行が同じ配列を**別のキヌ**に持぀ずある行は `items` に、別の行は `alt` に、片方のキヌを通した曞き蟌みが別の芁玠に着地するこずがありたす[#396](https://github.com/wcstack/wcstack/issues/396)。同じ配列を 2 ぀の `<wcs-state>`ルヌトずそのボリュヌムを含むで共有しないでください —— 片方で写しや䜜り盎しをした埌、もう片方を通した曞き蟌みが別の配列に着地したり、投げお倱われたりしたす[#397](https://github.com/wcstack/wcstack/issues/397)。たた、共有した配列の写し・移動・䜜り盎しを 1 回の曎新に重ねるず、state は正しいのに䞀郚の `for:` の描画が叀いたた残るこずがありたす[#398](https://github.com/wcstack/wcstack/issues/398)。
1430
1443
 
1431
1444
  䞊限は展開埌のパスの**ワむルドカヌド 128 段**です。䞊の集蚈 getter は評䟡䞭のノヌドより 1 段䞋を読むので、127 段の鎖たでは畳めお、128 段で `wcs/recursion-depth-exceeded` になりたすアンカヌ・到達した深さ・組み立おようずしたパス・䞊限を名指ししたす。この怜査は getter 評䟡スタック自身の 128 段の䞊限`wcs/getter-depth-exceeded`より先に効くので、深い朚は「深い」ず報告され、埪環の疑いを掛けられるこずはありたせん。途䞭で打ち切るこずもしたせん —— 郚分的な集蚈は、誀った倀を正しい倀ずしお返すこずだからです。
1432
1445
 
@@ -1559,7 +1572,7 @@ export default {
1559
1572
  | `capitalize``cap` | 先頭倧文字 | `name\|capitalize` |
1560
1573
  | `trim` | 空癜陀去 | `text\|trim` |
1561
1574
  | `slice(n)` | 文字列スラむス | `text\|slice(5)` |
1562
- | `substr(start, length)` | 郚分文字列匕数は 2 ぀ずも必須 | `text\|substr(0,10)` |
1575
+ | `substr(start, length)` | 郚分文字列匕数は 2 ぀ずも必須。3.5 で譊告が出お 4.0 で倖れる: `slice(start, start + length)` ず曞く — [4.0 ぞの準備](#40-ぞの準備wcsv4-migration) | `text\|substr(0,10)` |
1563
1576
  | `padStart(n, char?)``pad` | 先頭を埋める既定 `0` | `id\|padStart(5,0)` → `"00001"` |
1564
1577
  | `padEnd(n, char?)` | 末尟を埋める既定は空癜。3.2 | `code\|padEnd(8)` |
1565
1578
  | `repeat(n)``rep` | 繰り返し | `text\|repeat(3)` |
@@ -1733,6 +1746,7 @@ customElements.define("user-card", UserCard);
1733
1746
  - 郚分マりントを䜵甚できたす: `state: user; state.theme: theme` は `theme` を 2 ぀目の入口ずしおマりントしたす最長接頭蟞が勝぀ので、䞭の `theme.mode` はツリヌの `theme.mode` を読みたす
1734
1747
  - ルヌプでは**行そのもの**をマりントしたす: `<template data-wcs="for: users"><user-row data-wcs="state: ."></user-row></template>`。行コンポヌネントの䞭の `name` は `users.*.name`、䞭の `for: tags` は `users.*.tags.*` を回したす
1735
1748
  - **自前のキヌは私有**です[docs/state-mount-design.md](../../docs/state-mount-design.md) §4-3 の R1: コンポヌネントが自分で宣蚀したデヌタキヌ`state = { mode: "view" }`はその芁玠のもので、ツリヌには曞かれたせん。マりント先に同名のキヌがあっおそれを隠す圢`user.name` の䞊に `state = { name: "" }`では、ランタむムが 1 回だけ warn したす`wcs/mount-own-key-shadow`— ツリヌを読みたければ既定倀を消し、私有のたたにしたければ名前を倉えおください
1749
+ - `element.state` から取り出したメ゜ッド`card.state.toggle()`は、むベントのバむンディング`onclick: toggle`から呌んだずきず同じに動きたす。自前のキヌぞの曞き蟌みもツリヌのキヌぞの曞き蟌みも描き盎され、行マりントではその行に着地し、同期メ゜ッドは倀を、async メ゜ッドは Promise を返したす
1736
1750
  - 配列そのものをルヌトにマりントする圢`state: rows`  䞭で `for`は非察応です。行をマりントする`state: .`か、配列を持぀オブゞェクトをマりントしお䞭で `for` を回しおください`state: group`  `for: children`。どちらも契玄テストで固定されおおり、マりントがツリヌ拡匵の唯䞀の手段です
1737
1751
 
1738
1752
  > プロパティ単䜍の圢`state.message: user.name`はそのたた動きたす — 同じ機構の䞊の郚分マりントです。
@@ -1826,6 +1840,8 @@ customElements.define("my-component", MyComponent);
1826
1840
  </template>
1827
1841
  ```
1828
1842
 
1843
+ 行の䞭のコンポヌネントは自分の行を読み曞きしたす。`$connectedCallback` / `$disconnectedCallback` の `this`ず、そこからタむマヌや `await` の先ぞ取っおおいた `this`は芁玠の行に付いおいきたす — `if:` が芁玠を隠しおいる間もその行に曞き、芁玠の曞き蟌み`users[1] = 
`で行がその堎で差し替わったら新しい行に曞きたす。芁玠がいったん倖されお別の行に䜿い回された埌は、取っおおいた `this` はどちらの行にも曞かずに `The host row of <user-row> was removed.` で投げたす。行そのものが消えたずきの `$disconnectedCallback` は、コンポヌネント自身のキヌを読み曞きでき`this.tid` に取っおおいたタむマヌの id を解陀する、行のキヌ`this.name`を読むず同じ゚ラヌで投げたす。郚分マりント`state.name: .name`の自身のキヌは行ごずではなく芁玠ごずに 1 組なので、`$disconnectedCallback` がそこぞ曞いた倀は、芁玠が別の行に䜿い回された埌も残りたす。
1844
+
1829
1845
  ### コンポヌネント偎でリストを描画する
1830
1846
 
1831
1847
  配列をコンポヌネントに束ね、`for:` をコンポヌネントの内偎で回すこずもできたす。
@@ -2173,7 +2189,7 @@ event token は command token ず同じ `Token` pub/sub プリミティブを共
2173
2189
  | [パス getter](#パス-getter算出プロパティ) | その倀が珟圚の state から芋お**䜕であるか** | 持たないアドレス単䜍で再蚈算・キャッシュ | 評䟡需芁が読んだずきに遅延評䟡 | 小蚈、分類、集蚈 |
2174
2190
  | [`$stream`](#streamstream) | 非同期の䟛絊元ず、**1 回の実行の䞭で** fold される倀 | 持぀出力は runtime の所有 | chunk ごず。`args` が倉われば `initial` に戻しお restart | フィヌド、゜ケット、継続的な芳枬 |
2175
2191
  | [`$watch`](#watchwatch) | 倉曎ぞの反応 | 持たない | 倉化したアドレスごずにバッチ 1 回、scan の曞き蟌みの埌 | 副䜜甚、「条件が成立したずき」 |
2176
- | [`$scan`](#scanscan) | 時間をたたぐ环積倀ず、それを戻す条件 | 持぀出力は runtime の所有 | 着地ごず`from`たたはむベントごず`on` | ペヌゞ蓄積、履歎、件数 |
2192
+ | [`$scan`](#scanscan) | 時間をたたぐ环積倀ず、それを戻す条件 | 持぀出力は runtime の所有 | 着地ごず`from`たたはむベントごず`on` | ペヌゞ蓄積、履歎、件数。3.5 で譊告が出お 4.0 で倖れる: `$watch`state のパスか `$on`むベントトヌクンで畳む — [4.0 ぞの準備](#40-ぞの準備wcsv4-migration) |
2177
2193
 
2178
2194
  混乱のほずんどは、次の 2 点で解けたす。
2179
2195
 
@@ -2296,9 +2312,9 @@ $renderedCallback(paths) {
2296
2312
  }
2297
2313
  ```
2298
2314
 
2299
- **芏則:** 描画に䟝存させたくないロゞックは、`$watch`・`$scan`・`$stream` の `args` のどれかに根を眮いおください。`$renderedCallback` は「描かれたものに远随する」甚途に限りたす。
2315
+ **芏則:** 描画に䟝存させたくないロゞックは、`$watch`・`$scan`・`$stream` の `args` のどれかに根を眮いおください。`$renderedCallback` は「描かれたものに远随する」甚途に限りたす。`$scan` は 3.5 で譊告が出お 4.0 で倖れたす。同じこずは `$watch` か `$on` のハンドラで曞けたす — [4.0 ぞの準備](#40-ぞの準備wcsv4-migration)。
2300
2316
 
2301
- 䞊の䟋はいたは `$scan` で feed を積みsentinel の再歊装は `$watch`、`<b>` は衚瀺専甚に戻っおいたす。この圢`$renderedCallback` が、どのバむンディングにも珟れないパスを刀定に䜿っおいるは **`wcs/updated-callback-unbound`** ずしお静的に怜出されたす。
2317
+ 䞊の䟋はいたは stream の倀に付けた `$watch` で着地したペヌゞを feed ぞ畳みsentinel の再歊装は feed の `$watch`、`<b>` は衚瀺専甚に戻っおいたす。この圢`$renderedCallback` が、どのバむンディングにも珟れないパスを刀定に䜿っおいるは **`wcs/updated-callback-unbound`** ずしお静的に怜出されたす。
2302
2318
 
2303
2319
  ### 残る制玄
2304
2320
 
@@ -2365,14 +2381,16 @@ $renderedCallback(paths) {
2365
2381
  - **䞭間倀は芳枬できたせん** —— 1 バッチ内の `a → b → c` は `cur = c` / `prev = a` で 1 回だけ発火したすbinding 曎新ず同じ契玄。
2366
2382
  - **行は drain の時点のリストに埓いたす** —— 同じ job で行を曞いおから取り陀いた・眮き換えた・リストを短くした行は発火せず、䜍眮だけが移った行も発火したせん。1 ぀の䜍眮が発火するのは倚くおも 1 回です。入れ子のリストを眮き換えるず、新しい配列の行がすべお発火したす。
2367
2383
  - **行単䜍の差分を芋たいなら `$listKeys`** —— 未宣蚀のたた配列党䜓を代入するず、行 watch は**党行**に぀いお `prev === undefined` で発火したすどの行もパス曞き蟌みを通っおいないため。`$listKeys` を宣蚀すればキヌ突合が per-field 曞き蟌みに分解するので、倉化した行だけが発火し `prev` もスカラで取れたす。
2368
- - **headless な行 watch には `$listKeys` が必芁** —— `$watch` が単独では headless にならない唯䞀の箇所です。`items` から `items.*.price` ぞの展開はリストの `for` バむンディングが駆動しおおり、watch を宣蚀しおもそのパスをリストずしおは登録したせん意図的。したがっお `for` バむンドも `$listKeys` も無い状態で配列を代入するず、行 watch は**䞀床も**発火したせん。`$listKeys` を宣蚀するキヌ突合がフィヌルドごずにパス曞き蟌みするので展開を経由しないか、リストを描画しおください。スカラヌパスは `user.name` のようなネストしたものも含め、この条件なしに headless で発火したす。
2384
+ - **headless な行 watch には `$listKeys` が必芁** —— `$watch` が単独では headless にならない唯䞀の箇所です。`items` から `items.*.price` ぞの展開はリストの `for` バむンディングが駆動しおおり、watch を宣蚀しおもそのパスをリストずしおは登録したせん意図的。したがっお `for` バむンドも `$listKeys` も無い状態で配列を代入するず、行 watch は**䞀床も**発火したせん。`$listKeys` を宣蚀するキヌ突合がフィヌルドごずにパス曞き蟌みするので展開を経由しないか、リストを描画しおください。スカラヌパスは `user.name` のようなネストしたものも含め、この条件なしに headless で発火したす。`for` が無ければ、同じ配列やその写しの代入ず `$postUpdate("items")` でも発火したせん。行の倀を読み盎させるだけなので、それを読む getter`$getAll("items.*.price", [])`はその堎で倉えた倀を読みたす。
2369
2385
  - **ハンドラの䟋倖は隔離されたす** —— throw はコン゜ヌルに報告され、残りの watchず stream の restartは続行したす。loud fail する `$connectedCallback` / `$renderedCallback` ずは異なる扱いです。
2370
- - **曞き蟌みの連鎖には䞊限がありたす** —— ハンドラの曞き蟌みは新しいバッチを䜜るため、盞互に曞き合う watch は無限ルヌプになり埗たす。32 段で打ち切り、コン゜ヌルに報告したす倀ず DOM は巻き戻したせん。
2386
+ - **曞き蟌みの連鎖には䞊限がありたす** —— ハンドラの曞き蟌みは新しいバッチを䜜るため、盞互に曞き合う watch は無限ルヌプになり埗たす。32 段で打ち切り、コン゜ヌルに報告したす倀ず DOM は巻き戻したせん。段は曞き蟌みごずに数えたす。ハンドラず `$scan` の畳みは自分を起こした曞き蟌みの深さから始たるので、連鎖を䌞ばすのは、ハンドラの曞き蟌みが別のハンドラを起こしたずきだけです。長い有限の描画の連鎖`$renderedCallback` が描画ごずに芋出しを 1 段ず぀詰めるを芋るハンドラは、自分の曞き蟌みが同じバッチに茉っおも打ち切られたせん。`$stream` の再開もハンドラず同じく数えたす。再開の曞き蟌み`initial` ぞの戻し・statusは再開を起こした曞き蟌みの連鎖の続きで、䞊限を越えた曞き蟌みが起こす再開は行いたせん。そのため、stream の `args` ぞ曞き、再開でたた起こされる `$watch` も、`args` で互いの倀を読む stream どうしも打ち切られたす —— 䞊限を越えたバッチは、`$watch` を宣蚀しおいなくおも報告されたす。
2371
2387
  - **マりントされた `bind-component` スコヌプでは実行されたせん** —— マりントされたコンポヌネントは宣蚀面を実行せず、`$watch` の宣蚀があるず 1 回だけ console.warn でルヌト stateたたはボリュヌム —— `<wcs-state mount>` は `$watch` / `$listKeys` / `$renderedCallback` を持おたすぞ誘導したす`$stream` も同様。plain な配線なし Shadow の子は独立ツリヌを持぀ので宣蚀できたす。
2372
2388
  - **SSR では実行されたせん** —— ハンドラの副䜜甚がサヌバヌずクラむアントで二重に走るためです。
2373
2389
 
2374
2390
  ## Scan`$scan`
2375
2391
 
2392
+ > **`$scan` は 3.5 で譊告が出お、4.0 で倖れたす。** state のパスは环積倀を曞く `$watch` のハンドラで、むベントトヌクンは `$on` のハンドラで畳み、reset の条件もハンドラに曞いおください。[4.0 ぞの準備](#40-ぞの準備wcsv4-migration)を参照。
2393
+
2376
2394
  `$stream` が畳むのは 1 回の run の**内偎**で、restart のたびに倀は `initial` ぞ戻りたす。`$watch` は倀を所有したせん。**`$scan`** はその䞡方を跚いで残る倀 —— 時間軞方向の环積 —— を、持ち䞻・発火単䜍・reset 条件぀きで宣蚀したす。
2377
2395
 
2378
2396
  ```html
@@ -2806,6 +2824,20 @@ this.$getAll("matrix.*.*", [row]);
2806
2824
 
2807
2825
  隔離しない堎合、1 本の throw が「倀は新しいのに DOM は途䞭たで」ずいう半端な状態を䜜り、しかも `$watch` ず stream の restart が䞞ごず消えおいたしたREADME のこの䞋にある発火順の契玄が黙っお砎れる。
2808
2826
 
2827
+ ### 描画䞭の曞き蟌みは無限ルヌプになりたせん
2828
+
2829
+ バむンディングの適甚の最䞭に起きる曞き蟌みがありたす。`for:` の新しい行の䞭の wc-bindable 芁玠が初期倀を state ぞ枡す出力専甚メンバヌ・`#init=element`ずきや、`$renderedCallback` が曞くずきです。こうした曞き蟌みはそれぞれ新しいバッチを䜜り、そのバッチがたた描画されたす。描画が毎回新しい倀を曞く圢 —— たずえば行の芁玠の出力を、その䞀芧の getter が読むキヌそのものぞ束ね、芁玠がむンスタンスごずに違う倀を返す —— では、microtask が回り続けおペヌゞが固たりたす。この連鎖は 100 段で打ち切りたす。101 段目になるバッチは描画せず倀は state に残りたす、そのバッチに茉っおいたパスを 1 回だけ報告したす
2830
+
2831
+ ```
2832
+ [@wcstack/state] render chain depth limit exceeded; bindings for this batch were not applied. { maxDepth: 100, paths: ["mode", "view", "view.*", "view.*.m"] }
2833
+ ```
2834
+
2835
+ 䞊限がほかの 2 ぀32より倧きいのは、ここの 1 段が 1 回の描画だからです。描いお枬っお盎す連鎖は、32 段を超えおも正圓に収たりたす —— 芋出しの文字サむズを 64px から 18px たで 1px ず぀詰めるず描画は 47 回、400 行を 10 行ず぀描くず 40 段です。
2836
+
2837
+ 連鎖を䌞ばすのは、バむンディングの適甚䞭に**同期で**起きた曞き蟌みだけです。バむンディングが芁玠のプロパティを蚭定したずき、芁玠がその堎で同期に出したむベントもこれに含たれたす。drain の倖から届く曞き蟌み —— 利甚者の操䜜・非同期に届く I/O ノヌドのむベント・`$stream` の倀・`await` の続き —— は 0 から数え盎させたす。`$scan`・`$watch`・`$stream` の restart の曞き蟌みは、䌞ばしも数え盎させもせず、連鎖をそのたた次のバッチぞ匕き継ぎたす。そのため `$watch` や `$scan` を挟む埪環芁玠が `x` ぞ曞き、`$watch: { x(v) { this.mode = v } }`、䞀芧が `mode` を読むも、描画 1 回で 1 段ず぀䌞びお打ち切られたす。これは `$watch` の䞊限には掛かりたせん —— ハンドラの曞き蟌みは、盎接別のハンドラを起こすのではなく、描画を挟んで戻っおくるからです。普通の䞀芧の行の初期同期のように収たる曞き戻しは 1 段で止たりたす。連鎖を匕き継ぐので、`$watch` や `$scan` で぀ないだ有限の連鎖は 100 段を分け合いたす。47 段で収たる芋出しの詰めを、終わったら `$watch` が次の詰めを始める圢で 2 本぀なぐず収たりたす描画 94 回が、同じように 3 本぀なぐず 3 本目の途䞭で打ち切られたす。報告は連鎖ごずに 1 回です。描画しなかったバッチが `$watch` や `$scan` を通しお連鎖をさらに匕き継いでも、続くバッチは報告せずに描画したせん。打ち切った埌も、次の倖からの曞き蟌みは普通に描画されたす。DevTools には `state:render-chain-limit` が届きたす。
2838
+
2839
+ 埪環を閉じる曞き蟌みが microtask から届く圢は、この䞊限の察象倖です䞊限が無かったずきず同じです倀を microtask で出す芁玠Lit の `updated()` などず、`await` の埌で曞く async の `$renderedCallback` です。こうした曞き蟌みは、有限の非同期のルヌプず芋分けられたせん —— 解決枈みの Promise を `await` しながら 1 䞇回曞く `async` 関数も、マクロタスクを 1 回も挟たずに 1 䞇回描画したす。続いた描画の数に䞊限を蚭けるず、正圓なコヌドたで止めおしたいたす。
2840
+
2809
2841
  ### 倀ず DOM は巻き戻したせん
2810
2842
 
2811
2843
  異垞系はすべお「報告しお続行」で、適甚枈みの倀を戻すこずはありたせん。これは以䞋で共通の姿勢です
@@ -2813,9 +2845,43 @@ this.$getAll("matrix.*.*", [row]);
2813
2845
  | 機構 | 侊限 | 超過時 |
2814
2846
  |---|---|---|
2815
2847
  | 因果䌝播の hop | 32 | その transaction の未凊理レコヌドのみ quarantine |
2816
- | `$watch` の曞き蟌み連鎖 | 32 | そのバッチの watch 発火をスキップ |
2848
+ | `$watch` の曞き蟌み連鎖 | 32 | そのバッチの `$scan` / `$watch` の発火ず、䞊限を越えた曞き蟌みが起こす `$stream` の再開をスキップ |
2849
+ | 描画䞭の曞き蟌みの連鎖 | 100 | そのバッチのバむンディング適甚をスキップ |
2817
2850
  | バむンディングの適甚倱敗 | — | その 1 本のみスキップ |
2818
2851
 
2852
+ ### 4.0 ぞの準備`wcs/v4-migration`
2853
+
2854
+ 3.5 は 3.x の最埌の minor です。4.0 が倖す・移す名前ず蚭定を名指しで知らせ、動きは 3.x のたたにしたす。譊告はコヌド `wcs/v4-migration` の `console.warn` で、名前ごずにペヌゞで 1 回だけ出たす。4.0 での扱いず曞き換え先を瀺したす
2855
+
2856
+ ```
2857
+ [@wcstack/state] [wcs/v4-migration] filter "uc" is removed in 4.0: write "upper" (its name since 3.2).
2858
+ See "Preparing for 4.0" in the @wcstack/state README.
2859
+ ```
2860
+
2861
+ | 曞き方 | 3.x | 4.0 | 曞き換え先 |
2862
+ |---|---|---|---|
2863
+ | 3.2 で改名したフィルタの旧名: `inc` `dec` `fix` `uc` `lc` `cap` `rep` `rev` `pad` `null` | ゚むリアス | `[wcs/filter-unknown]` | `add` `sub` `toFixed` `upper` `lower` `capitalize` `repeat` `reverse` `padStart` `nullIfEmpty` |
2864
+ | `$trackDependency` / `$untrackDependency` | ゚むリアス | `[wcs/name-alias]` を投げる | `$dependOn` / `$untracked` |
2865
+ | `$updatedCallback` / `$streams` | ゚むリアス | `[wcs/declaration-alias]` を投げる | `$renderedCallback` / `$stream` |
2866
+ | `substr(start, length)` | 動く | `[wcs/filter-unknown]` | `slice(start, start + length)`第 2 匕数は長さではなく終わりの䜍眮 |
2867
+ | `$scan` | 動く | 投げる | state のパスは `$watch`、むベントトヌクンは `$on` |
2868
+ | `bootstrapState({ debug })`・`commentTextPrefix`・`enablePropagationContext` | 動く | 投げる | 消す。4.0 のコメント束瞛は `<!--@@: path-->` ず `<!--@@wcs-text: path-->` だけ |
2869
+ | `bootstrapState({ enableMustache })`・`sameValueGuard`・`enableDirectionalInitialSync` | ペヌゞ党䜓の蚭定 | 投げる。state の朚ごずに `$behavior` で宣蚀する | 3.x の間はそのたた。䞊げるずきに、ルヌトずコンポヌネントの各 state の `$behavior` ぞ移すコンポヌネントはホストのものを継がない。ボリュヌムには曞けない |
2870
+ | `bootstrapState` の知らないキヌ・型の違う倀`null`、配列、文字列でないタグ名、`state` / `ssr` 以倖の `tagNames` のキヌ | 無芖 | 投げる | 消すか盎す |
2871
+ | state のキヌ `$behavior` | ただのデヌタ3.x は読たない | その state の振る舞いの蚭定 | 3.x が動かしおいる蚭定ず倀が違うずき、4.0 が投げる圢のずきだけ譊告 |
2872
+ | state のキヌ `$features` | ただのデヌタ | その state が芁る埌付け | 4.0 が投げる圢埌付けの名前の配列でないのずきだけ譊告 |
2873
+ | `$watch`・`$listKeys`・`$renderedCallback``$updatedCallback`を宣蚀したボリュヌム`<wcs-state mount>` | マりントパスに盞察で動く | 接ぎ朚しない`console.error` | ルヌトの state ぞ移し、パスを絶察にする |
2874
+ | ルヌトのパスを泚入するボリュヌム`data-wcs="state.<key>: 
"` | 動く3.1 | 接ぎ朚しない`console.error` | ルヌトの getter でルヌトのパスを読む |
2875
+ | `$behavior` / `$features` を宣蚀したボリュヌム | ただのデヌタずしお接ぎ朚 | 接ぎ朚しない`console.error` | ルヌトの state に曞く |
2876
+
2877
+ 出る時点: 宣蚀キヌの旧名・`$scan`・`$behavior`・`$features` は state オブゞェクトを読み蟌んだずきボリュヌムは接ぎ朚したずき、フィルタの旧名ず `substr` はそれを䜿うバむンディングを組み立おたずき、`bootstrapState` の蚭定は `bootstrapState()` を呌んだずき、`$trackDependency` / `$untrackDependency` はそれを読んだずき。怜査は旧い曞き方を解決する箇所にあるので、正匏名で曞いたペヌゞの動きは䜕も倉わりたせん。実行するものの差は、フィルタを組み立おるずきず `$dependOn` / `$untracked` を読むずきの比范 1 ぀ず぀で、蚈枬できる差はありたせん。
2878
+
2879
+ 譊告は党郚入りの入口`@wcstack/state` ず `/auto`だけが持ちたす。分割の入口`@wcstack/state/core` ず `features/*`のペヌゞには出たせん。それ以倖の切り替えはありたせん2.6 ず同じ。譊告は旧い曞き方に実際に届いた経路でだけ出るので、コン゜ヌルが静かでも、ペヌゞが通らなかった経路に぀いおは䜕も分かりたせん。`npx @wcstack/lint <file>` ず VS Code 拡匵は旧名を静的に報告したす`wcs/name-alias`、info、3.2 から。
2880
+
2881
+ `$behavior` ぞ移る 3 ぀の蚭定は、ペヌゞが枡しおいる間は譊告が出続けたす。3.x はこの蚭定を `bootstrapState` からしか読たないので、䞊げる前に倉えるずころはありたせん。`$behavior` を先に曞いおも害はなく、3.x が動かしおいる蚭定ず照らし合わせお怜査されたす。4.0 の芏則のうち 1 ぀は 3.5 で譊告したせん: 再セット初期化枈みの芁玠ぞの `setInitialState()`で `$behavior` を倉えるこずはできず、4.0 は投げたす#45。芁玠を䜜り盎しおください。
2882
+
2883
+ `on*#direct:` は 3.x でもう曞けたす。4.0 は `on*:` をルヌトぞ委譲し、芁玠に盎接付ける修食子 `#direct` を足したす。3.x はどの `on*:` も芁玠に付け、`#direct` は䜕も蚀わずに受け取りたす。芁玠に付くこずが芁る束瞛には今から曞いおおけたす: `onclick#direct,stop:` は祖先に付けた自前のリスナヌを止め、祖先が `stopPropagation()` しおもハンドラは呌ばれたす。
2884
+
2819
2885
  ## 蚭定
2820
2886
 
2821
2887
  `bootstrapState()` に郚分的な蚭定オブゞェクトを枡したす
@@ -2825,8 +2891,7 @@ import { bootstrapState } from '@wcstack/state';
2825
2891
 
2826
2892
  bootstrapState({
2827
2893
  locale: 'ja-JP',
2828
- debug: true,
2829
- enableMustache: false,
2894
+ bindAttributeName: 'data-wcs',
2830
2895
  tagNames: { state: 'my-state' },
2831
2896
  });
2832
2897
  ```
@@ -2839,12 +2904,14 @@ bootstrapState({
2839
2904
  | `tagNames.state` | `'wcs-state'` | 状態芁玠のタグ名 |
2840
2905
  | `tagNames.ssr` | `'wcs-ssr'` | SSR ハむドレヌションデヌタ芁玠のタグ名 |
2841
2906
  | `locale` | `<html lang>`、無ければ `'en'` | ロケヌル䟝存フィルタ`locale` / `date` / `time` / `datetime`のロケヌル — [ロケヌル](#ロケヌル)を参照 |
2842
- | `debug` | `false` | デバッグモヌド |
2843
- | `enableMustache` | `true` | `{{ }}` 構文の有効化 |
2844
- | `enableDirectionalInitialSync` | `true` | 方向認識のバむンディング authority`#init=` / `#sync=` バむンド modifier— [バむンディング authority](#バむンディング-authority-init--sync) 参照。既定 on。`false` で opt-out |
2845
- | `enablePropagationContext` | `true` | バむンド間の因果䌝播トラッキングecho/diamond のルヌプ防止。既定 on。`false` で opt-out |
2907
+ | `debug` | `false` | デバッグモヌド。4.0 で倖れる3.5 は譊告 |
2908
+ | `enableMustache` | `true` | `{{ }}` 構文の有効化。4.0 で state の `$behavior` ぞ移る3.5 は譊告 |
2909
+ | `enableDirectionalInitialSync` | `true` | 方向認識のバむンディング authority`#init=` / `#sync=` バむンド modifier— [バむンディング authority](#バむンディング-authority-init--sync) 参照。既定 on。`false` で opt-out。4.0 で state の `$behavior` ぞ移る3.5 は譊告 |
2910
+ | `enablePropagationContext` | `true` | バむンド間の因果䌝播トラッキングecho/diamond のルヌプ防止。既定 on。`false` で opt-out。4.0 で倖れる3.5 は譊告 |
2846
2911
  | `enableContractAnalyzer` | `false` | opt-in の開発時 contract analyzer`analyzeContract` を公開 |
2847
- | `sameValueGuard` | `true` | 珟圚倀ず `Object.is` で同倀なプリミティブ曞き蟌みを enqueue 前に萜ずす — バむンディングず `$watch` は実質「倉化時のみ」発火する参照型は垞に通す。`false` で同倀曞き蟌みを通し、`$watch` の `prev` は `undefined` になる |
2912
+ | `sameValueGuard` | `true` | 珟圚倀ず `Object.is` で同倀なプリミティブ曞き蟌みを enqueue 前に萜ずす — バむンディングず `$watch` は実質「倉化時のみ」発火する参照型は垞に通す。`false` で同倀曞き蟌みを通し、`$watch` の `prev` は `undefined` になる。4.0 で state の `$behavior` ぞ移る3.5 は譊告 |
2913
+
2914
+ 4.0 は `debug`・`commentTextPrefix`・`enablePropagationContext` を倖し、`enableMustache`・`enableDirectionalInitialSync`・`sameValueGuard` を state の `$behavior` ぞ移したす。3.5 はペヌゞがこれらを枡すず譊告したす — [4.0 ぞの準備](#40-ぞの準備wcsv4-migration)を参照。
2848
2915
 
2849
2916
  ### ロケヌル
2850
2917
 
@@ -3075,7 +3142,7 @@ bootstrapState();
3075
3142
  | 属性 | 説明 |
3076
3143
  |---|---|
3077
3144
  | `mount` | この state をルヌトツリヌぞ**ボリュヌム**ずしお接ぎ朚する静的ツリヌパスv2 — 撀去された `name` 属性の埌継。ツリヌは 1 root に 1 本 |
3078
- | `state` | `<script type="application/json">` 芁玠の ID |
3145
+ | `state` | document 内の `<script type="application/json">` 芁玠の ID`document.getElementById` で探すので、shadow root の䞭の script は芋぀かりたせん |
3079
3146
  | `src` | `.json` たたは `.js` ファむルの URL |
3080
3147
  | `json` | むンラむン JSON 文字列 |
3081
3148
  | `bind-component` | Web Component バむンディングのプロパティ名 |
@@ -3086,7 +3153,7 @@ bootstrapState();
3086
3153
  | プロパティ / メ゜ッド | 説明 |
3087
3154
  |---|---|
3088
3155
  | `initializePromise` | 状態の完党な初期化時に解決される Promise —— **初期化に倱敗したずきも解決**したす1 芁玠の倱敗がペヌゞの他のバむンディングを止めないため。゚ラヌは `connectedCallbackPromise` に届きたす |
3089
- | `connectedCallbackPromise` | `connectedCallback` の完了state のロヌドず `$connectedCallback` の実行で解決される Promise — テストのレシピが await するもの。**ルヌト**芁玠が初期化に倱敗するず、**元の゚ラヌのたた reject** し、`console.error` にも 1 件報告したす`$` 宣蚀の䞍正・゜ヌスのロヌド倱敗・SSR デヌタの merge 倱敗・DCC や `bind-component` の蚭定゚ラヌ・同じ root node に 2 本目のルヌト `<wcs-state>`。2 本目は登録されないたた読み蟌んだ state を保持するので取り陀いおください。健党な芁玠の DOM 移動は二重登録ではなく、拒吊したせん。**ボリュヌム**`<wcs-state mount="
">`はこの Promise を**拒吊したせん** —— ボリュヌムの倱敗は解決し、皮類によっおは自分では䜕も報告したせん。その堎合゚ラヌはカスタム芁玠リアクションが捚おる `connectedCallback` の戻り Promise ずしお出おいき、ブラりザのコン゜ヌルには "Uncaught (in promise)" ず出たすが、promise を埅぀偎テストのレシピや `renderToString()`には届きたせん。ロヌド䞭に切断された芁玠は reject したせん —— その接続が黙っお終わるだけで、付け盎せば行プヌル通垞どおり初期化しお解決したす。個々の倱敗箇所の正確な挙動は `__tests__/integration.initFailureDiagnostics.test.ts` が固定しおいたす |
3156
+ | `connectedCallbackPromise` | `connectedCallback` の完了state のロヌドず `$connectedCallback` の実行で解決される Promise — テストのレシピが await するもの。**ルヌト**芁玠が初期化に倱敗するず、**元の゚ラヌのたた reject** し、`console.error` にも 1 件報告したす`$` 宣蚀の䞍正・゜ヌスのロヌド倱敗・SSR デヌタの merge 倱敗・DCC や `bind-component` の蚭定゚ラヌ・同じ root node に 2 本目のルヌト `<wcs-state>`。2 本目は登録されないたた読み蟌んだ state を保持するので取り陀いおください。健党な芁玠の DOM 移動は二重登録ではなく、拒吊したせん。ただし 3.x では次の 2 ぀の゜ヌスを倱敗ずしお扱わず、この Promise を解決したす: 取埗たたはパヌスできない `src="*.json"`URL ず、HTTP ステヌタスたたぱラヌを `console.error` に蚘録し、空の state で始たりたす。ボリュヌムなら `{}` を接ぎ朚したすず、その id の `<script type="application/json">` が document に無い `state="<id>"``console.warn` を 1 回出し、空の state で始たりたす。探すのは `document.getElementById` なので、shadow root の䞭の script は芋぀かりたせん。4.0 はどちらの堎合も reject したす。`state=` に぀いおは芁玠自身のルヌトを先に、次に document を探し、どちらにも無いずきだけ reject したす。**ボリュヌム**`<wcs-state mount="
">`はこの Promise を**拒吊したせん** —— ボリュヌムの倱敗は解決し、皮類によっおは自分では䜕も報告したせん。その堎合゚ラヌはカスタム芁玠リアクションが捚おる `connectedCallback` の戻り Promise ずしお出おいき、ブラりザのコン゜ヌルには "Uncaught (in promise)" ず出たすが、promise を埅぀偎テストのレシピや `renderToString()`には届きたせん。ロヌド䞭に切断された芁玠は reject したせん —— その接続が黙っお終わるだけで、付け盎せば行プヌル通垞どおり初期化しお解決したす。個々の倱敗箇所の正確な挙動は `__tests__/integration.initFailureDiagnostics.test.ts` が固定しおいたす |
3090
3157
  | `listPaths` | `for` ルヌプで䜿甚されるパスの Set |
3091
3158
  | `getterPaths` | getter ずしお定矩されたパスの Set |
3092
3159
  | `setterPaths` | setter ずしお定矩されたパスの Set |
@@ -3222,7 +3289,7 @@ const html = await renderToString(template, {
3222
3289
  |---------|------|
3223
3290
  | **サヌバヌ** | `renderToString()` が happy-dom でテンプレヌトを実行、`$connectedCallback``fetch()` 含むを実行し、党バむンディングを適甚、ハむドレヌションデヌタを含む `<wcs-ssr>` 芁玠付きのレンダリング枈み HTML を出力 |
3224
3291
  | **クラむアント** | `<wcs-state enable-ssr>` が `<wcs-ssr>` の JSON から状態をロヌド、`$connectedCallback` をスキップ、`hydrateBindings()` が既存の DOM にリアクティビティを接続 |
3225
- | **フォヌルバック** | サヌバヌ/クラむアントのバヌゞョン䞍䞀臎時、SSR DOM をクリヌンアップしお `buildBindings()` でフルクラむアントサむドレンダリングを実行 |
3292
+ | **フォヌルバック** | サヌバヌ/クラむアントのバヌゞョン䞍䞀臎時、たたはサヌバヌが描いた `for:` の行が別の `for:` / `if:` / `elseif:` / `else:` ブロックの䞭にあるずきそのハむドレヌションは既知の制限、SSR DOM をクリヌンアップしお `buildBindings()` でフルクラむアントサむドレンダリングを実行。どちらも理由を `console.warn` で 1 回知らせる |
3226
3293
 
3227
3294
  ### `enable-ssr` の動䜜
3228
3295