@wcstack/state 1.3.12 → 1.3.14

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 CHANGED
@@ -148,11 +148,15 @@ Web Components のための宣言的リアクティブ状態管理。
148
148
 
149
149
  ### プリミティブ・オブジェクトプロパティ
150
150
 
151
- 直接のプロパティ代入は任意の深さで検知されます:
151
+ 代入は**ドットパス記法**(ブラケット構文)を使用する必要があります。リアクティブ Proxy はトップレベルの `set` トラップのみを捕捉するため、通常のネストされたプロパティアクセスでは変更が検知されません:
152
152
 
153
153
  ```javascript
154
- this.count = 10; // ✅ 検知される
155
- this.user.name = "Bob"; // ✅ 検知される(ネストされた代入)
154
+ // ✅ パス代入 — 変更が検知される
155
+ this.count = 10;
156
+ this["user.name"] = "Bob";
157
+
158
+ // ❌ 直接のネストアクセス — 変更が検知されない
159
+ this.user.name = "Bob"; // Proxy の set トラップをバイパスする
156
160
  ```
157
161
 
158
162
  ### 配列
package/README.md CHANGED
@@ -148,11 +148,15 @@ State changes are detected through **property assignment** (the Proxy `set` trap
148
148
 
149
149
  ### Primitive and Object Properties
150
150
 
151
- Direct property assignment is detected at any depth:
151
+ Assignment must use **dot-path notation** (bracket syntax). The reactive proxy intercepts only top-level `set` traps, so standard nested property access bypasses change detection:
152
152
 
153
153
  ```javascript
154
- this.count = 10; // ✅ detected
155
- this.user.name = "Bob"; // ✅ detected (nested assignment)
154
+ // ✅ Path assignment — change detected
155
+ this.count = 10;
156
+ this["user.name"] = "Bob";
157
+
158
+ // ❌ Direct nested access — change NOT detected
159
+ this.user.name = "Bob"; // bypasses the Proxy set trap
156
160
  ```
157
161
 
158
162
  ### Arrays
@@ -1 +1 @@
1
- {"version":3,"file":"applyChange.d.ts","sourceRoot":"","sources":["../../src/apply/applyChange.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAe3C,OAAO,EAAiB,aAAa,EAAE,MAAM,YAAY,CAAC;AAqC1D,wBAAgB,WAAW,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI,CAmD/E"}
1
+ {"version":3,"file":"applyChange.d.ts","sourceRoot":"","sources":["../../src/apply/applyChange.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAe3C,OAAO,EAAiB,aAAa,EAAE,MAAM,YAAY,CAAC;AA+C1D,wBAAgB,WAAW,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI,CAoD/E"}
@@ -46,6 +46,16 @@ function _applyChange(binding, context) {
46
46
  }
47
47
  }
48
48
  }
49
+ if (fn === applyChangeToProperty) {
50
+ const element = binding.node;
51
+ if (element.tagName === 'SELECT') {
52
+ const propName = binding.propSegments[0];
53
+ if (propName === 'value' || propName === 'selectedIndex') {
54
+ context.deferredSelectBindings.push({ binding, value: filteredValue });
55
+ return;
56
+ }
57
+ }
58
+ }
49
59
  fn(binding, context, filteredValue);
50
60
  }
51
61
  export function applyChange(binding, context) {
@@ -94,6 +104,7 @@ export function applyChange(binding, context) {
94
104
  appliedBindingSet: context.appliedBindingSet,
95
105
  newListValueByAbsAddress: context.newListValueByAbsAddress,
96
106
  updatedAbsAddressSetByStateElement: context.updatedAbsAddressSetByStateElement,
107
+ deferredSelectBindings: context.deferredSelectBindings,
97
108
  };
98
109
  _applyChange(binding, newContext);
99
110
  });
@@ -1 +1 @@
1
- {"version":3,"file":"applyChange.js","sourceRoot":"","sources":["../../src/apply/applyChange.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"applyChange.js","sourceRoot":"","sources":["../../src/apply/applyChange.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,10 @@ import { IBindingInfo } from "../types";
2
2
  /**
3
3
  * バインディング情報の配列を処理し、各バインディングに対して状態の変更を適用する。
4
4
  *
5
+ * 2フェーズで処理:
6
+ * Phase 1: 構造的更新(for/if) + 値更新(select以外) — select.value/selectedIndex は遅延収集
7
+ * Phase 2: 遅延されたselect.value/selectedIndex を適用(option要素の生成後)
8
+ *
5
9
  * 最適化のため、以下のグループ化を行う:
6
10
  * 同じ stateNameとrootNode を持つバインディングをグループ化 → createState の呼び出しを削減
7
11
  */
@@ -1 +1 @@
1
- {"version":3,"file":"applyChangeFromBindings.d.ts","sourceRoot":"","sources":["../../src/apply/applyChangeFromBindings.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAKxC;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,IAAI,CA6DtE"}
1
+ {"version":3,"file":"applyChangeFromBindings.d.ts","sourceRoot":"","sources":["../../src/apply/applyChangeFromBindings.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAMxC;;;;;;;;;GASG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,IAAI,CAqEtE"}
@@ -4,10 +4,15 @@ import { updatedCallbackSymbol } from "../proxy/symbols";
4
4
  import { raiseError } from "../raiseError";
5
5
  import { getStateElementByName } from "../stateElementByName";
6
6
  import { applyChange } from "./applyChange";
7
+ import { applyChangeToProperty } from "./applyChangeToProperty";
7
8
  import { getRootNodeByFragment } from "./rootNodeByFragment";
8
9
  /**
9
10
  * バインディング情報の配列を処理し、各バインディングに対して状態の変更を適用する。
10
11
  *
12
+ * 2フェーズで処理:
13
+ * Phase 1: 構造的更新(for/if) + 値更新(select以外) — select.value/selectedIndex は遅延収集
14
+ * Phase 2: 遅延されたselect.value/selectedIndex を適用(option要素の生成後)
15
+ *
11
16
  * 最適化のため、以下のグループ化を行う:
12
17
  * 同じ stateNameとrootNode を持つバインディングをグループ化 → createState の呼び出しを削減
13
18
  */
@@ -16,7 +21,8 @@ export function applyChangeFromBindings(bindings) {
16
21
  const appliedBindingSet = new Set();
17
22
  const newListValueByAbsAddress = new Map();
18
23
  const updatedAbsAddressSetByStateElement = new Map();
19
- // 外側ループ: stateName ごとにグループ化
24
+ const deferredSelectBindings = [];
25
+ // Phase 1: 構造的更新 + 値更新(select.value/selectedIndex は遅延)
20
26
  while (bindingIndex < bindings.length) {
21
27
  let binding = bindings[bindingIndex];
22
28
  const stateName = binding.stateName;
@@ -48,6 +54,7 @@ export function applyChangeFromBindings(bindings) {
48
54
  appliedBindingSet: appliedBindingSet,
49
55
  newListValueByAbsAddress: newListValueByAbsAddress,
50
56
  updatedAbsAddressSetByStateElement: updatedAbsAddressSetByStateElement,
57
+ deferredSelectBindings: deferredSelectBindings,
51
58
  };
52
59
  do {
53
60
  applyChange(binding, context);
@@ -62,6 +69,11 @@ export function applyChangeFromBindings(bindings) {
62
69
  } while (true); // eslint-disable-line no-constant-condition
63
70
  });
64
71
  }
72
+ // Phase 2: 遅延されたselect.value/selectedIndex を適用
73
+ // applyChangeToProperty は context を参照しないため null を渡す
74
+ for (const { binding, value } of deferredSelectBindings) {
75
+ applyChangeToProperty(binding, null, value);
76
+ }
65
77
  for (const [absAddress, newListValue] of newListValueByAbsAddress.entries()) {
66
78
  setLastListValueByAbsoluteStateAddress(absAddress, newListValue);
67
79
  }
@@ -1 +1 @@
1
- {"version":3,"file":"applyChangeFromBindings.js","sourceRoot":"","sources":["../../src/apply/applyChangeFromBindings.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"applyChangeFromBindings.js","sourceRoot":"","sources":["../../src/apply/applyChangeFromBindings.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,10 @@ import { IStateElement } from "../components/types";
2
2
  import { IStateProxy } from "../proxy/types";
3
3
  import { IBindingInfo } from "../binding/types";
4
4
  import { IAbsoluteStateAddress } from "../address/types";
5
+ export interface IDeferredSelectBinding {
6
+ readonly binding: IBindingInfo;
7
+ readonly value: unknown;
8
+ }
5
9
  export interface IApplyContext {
6
10
  readonly rootNode: Node;
7
11
  readonly stateName: string;
@@ -10,6 +14,7 @@ export interface IApplyContext {
10
14
  appliedBindingSet: Set<IBindingInfo>;
11
15
  newListValueByAbsAddress: Map<IAbsoluteStateAddress, readonly unknown[]>;
12
16
  updatedAbsAddressSetByStateElement: Map<IStateElement, Set<IAbsoluteStateAddress>>;
17
+ deferredSelectBindings: IDeferredSelectBinding[];
13
18
  }
14
19
  export type ApplyChangeFn = (binding: IBindingInfo, context: IApplyContext, newValue: unknown) => void;
15
20
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/apply/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAEzD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,YAAY,EAAE,aAAa,CAAC;IACrC,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,iBAAiB,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC;IACrC,wBAAwB,EAAE,GAAG,CAAC,qBAAqB,EAAE,SAAS,OAAO,EAAE,CAAC,CAAC;IACzE,kCAAkC,EAAE,GAAG,CAAC,aAAa,EAAE,GAAG,CAAC,qBAAqB,CAAC,CAAC,CAAC;CACpF;AAED,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/apply/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAEzD,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,YAAY,EAAE,aAAa,CAAC;IACrC,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,iBAAiB,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC;IACrC,wBAAwB,EAAE,GAAG,CAAC,qBAAqB,EAAE,SAAS,OAAO,EAAE,CAAC,CAAC;IACzE,kCAAkC,EAAE,GAAG,CAAC,aAAa,EAAE,GAAG,CAAC,qBAAqB,CAAC,CAAC,CAAC;IACnF,sBAAsB,EAAE,sBAAsB,EAAE,CAAC;CAClD;AAED,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC"}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * data-bind-state 属性または埋め込みノード<!--{{}}-->を持つノードをすべて取得する
2
+ * data-wcs 属性または埋め込みノード<!--{{}}-->を持つノードをすべて取得する
3
3
  * @param root
4
4
  * @returns
5
5
  */
@@ -1,7 +1,7 @@
1
1
  import { config } from "../config";
2
2
  import { parseCommentNode } from "./parseCommentNode";
3
3
  /**
4
- * data-bind-state 属性または埋め込みノード<!--{{}}-->を持つノードをすべて取得する
4
+ * data-wcs 属性または埋め込みノード<!--{{}}-->を持つノードをすべて取得する
5
5
  * @param root
6
6
  * @returns
7
7
  */
package/dist/index.esm.js CHANGED
@@ -1465,7 +1465,7 @@ function getParseBindTextResults(node) {
1465
1465
  }
1466
1466
 
1467
1467
  /**
1468
- * data-bind-state 属性または埋め込みノード<!--{{}}-->を持つノードをすべて取得する
1468
+ * data-wcs 属性または埋め込みノード<!--{{}}-->を持つノードをすべて取得する
1469
1469
  * @param root
1470
1470
  * @returns
1471
1471
  */
@@ -2937,6 +2937,16 @@ function _applyChange(binding, context) {
2937
2937
  }
2938
2938
  }
2939
2939
  }
2940
+ if (fn === applyChangeToProperty) {
2941
+ const element = binding.node;
2942
+ if (element.tagName === 'SELECT') {
2943
+ const propName = binding.propSegments[0];
2944
+ if (propName === 'value' || propName === 'selectedIndex') {
2945
+ context.deferredSelectBindings.push({ binding, value: filteredValue });
2946
+ return;
2947
+ }
2948
+ }
2949
+ }
2940
2950
  fn(binding, context, filteredValue);
2941
2951
  }
2942
2952
  function applyChange(binding, context) {
@@ -2985,6 +2995,7 @@ function applyChange(binding, context) {
2985
2995
  appliedBindingSet: context.appliedBindingSet,
2986
2996
  newListValueByAbsAddress: context.newListValueByAbsAddress,
2987
2997
  updatedAbsAddressSetByStateElement: context.updatedAbsAddressSetByStateElement,
2998
+ deferredSelectBindings: context.deferredSelectBindings,
2988
2999
  };
2989
3000
  _applyChange(binding, newContext);
2990
3001
  });
@@ -2997,6 +3008,10 @@ function applyChange(binding, context) {
2997
3008
  /**
2998
3009
  * バインディング情報の配列を処理し、各バインディングに対して状態の変更を適用する。
2999
3010
  *
3011
+ * 2フェーズで処理:
3012
+ * Phase 1: 構造的更新(for/if) + 値更新(select以外) — select.value/selectedIndex は遅延収集
3013
+ * Phase 2: 遅延されたselect.value/selectedIndex を適用(option要素の生成後)
3014
+ *
3000
3015
  * 最適化のため、以下のグループ化を行う:
3001
3016
  * 同じ stateNameとrootNode を持つバインディングをグループ化 → createState の呼び出しを削減
3002
3017
  */
@@ -3005,7 +3020,8 @@ function applyChangeFromBindings(bindings) {
3005
3020
  const appliedBindingSet = new Set();
3006
3021
  const newListValueByAbsAddress = new Map();
3007
3022
  const updatedAbsAddressSetByStateElement = new Map();
3008
- // 外側ループ: stateName ごとにグループ化
3023
+ const deferredSelectBindings = [];
3024
+ // Phase 1: 構造的更新 + 値更新(select.value/selectedIndex は遅延)
3009
3025
  while (bindingIndex < bindings.length) {
3010
3026
  let binding = bindings[bindingIndex];
3011
3027
  const stateName = binding.stateName;
@@ -3037,6 +3053,7 @@ function applyChangeFromBindings(bindings) {
3037
3053
  appliedBindingSet: appliedBindingSet,
3038
3054
  newListValueByAbsAddress: newListValueByAbsAddress,
3039
3055
  updatedAbsAddressSetByStateElement: updatedAbsAddressSetByStateElement,
3056
+ deferredSelectBindings: deferredSelectBindings,
3040
3057
  };
3041
3058
  do {
3042
3059
  applyChange(binding, context);
@@ -3051,6 +3068,11 @@ function applyChangeFromBindings(bindings) {
3051
3068
  } while (true); // eslint-disable-line no-constant-condition
3052
3069
  });
3053
3070
  }
3071
+ // Phase 2: 遅延されたselect.value/selectedIndex を適用
3072
+ // applyChangeToProperty は context を参照しないため null を渡す
3073
+ for (const { binding, value } of deferredSelectBindings) {
3074
+ applyChangeToProperty(binding, null, value);
3075
+ }
3054
3076
  for (const [absAddress, newListValue] of newListValueByAbsAddress.entries()) {
3055
3077
  setLastListValueByAbsoluteStateAddress(absAddress, newListValue);
3056
3078
  }