@wcstack/state 2.6.0 → 3.0.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 +97 -41
- package/README.md +99 -41
- package/dist/auto.min.js +1 -1
- package/dist/auto.min.js.map +1 -1
- package/dist/define.d.ts +295 -0
- package/dist/define.js +1 -0
- package/dist/index.d.ts +252 -94
- package/dist/index.esm.js +1 -23342
- package/dist/index.esm.js.map +1 -1
- package/dist/manifest.esm.js +21 -37
- package/dist/parser.d.ts +37 -39
- package/dist/parser.esm.js +147 -1153
- package/dist/split/chunks/binder.js +2 -0
- package/dist/split/chunks/binder.js.map +1 -0
- package/dist/split/chunks/checkDependency.js +2 -0
- package/dist/split/chunks/checkDependency.js.map +1 -0
- package/dist/split/chunks/diagnosticsHooks.js +2 -0
- package/dist/split/chunks/diagnosticsHooks.js.map +1 -0
- package/dist/split/chunks/errorGuidance.js +2 -0
- package/dist/split/chunks/errorGuidance.js.map +1 -0
- package/dist/split/chunks/features.d.ts +29 -0
- package/dist/split/chunks/filterRegistry.js +2 -0
- package/dist/split/chunks/filterRegistry.js.map +1 -0
- package/dist/split/chunks/getAllPropertyDescriptors.js +2 -0
- package/dist/split/chunks/getAllPropertyDescriptors.js.map +1 -0
- package/dist/split/chunks/lifecycleHooks.js +2 -0
- package/dist/split/chunks/lifecycleHooks.js.map +1 -0
- package/dist/split/chunks/mount.js +2 -0
- package/dist/split/chunks/mount.js.map +1 -0
- package/dist/split/chunks/pathDiagnostics.js +2 -0
- package/dist/split/chunks/pathDiagnostics.js.map +1 -0
- package/dist/split/chunks/registerComponents.js +2 -0
- package/dist/split/chunks/registerComponents.js.map +1 -0
- package/dist/split/chunks/setAll.js +2 -0
- package/dist/split/chunks/setAll.js.map +1 -0
- package/dist/split/chunks/version.js +2 -0
- package/dist/split/chunks/version.js.map +1 -0
- package/dist/split/chunks/watchRuntime.js +2 -0
- package/dist/split/chunks/watchRuntime.js.map +1 -0
- package/dist/split/core.d.ts +1417 -0
- package/dist/split/core.js +2 -0
- package/dist/split/core.js.map +1 -0
- package/dist/split/features/devtools.d.ts +9 -0
- package/dist/split/features/devtools.js +2 -0
- package/dist/split/features/devtools.js.map +1 -0
- package/dist/split/features/diagnostics.d.ts +11 -0
- package/dist/split/features/diagnostics.js +2 -0
- package/dist/split/features/diagnostics.js.map +1 -0
- package/dist/split/features/formats.d.ts +10 -0
- package/dist/split/features/formats.js +2 -0
- package/dist/split/features/formats.js.map +1 -0
- package/dist/split/features/recursion.d.ts +9 -0
- package/dist/split/features/recursion.js +2 -0
- package/dist/split/features/recursion.js.map +1 -0
- package/dist/split/features/scopes.d.ts +10 -0
- package/dist/split/features/scopes.js +2 -0
- package/dist/split/features/scopes.js.map +1 -0
- package/dist/split/features/ssr.d.ts +9 -0
- package/dist/split/features/ssr.js +2 -0
- package/dist/split/features/ssr.js.map +1 -0
- package/dist/split/features/temporal.d.ts +9 -0
- package/dist/split/features/temporal.js +2 -0
- package/dist/split/features/temporal.js.map +1 -0
- package/package.json +13 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registerComponents.js","sources":["../../../../../src/list/loopContext.ts","../../../../../src/proxy/traps/get.ts","../../../../../src/proxy/apis/postUpdate.ts","../../../../../src/proxy/apis/trackDependency.ts","../../../../../src/proxy/apis/untrackDependency.ts","../../../../../src/proxy/methods/setLoopContext.ts","../../../../../src/proxy/apis/connectedCallback.ts","../../../../../src/proxy/apis/disconnectedCallback.ts","../../../../../src/proxy/apis/updatedCallback.ts","../../../../../src/proxy/apis/errorCallback.ts","../../../../../src/proxy/StateHandler.ts","../../../../../src/proxy/traps/set.ts","../../../../../src/platform/HTMLElementBase.ts","../../../../../src/apply/reapplyStateBindings.ts","../../../../../src/components/State.ts","../../../../../src/command/processCommandTokensDeclaration.ts","../../../../../src/event/processEventTokensDeclaration.ts","../../../../../src/list/listKeys.ts","../../../../../src/event/processOnDeclaration.ts","../../../../../src/stateLoader/loadFromScriptJson.ts","../../../../../src/stateLoader/loadFromJsonFile.ts","../../../../../src/registerComponents.ts"],"sourcesContent":["import { IStateAddress } from \"../address/types\";\nimport { MAX_LOOP_DEPTH } from \"../define\";\nimport { raiseError } from \"../raiseError\";\nimport { ILoopContext, ILoopContextStack } from \"./types\";\n\ntype LoopContextCallback<T> = (loopContext: ILoopContext) => T | Promise<T>;\n\nclass LoopContextStack {\n private _loopContextStack: (ILoopContext | undefined)[] = Array(MAX_LOOP_DEPTH).fill(undefined);\n private _length: number = 0;\n\n\n createLoopContext(\n elementStateAddress: IStateAddress,\n callback: LoopContextCallback<void>\n ): void | Promise<void> {\n if (elementStateAddress.listIndex === null) {\n raiseError(`Cannot create loop context for a state address that does not have a list index.`);\n }\n const loopContext = elementStateAddress as ILoopContext;\n if (this._length >= MAX_LOOP_DEPTH) {\n raiseError(`Exceeded maximum loop context stack depth of ${MAX_LOOP_DEPTH}. Possible infinite loop.`);\n }\n const lastLoopContext = this._loopContextStack[this._length - 1];\n if (typeof lastLoopContext !== \"undefined\" ) {\n if (lastLoopContext.pathInfo.wildcardCount + 1 !== loopContext.pathInfo.wildcardCount) {\n raiseError(`Cannot push loop context for a list whose wildcard count is not exactly one more than the current active loop context.`);\n }\n // \n const prevWildcardPathInfo = loopContext.pathInfo.wildcardPathInfos[loopContext.pathInfo.wildcardPathInfos.length - 2];\n if (lastLoopContext.pathInfo !== prevWildcardPathInfo) {\n raiseError(`Cannot push loop context for a list whose parent wildcard path info does not match the current active loop context.`);\n }\n } else {\n // With no active loop context the address must be self-contained: the\n // listIndex chain supplies one index per wildcard, plus this scope's base\n // depth Δ. Top-level lists (wildcardCount 1) always satisfy this. A nested\n // list re-rendered directly (e.g. replaced via $resolve from outside the\n // loop) also satisfies it — the for binding's listIndex carries the full\n // ancestor chain. Δ is non-zero only for a mapped bind-component child\n // whose host sits inside a parent-scope `for`\n // (docs/state-bind-component-nested-for-design.md).\n // ここは行ごとに通る(applyChangeToFor は追加行ごとに createLoopContext する)。\n // Δ=0 の判定を先に置き、通れば base 深さの解決(DOM の親走査を含む)に\n // 一切触れない — 通常の state に追加コストを載せないため。\n if (loopContext.listIndex.length !== loopContext.pathInfo.wildcardCount) {\n raiseError(`Cannot push loop context when there is no active loop context: the list index chain (length ${loopContext.listIndex.length}) does not cover the wildcard path (wildcard count ${loopContext.pathInfo.wildcardCount}).`);\n }\n }\n this._loopContextStack[this._length] = loopContext;\n this._length++;\n let retValue : void | Promise<void> = void 0;\n try {\n retValue = callback(loopContext);\n } finally {\n if (retValue instanceof Promise) {\n retValue.finally(() => {\n this._length--;\n this._loopContextStack[this._length] = undefined;\n });\n } else {\n this._length--;\n this._loopContextStack[this._length] = undefined;\n }\n }\n return retValue;\n } \n}\n\nexport function createLoopContextStack(): ILoopContextStack {\n return new LoopContextStack();\n}\n\n","/**\n * get.ts\n *\n * StateClassのProxyトラップとして、プロパティアクセス時の値取得処理を担う関数(get)の実装です。\n *\n * 主な役割:\n * - 文字列プロパティの場合、特殊プロパティ($1〜、$stateElement, $getAll, $setAll, $postUpdate,\n * $resolve, $trackDependency, $command, $streamStatus, $streamError)に応じた値やAPIを返却\n * - 通常のプロパティはgetResolvedPathInfoでパス情報を解決し、getListIndexでリストインデックスを取得\n * - getByRefで構造化パス・リストインデックスに対応した値を取得\n * - シンボルプロパティの場合はhandler.callableApi経由でAPIを呼び出し\n * - それ以外はReflect.getで通常のプロパティアクセスを実行\n *\n * 設計ポイント:\n * - $1〜$128(MAX_WILDCARD_DEPTH)は直近のStatePropertyRefのリストインデックス値を返す特殊プロパティ\n * - $getAll, $resolve 等はAPI関数を、$command / $streamStatus / $streamError は名前空間を返す\n * - 通常のプロパティアクセスもバインディングや多重ループに対応\n * - シンボルAPIやReflect.getで拡張性・互換性も確保\n */\n\nimport { getResolvedAddress } from \"../../address/ResolvedAddress\";\nimport { createStateAddress } from \"../../address/StateAddress\";\nimport { IAbsoluteStateAddress, IStateAddress } from \"../../address/types\";\nimport { getCommandNamespace } from \"../../command/commandNamespace\";\nimport { DELIMITER, INDEX_BY_INDEX_NAME, INDEX_PARAM_PREFIX, MAX_WILDCARD_DEPTH, STATE_COMMAND_NAMESPACE_NAME, STATE_STREAM_ERROR_NAMESPACE_NAME, STATE_STREAM_STATUS_NAMESPACE_NAME } from \"../../define\";\nimport { listIndexAtWildcard } from \"../../list/wildcardLevel\";\nimport { raiseError } from \"../../raiseError\";\nimport { NOT_HANDLED } from \"../../core/addressHooks\";\nimport { connectedCallback } from \"../apis/connectedCallback\";\nimport { disconnectedCallback } from \"../apis/disconnectedCallback\";\nimport { getAll } from \"../apis/getAll\";\nimport { postUpdate } from \"../apis/postUpdate\";\nimport { resolve } from \"../apis/resolve\";\nimport { ISetAllOptions, setAll } from \"../apis/setAll\";\nimport { trackDependency } from \"../apis/trackDependency\";\nimport { untrackDependency } from \"../apis/untrackDependency\";\nimport { recordTrackedKeyedPath, registerIndexKeyedDependency, registerIndexWatcher, registerKeyedDependency } from \"../../dependency/keyedDependency\";\nimport { getPathInfo } from \"../../address/PathInfo\";\nimport { IStateElement } from \"../../components/types\";\n\n/**\n * 鍵付き購読の `path` が getter か getter の配下か。getter の値は `path` への書き込みを経ずに変わるので\n * 鍵付き購読では知らせられない — そのときは依存を張る普通の読み取りに戻す(正しいが、変化で全行が\n * 再評価される。鍵付きの形を使わないのと同じ)。\n */\nfunction derivesFromGetter(stateElement: IStateElement, path: string): boolean {\n const getterPaths = stateElement.getterPaths;\n if (getterPaths.size === 0) {\n return false;\n }\n for (const cumulativePath of getPathInfo(path).cumulativePaths) {\n if (getterPaths.has(cumulativePath)) {\n return true;\n }\n }\n return false;\n}\nimport { getListIndexesByList } from \"../../list/listIndexesByList\";\nimport { liftAddress as liftAddressForKeyed } from \"../../address/liftAddress\";\nimport { updatedCallback } from \"../apis/updatedCallback\";\nimport { errorCallback } from \"../apis/errorCallback\";\nimport { getByAddress } from \"../methods/getByAddress\";\nimport { hasByAddress } from \"../methods/hasByAddress\";\nimport { getListIndex } from \"../methods/getListIndex\";\nimport { setByAddress } from \"../methods/setByAddress\";\nimport { setLoopContext } from \"../methods/setLoopContext\";\nimport { connectedCallbackSymbol, disconnectedCallbackSymbol, errorCallbackSymbol, getByAddressSymbol, hasByAddressSymbol, setByAddressSymbol, setLoopContextSymbol, updatedCallbackSymbol } from \"../symbols\";\nimport type { IBindingErrorInfo } from \"../../types\";\nimport { IStateHandler } from \"../types\";\n\n/** `$` + 数字だけの prop(`$1` / `$129`)。範囲外を無言で通さないための判別。 */\nconst INDEX_PARAM_RE = /^\\$\\d+$/;\n\n// `$streamStatus.<name>` / `$streamError.<name>` の dotted パス判定用プレフィックス\nconst STREAM_STATUS_PATH_PREFIX = `${STATE_STREAM_STATUS_NAMESPACE_NAME}${DELIMITER}`;\nconst STREAM_ERROR_PATH_PREFIX = `${STATE_STREAM_ERROR_NAMESPACE_NAME}${DELIMITER}`;\n\n// symbol API のクロージャは handler(= proxy と 1:1、target/receiver 不変)ごとに\n// 使い回す。drain の getValue が binding ごとに getByAddressSymbol を引くため、\n// 毎回の新規クロージャ生成が GC 圧・固定費になっていた。\nconst symbolApiCacheByHandler = new WeakMap<IStateHandler, Map<symbol, unknown>>();\n\nfunction getSymbolApiCache(handler: IStateHandler): Map<symbol, unknown> {\n let cache = symbolApiCacheByHandler.get(handler);\n if (typeof cache === \"undefined\") {\n cache = new Map<symbol, unknown>();\n symbolApiCacheByHandler.set(handler, cache);\n }\n return cache;\n}\n\nexport function get(\n target : object, \n prop : PropertyKey, \n receiver: any,\n handler : IStateHandler\n): any {\n const index = INDEX_BY_INDEX_NAME[prop];\n // `$` で始まらない読み(=通常のパス読みのほぼ全部)は charCode 1 個で抜ける。\n // 表引き失敗だけを条件にすると `$1`..`$N` 以外の**全プロパティ読み**が正規表現に\n // 触れることになり、行数×バインド数ぶん get トラップを回すリスト描画で効いてくる。\n if (typeof index === \"undefined\" && typeof prop === \"string\"\n && prop.charCodeAt(0) === 36 /* '$' */ && INDEX_PARAM_RE.test(prop)) {\n // `$1`..`$N` の表は MAX_WILDCARD_DEPTH ぶんしか無い。表引きに失敗した `$<数字>` は\n // これまで通常のプロパティ解決へ落ちて診断ゼロで undefined になっていた(`$128` は\n // 0 を返すのに `$129` だけが無言で壊れる)。境界のすぐ外側こそ名指しする\n // (docs/state-recursive-path-impl-plan.md §3-2 の E3)。綴り不正(`$0` / `$01`)も\n // 同じ入口で落ちるので、範囲だけでなく綴りも文面に含める。\n raiseError(\n `[wcs/index-param-range] \"${prop}\" is not a valid list index parameter: they run from ` +\n `${INDEX_PARAM_PREFIX}1 to ${INDEX_PARAM_PREFIX}${MAX_WILDCARD_DEPTH}, with no leading zeros.`,\n );\n }\n if (typeof index !== \"undefined\") {\n if (handler.addressStackLength === 0) {\n raiseError(`No active state reference to get list index for \"${prop.toString()}\".`);\n }\n const lastAddress = handler.lastAddressStack;\n // getter 評価中のインデックス読み取りを記録する。位置だけが変わった行\n // (listDiff.changeIndexSet)は index 以外の入力が不変なので、walkDependency の\n // 静的子展開を「インデックスを読んだ getter の subtree」に限定できる。\n // $untrackDependency スコープ中/setter 実行中は記録しない。\n const lastInfo = lastAddress?.pathInfo;\n if (lastInfo && !handler.untracking && handler.stateElement?.getterPaths.has(lastInfo.path)) {\n handler.stateElement.addIndexDependentGetterPath?.(lastInfo.path);\n }\n const listIndex = lastAddress?.listIndex;\n if (typeof listIndex === \"undefined\" || listIndex === null) {\n raiseError(`ListIndex not found: ${prop.toString()}`);\n }\n // `$1` は「このスコープの」1 段目。base 深さ Δ を持つ子スコープでも\n // 番号がずれないよう末尾から数える(list/wildcardLevel.ts)\n let scopedIndex = index;\n const lastPathInfo = lastAddress!.pathInfo;\n // スコープ相対の Δ(マウントのアクセサ評価中 — 設計書 §4-4)は indexShift hook が足す\n // (webComponent/addressHooks.ts。hook の無い state は判定 1 個で抜ける)\n const shiftHooks = handler.stateElement?.addressHooks;\n if (shiftHooks) {\n const shifts = shiftHooks.indexShift;\n for (let i = 0; i < shifts.length; i++) {\n scopedIndex += shifts[i](handler, lastAddress!);\n }\n }\n const indexListIndex = listIndexAtWildcard(listIndex, scopedIndex, lastPathInfo.wildcardCount);\n return indexListIndex?.index ?? raiseError(`ListIndex not found: ${prop.toString()}`);\n }\n if (typeof prop === \"string\") {\n // 読み書き境界の hook(設計案 H1): $streamStatus / $streamError などの名前空間は機能側が答える\n const hooks = handler.stateElement?.addressHooks;\n if (hooks) {\n const getHooks = hooks.get;\n for (let i = 0; i < getHooks.length; i++) {\n const handled = getHooks[i](handler, prop, receiver, target);\n if (handled !== NOT_HANDLED) return handled;\n }\n }\n if (prop[0] === '$') {\n switch (prop) {\n case \"$stateElement\": {\n return handler.stateElement;\n }\n case \"$getAll\": {\n return (path: string, indexes?: number[]): any[] => {\n return getAll(\n target, \n prop, \n receiver,\n handler\n )(path, indexes);\n }\n }\n case \"$setAll\": {\n return (path: string, indexes: number[], value: any, options?: ISetAllOptions): number => {\n return setAll(\n target,\n prop,\n receiver,\n handler\n )(path, indexes, value, options);\n }\n }\n case \"$postUpdate\": {\n return (path: string): void => {\n return postUpdate(\n target, \n prop, \n receiver,\n handler\n )(path);\n }\n }\n case \"$resolve\": {\n // 引数の個数をそのまま渡す — 読みか書きかは個数で決まる(要件 B7)\n return (path: string, indexes: number[], ...value: [value?: any]): any => {\n return resolve(\n target, \n prop, \n receiver,\n handler\n )(path, indexes, ...value);\n }\n }\n case \"$trackDependency\": {\n return (path: string): void => {\n return trackDependency(\n target,\n prop,\n receiver,\n handler\n )(path);\n }\n }\n case \"$eq\": {\n // 鍵付き購読(dependency/keyedDependency.ts): `path` を依存に張らず読み、評価中の\n // getter がリスト行のものならその行を `key` の下に登録する。`path` への書き込みは\n // 旧値・新値の鍵の行だけを再評価する(選択のような「1 行だけ真」の getter 向け)\n return (path: string, key: unknown): boolean => {\n // getter の外(メソッド・コールバック)ではアドレススタックが空: 比較だけ返す\n const lastAddress = handler.addressStackLength > 0 ? handler.lastAddressStack : null;\n if (derivesFromGetter(handler.stateElement, path)) {\n if (lastAddress !== null && handler.stateElement.getterPaths.has(lastAddress.pathInfo.path)) {\n recordTrackedKeyedPath(handler.stateElement, path);\n }\n return Object.is(receiver[path], key);\n }\n handler.beginUntrack();\n let current: unknown;\n try {\n current = receiver[path];\n } finally {\n handler.endUntrack();\n }\n if (lastAddress !== null && handler.stateElement.getterPaths.has(lastAddress.pathInfo.path)) {\n registerKeyedDependency(handler.stateElement, path, key, liftAddressForKeyed(handler.stateElement, lastAddress), current);\n }\n return Object.is(current, key);\n };\n }\n case \"$eqPath\": {\n // `$eq` の鍵を keyPath から依存を張らずに読む形(dependency/keyedDependency.ts)。\n // 追跡付きで行 id を読むと動的辺がリスト置換で全行に展開されるので、ここで抑止する\n return (path: string, keyPath: string): boolean => {\n const lastAddress = handler.addressStackLength > 0 ? handler.lastAddressStack : null;\n const tracked = derivesFromGetter(handler.stateElement, path);\n let current: unknown = tracked ? receiver[path] : undefined;\n handler.beginUntrack();\n let key: unknown;\n try {\n if (!tracked) {\n current = receiver[path];\n }\n key = receiver[keyPath];\n } finally {\n handler.endUntrack();\n }\n if (lastAddress !== null && handler.stateElement.getterPaths.has(lastAddress.pathInfo.path)) {\n if (tracked) {\n recordTrackedKeyedPath(handler.stateElement, path);\n } else {\n registerKeyedDependency(handler.stateElement, path, key, liftAddressForKeyed(handler.stateElement, lastAddress), current);\n }\n }\n return Object.is(current, key);\n };\n }\n case \"$eqIndex\": {\n // `$eq` の鍵を評価中の行の index(`$1` = level 1)にする形。`$1` の読み取りと違い\n // getter を index 依存には記録しない: 行の移動はリスト差分が鍵を付け替える\n // (dependency/keyedDependency.ts の rekeyIndexSubscriptions)\n return (path: string, level: number = 1): boolean => {\n const lastAddress = handler.addressStackLength > 0 ? handler.lastAddressStack : null;\n if (lastAddress === null || lastAddress.listIndex === null) {\n raiseError(`$eqIndex(\"${path}\") needs a list row scope.`);\n }\n const levelListIndex = listIndexAtWildcard(lastAddress.listIndex, level - 1, lastAddress.pathInfo.wildcardCount);\n if (levelListIndex === null) {\n raiseError(`$eqIndex(\"${path}\", ${level}): no list index at that level.`);\n }\n if (derivesFromGetter(handler.stateElement, path)) {\n if (handler.stateElement.getterPaths.has(lastAddress.pathInfo.path)) {\n recordTrackedKeyedPath(handler.stateElement, path);\n }\n return Object.is(receiver[path], levelListIndex.index);\n }\n // 最内段(getter 自身の行の段)はリスト単位の監視で O(1)、外側の段は行ごとの購読\n const innermost = level === lastAddress.pathInfo.wildcardCount;\n handler.beginUntrack();\n let current: unknown;\n let listValue: unknown;\n try {\n current = receiver[path];\n if (innermost) {\n listValue = receiver[lastAddress.pathInfo.wildcardParentPaths[level - 1]];\n }\n } finally {\n handler.endUntrack();\n }\n if (handler.stateElement.getterPaths.has(lastAddress.pathInfo.path)) {\n // 描画済みの行の親リストは必ず台帳(listIndexesByList)を持つ\n const indexes = innermost ? getListIndexesByList(listValue as readonly unknown[]) : null;\n if (indexes !== null) {\n registerIndexWatcher(handler.stateElement, path, lastAddress.pathInfo, indexes, current);\n } else {\n registerIndexKeyedDependency(handler.stateElement, path, levelListIndex, liftAddressForKeyed(handler.stateElement, lastAddress), current);\n }\n }\n return Object.is(current, levelListIndex.index);\n };\n }\n case \"$untrackDependency\": {\n return <T>(fn: () => T): T => {\n return untrackDependency(\n target,\n prop,\n receiver,\n handler\n )(fn);\n }\n }\n case STATE_COMMAND_NAMESPACE_NAME: {\n return getCommandNamespace(handler.stateElement);\n }\n }\n // switch 不一致の $ プロパティのうち、`$streamStatus.<name>` / `$streamError.<name>`\n // の dotted パスだけは通常のパス解決(getByAddress)へフォールスルーさせる。\n // これが computed(getter)内での依存追跡付き読み取りの正規形\n // (checkDependency が getter スコープで動的依存を登録し、$postUpdate の\n // walkDependency で computed が無効化される、docs/state-streams-design.md §4-3)。\n // それ以外の未知 $ プロパティは従来どおり undefined を返す。\n if (!prop.startsWith(STREAM_STATUS_PATH_PREFIX) && !prop.startsWith(STREAM_ERROR_PATH_PREFIX)) {\n return undefined;\n }\n }\n // オーサリング層の `**`(再帰 getter の深さへの束縛)は recursion/addressHooks.ts の get hook が上で受けている\n const resolvedAddress = getResolvedAddress(prop);\n const listIndex = getListIndex(target, resolvedAddress, receiver, handler);\n const stateAddress = createStateAddress(resolvedAddress.pathInfo, listIndex);\n return getByAddress(\n target,\n stateAddress,\n receiver,\n handler\n );\n } else if (typeof prop === \"symbol\") {\n const cache = getSymbolApiCache(handler);\n const cached = cache.get(prop);\n if (typeof cached !== \"undefined\") {\n return cached;\n }\n let api: unknown;\n switch (prop) {\n case setLoopContextSymbol: {\n api = (loopContext: any, callback = (): any => {}): any => {\n return setLoopContext(handler, loopContext, callback);\n };\n break;\n }\n case getByAddressSymbol: {\n api = (address: IStateAddress): any => {\n return getByAddress(\n target,\n address,\n receiver,\n handler\n );\n }\n break;\n }\n case hasByAddressSymbol: {\n api = (address: IStateAddress): boolean => {\n return hasByAddress(\n target,\n address,\n receiver,\n handler\n );\n }\n break;\n }\n case setByAddressSymbol: {\n api = (address: IStateAddress, value: any): void => {\n return setByAddress(\n target,\n address,\n value,\n receiver,\n handler\n );\n }\n break;\n }\n case connectedCallbackSymbol: {\n api = (): Promise<void> => {\n return connectedCallback(\n target,\n connectedCallbackSymbol,\n receiver,\n handler\n );\n }\n break;\n }\n case disconnectedCallbackSymbol: {\n api = (): void => {\n return disconnectedCallback(\n target,\n disconnectedCallbackSymbol,\n receiver,\n handler\n );\n }\n break;\n }\n case updatedCallbackSymbol: {\n api = (\n refs: IAbsoluteStateAddress[]\n ): unknown => {\n return updatedCallback(\n target,\n refs,\n receiver,\n handler\n );\n }\n break;\n }\n case errorCallbackSymbol: {\n api = (error: unknown, info: IBindingErrorInfo): void => {\n return errorCallback(\n target,\n error,\n info,\n receiver,\n handler\n );\n }\n break;\n }\n default: {\n return Reflect.get(\n target,\n prop,\n receiver\n );\n }\n }\n cache.set(prop, api);\n return api;\n }\n}\n","import { liftAddress } from \"../../address/liftAddress\";\nimport { getResolvedAddress } from \"../../address/ResolvedAddress\";\nimport { createStateAddress } from \"../../address/StateAddress\";\nimport { IStateAddress } from \"../../address/types\";\nimport { dirtyCacheEntryByAbsoluteStateAddress } from \"../../cache/cacheEntryByAbsoluteStateAddress\";\nimport { walkDependency } from \"../../dependency/walkDependency\";\nimport { getUpdater } from \"../../updater/updater\";\nimport { getListIndex } from \"../methods/getListIndex\";\nimport { IStateHandler, IStateProxy } from \"../types\";\n\n\ntype PostFunction = (path: string) => void;\n\nexport function postUpdate(\n target: object, \n _prop: PropertyKey, \n receiver: any,\n handler: IStateHandler\n): PostFunction {\n const stateElement = handler.stateElement;\n return (path: string): void => {\n const resolvedAddress = getResolvedAddress(path);\n const listIndex = getListIndex(target, resolvedAddress, receiver, handler);\n const address = createStateAddress(resolvedAddress.pathInfo, listIndex);\n const absAddress = liftAddress(stateElement, address);\n const updater = getUpdater();\n updater.enqueueAbsoluteAddress(absAddress);\n // 依存関係のあるキャッシュを無効化(ダーティ)、更新対象として登録\n walkDependency(\n handler.stateElement,\n address,\n handler.stateElement.staticDependency,\n handler.stateElement.dynamicDependency,\n handler.stateElement.listPaths,\n receiver as IStateProxy,\n \"new\",\n (depAddress: IStateAddress) => {\n // キャッシュを無効化(ダーティ)\n const absDepAddress = liftAddress(stateElement, depAddress);\n dirtyCacheEntryByAbsoluteStateAddress(absDepAddress);\n // 更新対象として登録\n updater.enqueueAbsoluteAddress(absDepAddress);\n }\n );\n // $postUpdate は in-place 変異を通知する正規の idiom で、set トラップを通らない変更が観測面に\n // 出る唯一の経路なので、書き込み後の hook(DCC の bindable イベント等)をここでも撃つ\n // (docs/architecture-hardening/15-state-component-mechanism-consistency.md §2.1)。\n const hooks = stateElement.addressHooks;\n if (hooks) {\n const written = hooks.written;\n for (let i = 0; i < written.length; i++) {\n written[i](stateElement, address.pathInfo);\n }\n }\n }\n}","/**\n * trackDependency.ts\n *\n * StateClassのAPIとして、getterチェーン中に参照されたパス間の\n * 依存関係を動的に登録するための関数(trackDependency)の実装です。\n *\n * 主な役割:\n * - 現在解決中のStatePropertyRef(lastRefStack)を取得\n * - pathManager.gettersに登録されているgetterの場合のみ依存を追跡\n * - 自身と同一パターンでない参照に対してaddDynamicDependencyを呼び出す\n *\n * 設計ポイント:\n * - lastRefStackが存在しない場合はSTATE-202エラーを発生させる\n * - getter同士の再帰(自己依存)は登録しない\n * - 動的依存はpathManagerに集約し、キャッシュの無効化に利用する\n */\n\nimport { raiseError } from \"../../raiseError\";\nimport { RECURSION_WILDCARD } from \"../../define\";\nimport { IStateHandler } from \"../types\";\n\n/**\n * 現在解決中のgetterから、指定されたパスへの動的依存を登録する関数を返します。\n *\n * - pathManager.gettersに登録されているgetterのみ依存追跡を行う\n * - 自己参照は除外し、異なるパターン間の依存だけを記録\n * - 動的依存はpathManager.addDynamicDependencyで集中管理される\n *\n * @param target プロキシ対象オブジェクト\n * @param prop アクセスされたプロパティキー\n * @param receiver プロキシレシーバ\n * @param handler StateClassハンドラ\n * @returns 引数pathで指定されたパターンへの依存を登録する無名関数\n */\n\ntype TrackDependencyFunction = (path: string) => void;\n\nexport function trackDependency(\n _target: object, \n _prop: PropertyKey, \n _receiver: any,\n handler: IStateHandler\n): TrackDependencyFunction {\n return (path: string): void => {\n // `**` はここでは解釈しない(依存辺は展開後の具体パスにしか張れない)。`$postUpdate` /\n // `$resolve` は `getPathInfo` の不変条件で落ちるが、この API は生の文字列を依存表へ\n // そのまま載せるので、ゲートを置かないと無言で受理されて getter が stale になる\n // (第 2 サイクルのレビューで実測)。宣言の有無に関わらず拒否する。\n if (path.indexOf(RECURSION_WILDCARD) !== -1) {\n raiseError(\n `[wcs/recursion-unsupported] $trackDependency(\"${path}\") cannot take \"**\" — a dependency is ` +\n `registered against a concrete path (a fixed number of \"*\"). Track the concrete depth, or read ` +\n `the path through this[...] / $getAll inside the getter so the dependency is recorded automatically.`\n );\n }\n if (handler.addressStackLength === 0) {\n raiseError(`No active state reference to track dependency for path \"${path}\".`);\n }\n const lastInfo = handler.lastAddressStack?.pathInfo ?? \n raiseError('Internal error: lastAddressStack is null');\n const stateElement = handler.stateElement;\n if (handler.stateElement.getterPaths.has(lastInfo.path) &&\n lastInfo.path !== path) {\n stateElement.addDynamicDependency(path, lastInfo.path);\n }\n };\n}\n","/**\n * untrackDependency.ts\n *\n * StateClass の API として、コールバック実行中の依存追跡を抑止する関数\n * ($untrackDependency)の実装です。$trackDependency(明示的な依存登録)と\n * 対称の「明示的な依存抑止」API。\n *\n * 主な役割:\n * - fn 実行中、checkDependency の動的依存登録と $1 インデックス依存の記録を抑止\n * - fn の戻り値をそのまま返す(値の読み取り自体は通常どおり行われる)\n *\n * 設計ポイント:\n * - スコープはハンドラ単位のカウンタ(ネスト可)で管理し、finally で必ず復元する\n * - 典型例: リスト行 getter が「行の外の単一値」を読みたいが、その値の変更で\n * 全行を再評価させたくない場合(選択インデックス等)。書き手側が該当行へ\n * 直接書き込むことで、必要な行だけが更新される\n */\n\nimport { IStateHandler } from \"../types\";\n\ntype UntrackDependencyFunction = <T>(fn: () => T) => T;\n\nexport function untrackDependency(\n _target: object,\n _prop: PropertyKey,\n _receiver: any,\n handler: IStateHandler\n): UntrackDependencyFunction {\n return <T>(fn: () => T): T => {\n handler.beginUntrack();\n try {\n return fn();\n } finally {\n handler.endUntrack();\n }\n };\n}\n","/**\n * setLoopContext.ts\n *\n * StateClassの内部APIとして、ループコンテキスト(ILoopContext)を一時的に設定し、\n * 指定したコールバックをそのスコープ内で実行するための関数です。\n *\n * 主な役割:\n * - handler.loopContextにループコンテキストを一時的に設定\n * - 既にループコンテキストが設定されている場合はエラーを投げる\n * - 常にスコープを設定しコールバックを実行\n * - finallyで必ずloopContextをnullに戻し、スコープ外への影響を防止\n *\n * 設計ポイント:\n * - ループバインディングや多重ループ時のスコープ管理を安全に行う\n * - finallyで状態復元を保証し、例外発生時も安全\n *\n * **スコープは同期である(重要)**:\n * push/pop は `callback()` の同期リターンで完結する。callback が Promise を返した\n * 場合、finally はその Promise が settle する *前* に走るため、await を跨いだ先では\n * ループコンテキストは既に外れている。したがって async なハンドラが await の後に\n * `$1` や wildcard パス(`items.*.id`)を触ると raiseError になる。\n *\n * これは silent な取り違えではなく loud な失敗であり、意図した挙動である\n * (特性化テスト: `__tests__/poc.asyncOnLoopContext.test.ts`)。await の後に行位置が\n * 必要な場合は、ハンドラ引数で受け取った listIndexes を\n * `$resolve(path, indexes, value?)` に渡すこと。listIndexes は素の数値配列なので\n * await を跨いでも安全に持ち回せる。\n *\n * 補足: かつて `setLoopContextAsync` という変種が存在したが、実体は\n * `await _setLoopContext(...)`(= finally が既に走った後の Promise を await するだけ)\n * であり、名前が示唆する「コンテキストを await 跨ぎで保持する」挙動は持っていなかった。\n * production の呼び出し元も無かったため削除した。同等の機能が必要になった場合は、\n * 「名前どおりに動く」実装を新規に起こすこと。\n */\n\nimport { ILoopContext } from \"../../list/types\";\nimport { raiseError } from \"../../raiseError\";\nimport { IStateHandler } from \"../types\";\n\nexport function setLoopContext(\n handler: IStateHandler,\n loopContext: ILoopContext | null,\n callback: () => any\n): any {\n if (typeof handler.loopContext !== \"undefined\") {\n raiseError('already in loop context');\n }\n handler.setLoopContext(loopContext);\n try {\n handler.pushAddress(loopContext);\n try {\n return callback();\n } finally {\n handler.popAddress();\n }\n } finally {\n handler.clearLoopContext();\n }\n}\n","/**\n * connectedCallback.ts\n *\n * StateClassのライフサイクルフック「$connectedCallback」を呼び出すユーティリティ関数です。\n *\n * 主な役割:\n * - オブジェクト(target)に$connectedCallbackメソッドが定義されていれば呼び出す\n * - コールバックはtargetのthisコンテキストで呼び出し、IReadonlyStateProxy(receiver)を引数として渡す\n * - 非同期関数として実行可能(await対応)\n *\n * 設計ポイント:\n * - Reflect.getで$connectedCallbackプロパティを安全に取得\n * - 存在しない場合は何もしない\n * - ライフサイクル管理やカスタム初期化処理に利用\n */\n\nimport { STATE_CONNECTED_CALLBACK_NAME } from \"../../define\";\nimport { IStateHandler } from \"../types\";\n\nexport async function connectedCallback(\n target: object, \n _prop: PropertyKey, \n receiver: any,\n _handler: IStateHandler\n):Promise<void> {\n const callback = Reflect.get(target, STATE_CONNECTED_CALLBACK_NAME);\n if (typeof callback === \"function\") {\n await callback.call(receiver);\n }\n}","/**\n * disconnectedCallback.ts\n *\n * StateClassのライフサイクルフック「$disconnectedCallback」を呼び出すユーティリティ関数です。\n *\n * 主な役割:\n * - オブジェクト(target)に$disconnectedCallbackメソッドが定義されていれば呼び出す\n * - コールバックはtargetのthisコンテキストで呼び出し、IReadonlyStateProxy(receiver)を引数として渡す\n *\n * 設計ポイント:\n * - Reflect.getで$disconnectedCallbackプロパティを安全に取得\n * - 存在しない場合は何もしない\n * - ライフサイクル管理やクリーンアップ処理に利用\n */\n\nimport { STATE_DISCONNECTED_CALLBACK_NAME } from \"../../define\";\nimport { IStateHandler } from \"../types\";\n\nexport function disconnectedCallback(\n target: object, \n _prop: PropertyKey, \n receiver: any,\n _handler: IStateHandler\n): void {\n const callback = Reflect.get(target, STATE_DISCONNECTED_CALLBACK_NAME);\n if (typeof callback === \"function\") {\n callback.call(receiver);\n }\n}\n","/**\n * updatedCallback.ts\n *\n * Utility function to invoke the StateClass lifecycle hook \"$updatedCallback\".\n *\n * Main responsibilities:\n * - Invokes $updatedCallback method if defined on the object (target)\n * - Callback is invoked with target's this context, passing IReadonlyStateProxy (receiver) as argument\n * - Executable as async function (await compatible)\n *\n * Design points:\n * - Safely retrieves $updatedCallback property using Reflect.get\n * - Does nothing if the callback doesn't exist\n * - Used for lifecycle management and update handling logic\n */\n\nimport { IAbsoluteStateAddress } from \"../../address/types\";\nimport { STATE_UPDATED_CALLBACK_NAME } from \"../../define\";\nimport { getScopedIndexes } from \"../../list/wildcardLevel\";\nimport { IStateHandler } from \"../types\";\n\n/**\n * Invokes the $updatedCallback lifecycle hook if defined on the target.\n * Aggregates updated paths and their indexes before passing to the callback.\n * @param target - Target object to check for callback\n * @param refs - Array of state property references that were updated\n * @param receiver - State proxy to pass as this context\n * @param handler - State handler (unused but part of signature)\n * @returns Promise or void depending on callback implementation\n */\nexport function updatedCallback(\n target: object,\n refs: IAbsoluteStateAddress[],\n receiver: any,\n handler: IStateHandler\n): unknown {\n const callback: unknown = Reflect.get(target, STATE_UPDATED_CALLBACK_NAME);\n let result: unknown;\n if (typeof callback === \"function\") {\n const paths: Set<string> = new Set();\n // ToDo:現状では1階層のみのワイルドカードに対応。多階層対応は後回し\n const indexesListByPath: Record<string, Array<number[]>> = {};\n for (const ref of refs) {\n // v2: ルートに 1 ツリー。他ツリー(別ルート)の ref はこの state の相対語彙で\n // 表せないので配送しない(v1 の `path@name` 合成は名前次元と一緒に消えた)\n if (ref.absolutePathInfo.stateElement !== handler.stateElement) {\n continue;\n }\n const pathInfo = ref.absolutePathInfo.pathInfo;\n const pathName = pathInfo.path;\n // D20/D21: マーカーパス(`#m<id>` セグメント = マウント私有キーの内部アドレス)は\n // マウントインスタンスの私有語彙。ルートの $updatedCallback へ素通しすると、\n // 作者に解釈不能で再初期化のたびに変わる内部 id が漏れるため配送しない\n // (`#` はパス文法で書けない文字 — ツリーパスとは構造的に衝突しない)。\n // 私有キーの可視化は devtools の overlays() 経由(プロトコル v2)。\n if (pathName.indexOf(\"#\") !== -1) {\n continue;\n }\n paths.add(pathName);\n if (pathInfo.wildcardCount > 0) {\n const indexes = getScopedIndexes(ref.listIndex!, pathInfo.wildcardCount);\n const indexesList = indexesListByPath[pathName];\n if (typeof indexesList === \"undefined\") {\n indexesListByPath[pathName] = [indexes];\n } else {\n indexesList.push(indexes);\n }\n }\n }\n result = callback.call(receiver, Array.from(paths), indexesListByPath);\n }\n // ルートのコールバックの**後**に配送する機能(ボリュームの相対 $updatedCallback — webComponent/addressHooks.ts)は\n // updated hook が受ける。hook の無い state は判定 1 個で抜ける\n const hooks = handler.stateElement?.addressHooks;\n if (hooks) {\n const updated = hooks.updated;\n for (let i = 0; i < updated.length; i++) {\n updated[i](handler.stateElement, refs, receiver);\n }\n }\n return result;\n}\n","/**\n * errorCallback.ts\n *\n * StateClass のライフサイクルフック「$errorCallback」を呼び出すユーティリティ関数。\n *\n * 主な役割:\n * - target に $errorCallback メソッドが定義されていれば、(error, info) で呼び出す\n * - this は writable な state proxy(receiver)— 作者はここで自分の state にエラーを書ける\n *\n * 設計ポイント:\n * - Reflect.get で安全に取得し、無ければ何もしない(disconnectedCallback と同型)\n * - 呼び出し元(apply/applyChangeFromBindings.ts)が drain 末尾でまとめて呼び、\n * callback 自身の throw もそこで隔離する。ここでは await しない\n */\n\nimport { STATE_ERROR_CALLBACK_NAME } from \"../../define\";\nimport { IBindingErrorInfo } from \"../../types\";\nimport { IStateHandler } from \"../types\";\n\nexport function errorCallback(\n target: object,\n error: unknown,\n info: IBindingErrorInfo,\n receiver: any,\n _handler: IStateHandler\n): void {\n const callback = Reflect.get(target, STATE_ERROR_CALLBACK_NAME);\n if (typeof callback === \"function\") {\n callback.call(receiver, error, info);\n }\n}\n","import { IStateAddress } from \"../address/types\";\nimport { IStateElement } from \"../components/types\";\nimport { raiseError } from \"../raiseError\";\nimport { assertWritable } from \"./assertWritable\";\nimport { getStateElement } from \"../stateElementByName\";\nimport { IStateHandler, IStateProxy, Mutability } from \"./types\";\nimport { get as trapGet } from \"./traps/get\";\nimport { set as trapSet } from \"./traps/set\";\nimport { ILoopContext } from \"../list/types\";\nimport { IState } from \"../types\";\nimport { MAX_LOOP_DEPTH } from \"../define\";\n\n/** 循環報告に載せるスタック末尾の段数(当事者が見える最小限) */\nconst CYCLE_REPORT_DEPTH = 8;\n\nclass StateHandler implements IStateHandler {\n private _stateElement: IStateElement;\n private _addressStack: (IStateAddress | null | undefined)[] = Array(MAX_LOOP_DEPTH).fill(undefined);\n private _addressStackIndex: number = -1;\n private _loopContext: ILoopContext | null | undefined;\n private _mutability: Mutability;\n private _untrackDepth: number = 0;\n \n constructor(\n rootNode: Node,\n mutability: Mutability\n ) {\n const stateElement = getStateElement(rootNode);\n if (stateElement === null) {\n raiseError(`StateHandler: no state tree found on this root.`);\n }\n this._stateElement = stateElement;\n this._mutability = mutability;\n }\n\n get stateElement(): IStateElement {\n return this._stateElement;\n }\n\n get mutability(): Mutability {\n return this._mutability;\n }\n\n get lastAddressStack(): IStateAddress | null {\n let address: IStateAddress | null | undefined = undefined;\n if (this._addressStackIndex >= 0) {\n address = this._addressStack[this._addressStackIndex];\n }\n if (typeof address === \"undefined\") {\n raiseError(`Last address stack is undefined.`);\n }\n return address;\n }\n\n get addressStackLength(): number {\n return this._addressStackIndex + 1;\n }\n\n get loopContext(): ILoopContext | null | undefined {\n return this._loopContext;\n }\n\n pushAddress(address: IStateAddress | null): void {\n // 上限判定は **increment より前**に行う。後にすると、深さ超過で throw した時点で\n // `_addressStackIndex` だけが進み `_addressStack[index]` は未代入のまま残る。\n // 呼び出し側(getByAddress)は `pushAddress` を try の外で呼ぶので自分では pop\n // しないが、外側フレームの finally が順に pop していき、その 1 本目が未代入の枠を\n // 引いて `Address stack at index N is undefined.` を投げる = **本来の\n // 「無限ループの疑い」という診断が巻き戻しの最中に上書きされて消える**。\n // getter の相互参照(`get a(){return this.b}` / `get b(){return this.a}`)は\n // 実際にこれを踏み、原因と無関係な文面だけが残っていた。\n if (this._addressStackIndex + 1 >= MAX_LOOP_DEPTH) {\n // 深さ超過と循環は別の原因で、助言も違う。末尾に同じパスが再登場していれば\n // getter どうしが呼び合っている(循環)、全部別パスなら単に深すぎる(正当に\n // 深いツリーの集計など)。両方を「循環の可能性」と告発していたため、循環の無い\n // 直線の木でも「相互参照を直せ」と読める文面が出ていた\n // (docs/state-recursive-path-impl-plan.md §3-2 の E2)。\n if (this._hasRepeatedAddress()) {\n raiseError(\n `[wcs/getter-cycle] Exceeded maximum address stack depth of ${MAX_LOOP_DEPTH}. ` +\n `Possible circular dependency between path getters: ${this._describeAddressCycle()}`,\n );\n }\n raiseError(\n `[wcs/getter-depth-exceeded] Exceeded maximum address stack depth of ${MAX_LOOP_DEPTH} ` +\n `with no address visited twice — the data is simply nested deeper than the engine evaluates ` +\n `in one pass. Deepest path first: ${this._describeAddressCycle()}`,\n );\n }\n this._addressStackIndex++;\n this._addressStack[this._addressStackIndex] = address;\n }\n\n /**\n * スタック末尾の繰り返し区間をパス名で示す(循環の当事者だけを見せる)。\n * 上限に達したときのみ呼ばれるので、コストは異常系に閉じている。\n */\n /**\n * スタック全体(最大 MAX_LOOP_DEPTH 段)に**同じアドレスが再登場する**か。\n *\n * 循環と深さ超過を分ける述語。パス文字列ではなくアドレスの同一性で見るのは、\n * どちらの側にも文字列では判別できない形があるため:\n * - 末尾 N 段のパス重複だけを見ると、周期が N より長い getter の輪を取り逃がす\n * (そして「重複が無い=ただ深いだけ」と**積極的に誤った断定**をしてしまう)\n * - 逆に「同じパスを別の行で読む」正当な再帰(隣接項目参照・累積 getter)は\n * パス文字列が全段同じなので、文字列で見ると循環に誤告発される\n *\n * IStateAddress は (pathInfo, listIndex) で intern されているので、真の輪だけが\n * 同じインスタンスに戻る。コストは異常系に閉じた O(MAX_LOOP_DEPTH) の Set 構築 1 回。\n */\n private _hasRepeatedAddress(): boolean {\n const seen: Set<IStateAddress> = new Set();\n for (let i = 0; i <= this._addressStackIndex; i++) {\n const entry = this._addressStack[i];\n if (!entry) {\n continue;\n }\n if (seen.has(entry)) {\n return true;\n }\n seen.add(entry);\n }\n return false;\n }\n\n /** スタック末尾の CYCLE_REPORT_DEPTH 段のパス(深い順)。診断の表示に使う。 */\n private _tailAddressPaths(): string[] {\n const paths: string[] = [];\n for (let i = this._addressStackIndex; i >= 0 && paths.length < CYCLE_REPORT_DEPTH; i--) {\n const entry = this._addressStack[i];\n if (entry) {\n paths.push(entry.pathInfo.path);\n }\n }\n return paths;\n }\n\n private _describeAddressCycle(): string {\n const paths: string[] = this._tailAddressPaths();\n const unique = Array.from(new Set(paths));\n return `${unique.reverse().join(\" -> \")} -> ...`;\n }\n\n popAddress(): IStateAddress | null {\n if (this._addressStackIndex < 0) {\n return null;\n }\n const address = this._addressStack[this._addressStackIndex];\n if (typeof address === \"undefined\") {\n raiseError(`Address stack at index ${this._addressStackIndex} is undefined.`);\n }\n this._addressStack[this._addressStackIndex] = undefined;\n this._addressStackIndex--;\n return address;\n }\n\n setLoopContext(loopContext: ILoopContext | null): void {\n this._loopContext = loopContext;\n }\n\n clearLoopContext(): void {\n this._loopContext = undefined;\n }\n\n get untracking(): boolean {\n return this._untrackDepth > 0;\n }\n\n beginUntrack(): void {\n this._untrackDepth++;\n }\n\n endUntrack(): void {\n this._untrackDepth--;\n }\n\n get(\n target : object, \n prop : PropertyKey, \n receiver: any\n ): any {\n return trapGet(target, prop, receiver, this);\n }\n\n set(\n target : object, \n prop : PropertyKey, \n value : any, \n receiver: any\n ): boolean {\n assertWritable(this);\n return trapSet(target, prop, value, receiver, this);\n }\n\n has(\n target: object, \n prop : PropertyKey\n ): boolean {\n return Reflect.has(target, prop);\n// return Reflect.has(target, prop) || this.symbols.has(prop) || this.apis.has(prop);\n }\n\n}\n\nexport function createStateProxy(\n rootNode: Node,\n state: IState,\n mutability: Mutability\n): IStateProxy {\n const handler = new StateHandler(rootNode, mutability);\n const stateProxy = new Proxy<IStateProxy>(state as IStateProxy, handler);\n return stateProxy;\n}\n\nexport const __private__ = {\n StateHandler,\n};","/**\n * set.ts\n *\n * StateClassのProxyトラップとして、プロパティ設定時の値セット処理を担う関数(set)の実装です。\n *\n * 主な役割:\n * - 文字列プロパティの場合、getResolvedPathInfoでパス情報を解決し、getListIndexでリストインデックスを取得\n * - setByRefで構造化パス・リストインデックスに対応した値設定を実行\n * - それ以外(シンボル等)の場合はReflect.setで通常のプロパティ設定を実行\n *\n * 設計ポイント:\n * - バインディングや多重ループ、ワイルドカードを含むパスにも柔軟に対応\n * - setByRefを利用することで、依存解決や再描画などの副作用も一元管理\n * - Reflect.setで標準的なプロパティ設定の互換性も確保\n */\n\nimport { getResolvedAddress } from \"../../address/ResolvedAddress\";\nimport { IStateHandler } from \"../types\";\nimport { getListIndex } from \"../methods/getListIndex\";\nimport { createStateAddress } from \"../../address/StateAddress\";\nimport { setByAddress } from \"../methods/setByAddress\";\n\nexport function set(\n target : object, \n prop : PropertyKey, \n value : any, \n receiver: any,\n handler : IStateHandler\n): boolean {\n if (typeof prop === \"string\") {\n const resolvedAddress = getResolvedAddress(prop);\n const listIndex = getListIndex(target, resolvedAddress, receiver, handler);\n const stateAddress = createStateAddress(resolvedAddress.pathInfo, listIndex);\n return setByAddress(\n target, \n stateAddress,\n value, \n receiver,\n handler\n );\n } else {\n return Reflect.set(\n target, \n prop, \n value, \n receiver\n );\n }\n}\n","/**\n * Browser builds use the native HTMLElement. Headless runtimes receive an\n * inert base so the public module can be imported without installing DOM\n * globals; constructing components remains a browser-only operation.\n */\nexport const HTMLElementBase = (\n typeof HTMLElement === \"undefined\" ? class {} : HTMLElement\n) as typeof HTMLElement;\n","/**\n * apply/reapplyStateBindings.ts — 再セットで、確立済みのバインドを新しい世代で適用し直す(#267)。\n *\n * 初期化済みの `<wcs-state>` に `setInitialState` で state を入れ直すと、読みは新しい世代を返す\n * (キャッシュの世代印と経路情報の作り直し — #258)。しかしバインドは次に依存パスが書かれるまで\n * 動かないので、画面だけが前の世代のまま残っていた。ここで、入れ直す前と後の state の\n * トップレベルのパスから依存を辿り、そこに登録されているバインドを適用し直す。\n *\n * 集め方は `$postUpdate` と同じ(起点のアドレス+依存ウォーク、リストは全行展開)。適用は drain と\n * 同じ `applyChangeFromBindings` を通すが、updater には**積まない**。再セットは書き込みではない:\n * drain 終了リスナー(`$scan` の畳み込み・`$watch`・`$streams` の依存駆動 restart)を起こさず、\n * `$updatedCallback` も呼ばない。`$watch` / `$streams` はセッタが新しい宣言で起動し直しているので、\n * restart を重ねると source が二重に起動する。\n */\nimport { liftAddress } from \"../address/liftAddress\";\nimport { getPathInfo } from \"../address/PathInfo\";\nimport { createStateAddress } from \"../address/StateAddress\";\nimport { IAbsoluteStateAddress, IPathInfo, IStateAddress } from \"../address/types\";\nimport { peekBindingsForAddress } from \"../binding/getBindingSetByAbsoluteStateAddress\";\nimport { IStateElement } from \"../components/types\";\nimport { inSsr } from \"../config\";\nimport { WILDCARD } from \"../define\";\nimport { walkDependency } from \"../dependency/walkDependency\";\nimport { getAllPropertyDescriptors } from \"../getAllPropertyDescriptors\";\nimport { beginStateListBaselineBatch, endStateListBaselineBatch } from \"../list/stateListBaseline\";\nimport { runTransition } from \"../protocol/transitionRunner\";\nimport { IBindingInfo } from \"../types\";\nimport { reportDeferredApplyFailure } from \"../updater/updater\";\nimport { applyChangeFromBindings } from \"./applyChangeFromBindings\";\n\n/**\n * 再適用の起点になるトップレベルのパス。前後**両方**の state から集める — 新しい state で消えた\n * キーのバインドも適用し直し、読めないことを「黙った古い表示」ではなく適用の失敗として報告させる。\n *\n * 除くもの: `$` の宣言面、ワイルドカードを含むキー(`\"items.*.upper\"` / `\"nodes.**.total\"` —\n * 行の getter には親のリストから静的辺で辿り着く)、メソッド。\n */\nexport function collectReapplyPaths(states: readonly (object | undefined)[]): Set<string> {\n const paths = new Set<string>();\n for (const state of states) {\n if (typeof state === \"undefined\") {\n continue;\n }\n for (const [key, descriptor] of Object.entries(getAllPropertyDescriptors(state))) {\n if (key.startsWith(\"$\") || key.includes(WILDCARD) || typeof descriptor.value === \"function\") {\n continue;\n }\n paths.add(key);\n }\n }\n return paths;\n}\n\nconst STRUCTURAL_BINDING_TYPES: ReadonlySet<string> = new Set([\"for\", \"if\", \"elseif\", \"else\"]);\n\n/**\n * 構造バインディング(for / if)を文書順で先に、値のバインディングを後に並べる。\n *\n * 再セットは全キーを一度に適用し直すので、閉じる if・消える行の中の値のバインディングも集まる。\n * それを構造より先に適用すると、新しい state では読めない(構造がこれから DOM から外す)パスを\n * 読んで偽の失敗を報告する(どちらが先に集まるかはキーの並び次第)。構造を外側から先に適用すれば、\n * 外れた中身は applyChangeFromBindings が isConnected で飛ばす。\n */\nfunction orderStructuralFirst(bindings: readonly IBindingInfo[]): IBindingInfo[] {\n const structural: IBindingInfo[] = [];\n const values: IBindingInfo[] = [];\n for (const binding of bindings) {\n if (STRUCTURAL_BINDING_TYPES.has(binding.bindingType)) {\n structural.push(binding);\n } else {\n values.push(binding);\n }\n }\n structural.sort((a, b) =>\n (a.replaceNode.compareDocumentPosition(b.replaceNode) & Node.DOCUMENT_POSITION_FOLLOWING) !== 0 ? -1 : 1);\n return structural.concat(values);\n}\n\n/**\n * `paths` は再適用の起点(`collectReapplyPaths`)。`registeredPaths` は state 要素が経路情報を\n * 登録したパス全部で、ここから行のバインドのパスを行(最後のワイルドカードのリスト要素)ごとに引く。\n */\nexport function reapplyStateBindings(\n stateElement: IStateElement,\n paths: Iterable<string>,\n registeredPaths: Iterable<string>,\n): void {\n const rowPathInfosByElementPath = new Map<string, IPathInfo[]>();\n for (const path of registeredPaths) {\n const pathInfo = getPathInfo(path);\n if (pathInfo.lastWildcardPath === null) {\n continue;\n }\n const rowPathInfos = rowPathInfosByElementPath.get(pathInfo.lastWildcardPath);\n if (typeof rowPathInfos === \"undefined\") {\n rowPathInfosByElementPath.set(pathInfo.lastWildcardPath, [pathInfo]);\n } else {\n rowPathInfos.push(pathInfo);\n }\n }\n const bindings: IBindingInfo[] = [];\n const visited = new Set<IAbsoluteStateAddress>();\n const collect = (address: IStateAddress): void => {\n const absAddress = liftAddress(stateElement, address);\n if (visited.has(absAddress)) {\n return;\n }\n visited.add(absAddress);\n const entry = peekBindingsForAddress(absAddress);\n if (entry instanceof Set) {\n bindings.push(...entry);\n } else if (typeof entry !== \"undefined\") {\n bindings.push(entry);\n }\n // 行に来たら、その行に登録された行のバインドも集める。依存グラフに辺の無い行バインドがある —\n // 再帰の生成パス(`nodes.*.total`)の静的辺は、新しい世代で実体化するまで作り直さない(State の\n // `_generatedPaths`)。同じノードオブジェクトを入れ直すと `for` は行を作り直さないので、辺を\n // 辿るだけでは行の集計が前の世代の表示のまま残る。\n if (address.listIndex !== null) {\n const rowPathInfos = rowPathInfosByElementPath.get(address.pathInfo.path);\n if (typeof rowPathInfos !== \"undefined\") {\n for (const rowPathInfo of rowPathInfos) {\n collect(createStateAddress(rowPathInfo, address.listIndex));\n }\n }\n }\n };\n // ウォークと描画が観測したリスト値は、drain と同じくまとめて確定する(list/stateListBaseline.ts)\n beginStateListBaselineBatch();\n try {\n stateElement.createState(\"readonly\", (state) => {\n for (const path of paths) {\n const address = createStateAddress(getPathInfo(path), null);\n collect(address);\n try {\n walkDependency(\n stateElement,\n address,\n stateElement.staticDependency,\n stateElement.dynamicDependency,\n stateElement.listPaths,\n state,\n \"new\",\n collect,\n );\n } catch {\n // 片方の世代にしか無いリストを辿ると、行の展開がそのリストを読めずに投げる(新しい state で\n // 消えたキーなど)。辿れなかった先は集めない。起点のバインド(`for: items`)は上で集めてあり、\n // その適用が同じ理由で失敗して `console.error` / `$errorCallback` に報告される。\n }\n }\n });\n if (bindings.length === 0) {\n return;\n }\n const ordered = orderStructuralFirst(bindings);\n const apply = (): void => {\n applyChangeFromBindings(ordered, undefined, { updatedCallback: false });\n };\n // 遷移への参加は drain と同じ(updater.ts の `_applyChange`)\n if (inSsr()) {\n apply();\n return;\n }\n const pending = runTransition(\"state\", apply);\n if (pending !== undefined) {\n pending.catch(reportDeferredApplyFailure);\n }\n } finally {\n endStateListBaselineBatch();\n }\n}\n","import { config, inSsr, isOrchestratedSsr } from \"../config\";\nimport { loadFromInnerScript } from \"../stateLoader/loadFromInnerScript\";\nimport { loadFromJsonFile } from \"../stateLoader/loadFromJsonFile\";\nimport { loadFromScriptFile } from \"../stateLoader/loadFromScriptFile\";\nimport { loadFromScriptJson } from \"../stateLoader/loadFromScriptJson\";\nimport { raiseError } from \"../raiseError\";\nimport { BindingType, IState } from \"../types\";\nimport { IStateElement } from \"./types\";\nimport { setStateElement, getStateElement, getBindingsReady, markBindingsUnavailable } from \"../stateElementByName\";\nimport { ILoopContextStack } from \"../list/types\";\nimport { createLoopContextStack } from \"../list/loopContext\";\nimport { DCC_DEFINITION_ATTRIBUTE, NO_SET_TIMEOUT, STATE_CONNECTED_CALLBACK_NAME, STATE_DISCONNECTED_CALLBACK_NAME, STATE_ERROR_CALLBACK_NAME, STATE_UPDATED_CALLBACK_NAME, WILDCARD } from \"../define\";\nimport { processCommandTokensDeclaration } from \"../command/processCommandTokensDeclaration\";\nimport { clearCommandNamespace } from \"../command/commandNamespace\";\nimport { processEventTokensDeclaration } from \"../event/processEventTokensDeclaration\";\nimport { clearEventTokenRegistry } from \"../event/eventTokenRegistry\";\nimport { processOnDeclaration } from \"../event/processOnDeclaration\";\nimport { ListKeyMap, ListKeySpec, processListKeysDeclaration } from \"../list/listKeys\";\nimport type { RecursionRegistry } from \"../recursion/registry\";\nimport { STATE_WATCH_NAME, STATE_BINDABLES_NAME } from \"../define\";\nimport { appendHooks, createAttachedHooks, IAttachedHooks, requireFeature } from \"../core/addressHooks\";\nimport { createDeclarationContext, runActivate, runApply, runApplyEarly, runDeactivate, runPreCommit, runRegister, runValidate, runValidateEarly } from \"../core/declarationHooks\";\nimport { getPathInfo } from \"../address/PathInfo\";\nimport { IStateProxy, Mutability } from \"../proxy/types\";\nimport { createStateProxy } from \"../proxy/StateHandler\";\nimport { requireLifecycleFeature, runConnecting, runDisconnecting, runInitializeFailed, runInitializeFailureCleared, runPreparing, runReconnecting, runReplacingState } from \"../core/lifecycleHooks\";\nimport { connectedCallbackSymbol, disconnectedCallbackSymbol } from \"../proxy/symbols\";\nimport { requireSsrHooks } from \"../core/ssrHooks\";\nimport { HTMLElementBase } from \"../platform/HTMLElementBase\";\nimport { getAllPropertyDescriptors } from \"../getAllPropertyDescriptors\";\nimport { findDescriptor, PathInfoSource } from \"../pathDiagnostics\";\nimport { pathDiagnostics } from \"../core/diagnosticsHooks\";\nimport { collectReapplyPaths, reapplyStateBindings } from \"../apply/reapplyStateBindings\";\n\nfunction getStateInfo(\n state: IState\n): {\n getterPaths: Set<string>,\n setterPaths: Set<string>,\n} {\n const getterPaths: Set<string> = new Set<string>();\n const setterPaths: Set<string> = new Set<string>();\n const descriptors = getAllPropertyDescriptors(state);\n for(const [ key, descriptor ] of Object.entries(descriptors)) {\n if (typeof descriptor.get === \"function\") {\n getterPaths.add(key);\n }\n if (typeof descriptor.set === \"function\") {\n setterPaths.add(key);\n }\n }\n return {\n getterPaths, setterPaths\n };\n}\n\nexport class State extends HTMLElementBase implements IStateElement {\n static hasConnectedCallbackPromise = true;\n\n static getBindingsReady(rootNode: Node): Promise<void> {\n return getBindingsReady(rootNode);\n }\n\n /**\n * `mount` の動的変更は未サポート(再マウントは非目標 — 設計書 §4-7)。\n * 初期化済み要素での変更は無言で捨てず warn で知らせる。初期化前の属性設定\n * (パース時・接続前の setAttribute)は正規の使い方なので黙る。\n * `name` は connectedCallback 冒頭で fail-fast 済みなので観測しない。\n */\n static get observedAttributes(): string[] {\n return [\"mount\"];\n }\n\n private __state: IState | undefined;\n private _hasUpdatedCallback: boolean = false;\n /** $errorCallback の有無(_hasUpdatedCallback と同じく state セット時に確定。ルートのみ) */\n private _hasErrorCallback: boolean = false;\n /** enable-ssr のスナップショットから初期化された(D14: ボリュームはデータを採用する) */\n private _hydratedFromSsr: boolean = false;\n // 他行を読む getter が検出されたリストパス(diff-filter 展開の全行フォールバック対象)。\n // 依存マップ(static/dynamic)と同様に追加のみ・クリアしない(安全側に固定される)。\n private _crossRowListPaths: Set<string> = new Set<string>();\n // $1 等のインデックスを読んだ getter パス(実行時検出)。位置のみ変わった行の\n // 静的子展開はこの集合の subtree に限定される。追加のみ・クリアしない(安全側)。\n private _indexDependentGetterPaths: Set<string> = new Set<string>();\n private _initialized: boolean = false;\n /**\n * 初期化(`_initialize`)が失敗した(#257)。`_initialized` の裏返しではない —\n * 「まだ初期化していない」と「もう初期化できない」を取り違えると、復旧不能の\n * 要素に `setInitialState` が効いたように見える。真にするのは\n * `_failInitializeLoudly` だけ。\n */\n private _initializeFailed: boolean = false;\n /**\n * この接続サイクルの失敗は**もう着地した**(#257)。設定エラーの fail-fast\n * (`_failInitialization` と `initializeMountScope` の catch)は自分で promise を\n * 解決してから raise する — connectedCallbackPromise を**解決**する側のクラスなので、\n * 下の loud な着地(reject + 診断)に載せ替えると意味論が変わる。接続ごとに畳む。\n */\n private _initializationLanded: boolean = false;\n private _initializePromise: Promise<void>;\n private _resolveInitialize: (() => void) | null = null;\n private _connectedCallbackPromise: Promise<void>;\n private _resolveConnectedCallback: (() => void) | null = null;\n private _rejectConnectedCallback: ((reason?: unknown) => void) | null = null;\n private _loadingPromise: Promise<void>;\n private _resolveLoading: (() => void) | null = null;\n private _setStatePromise: Promise<Record<string, any>> | null = null;\n private _resolveSetState: ((value: Record<string, any>) => void) | null = null;\n private _listPaths: Set<string> = new Set<string>();\n private _listKeys: ListKeyMap | null = null;\n private _recursionRegistry: RecursionRegistry | null = null;\n private _elementPaths: Set<string> = new Set<string>();\n private _getterPaths: Set<string> = new Set<string>();\n private _setterPaths: Set<string> = new Set<string>();\n // v2: 境界ホップがループ文脈を継承するので Δ(base depth)の帳簿は無い\n private _loopContextStack: ILoopContextStack = createLoopContextStack();\n private _dynamicDependency: Map<string, string[]> = new Map<string, string[]>();\n private _staticDependency: Map<string, string[]> = new Map<string, string[]>();\n private _pathSet: Set<string> = new Set<string>();\n /**\n * state の世代(issue #258 の X10)。`_state` の差し替えごとに 1 つ進み、キャッシュ項目の\n * 印になる(cache/types.ts の `generation`)。`_version`(更新サイクルの番号)とは別の\n * カウンタで、増える条件が違う — 再セットは世代だけを進める\n * (`__tests__/integration.stateGenerationReset.test.ts` の\n * 「再セットは世代だけを進め、version は動かさない」が固定する)。\n */\n private _stateGeneration: number = 0;\n /**\n * この要素が受け取った `setPathInfo` の台帳(issue #258 の X7)。パス → 種別と呼び出し元。\n *\n * `_pathSet` / `_listPaths` / `_elementPaths` は再セットでクリアされるが、それらを登録した\n * バインドは生き残る(再セットは DOM を作り直さない)。台帳が空のままだと依存ウォークが\n * `items` をリストとして展開できず、全リスト書き込みが「非リストのアドレスにワイルドカードを\n * 展開できない」で恒久的に throw する(値と DOM は追従するが、書き込みのたびに投げ続ける)。\n * クリアのあと、この台帳から作り直す(`_rebuildPathInfo`)。\n *\n * `source === \"internal\"`(再帰の生成アクセサ・ボリュームのツリーアクセサ)は載せない。\n * あれらは生やした機構が新しい世代で登録し直す(recursion/registry.ts の `_define`)。\n *\n * `bound` はバインドがいちどでも登録したか(#270)。作り直しで存在検査をやり直すのはバインドの\n * パスだけ — `$watch` / `$scan` の登録は前の世代の宣言の残骸でもあり、今の世代の宣言は\n * 作り直しの後で自分の検査をする(`processWatchDeclaration` / `registerScans`)。残骸まで\n * 検査すると、新しい宣言から外したパスを「存在しない」と誤って報告する。\n */\n private _pathRegistrations: Map<string, { bindingType: BindingType; bound: boolean }> =\n new Map<string, { bindingType: BindingType; bound: boolean }>();\n /**\n * 切断中の再セットで適用し直せなかったトップレベルのパス(#267)。再適用には rootNode が要るので、\n * 再接続で `reapplyStateBindings` に渡す。切断中に何度入れ直しても和集合で持つ\n * (前の世代にしか無いキーのバインドも失敗として報告させるため)。\n */\n private _pendingReapplyPaths: Set<string> | null = null;\n /**\n * これまでのどの世代かで再帰レジストリが実体化した具体パス(`nodes.*.total` 等)の累積。\n * 再セットのたびに `forgetGenerated` の戻り値を足し、`_rebuildPathInfo` の除外に使う。\n *\n * 除外は**世代を跨いで累積する**。読みを挟まない連続した再セットでも、生成アクセサの具体パスを\n * 指す静的辺(`nodes.*` → `nodes.*.total`)が戻らないことは、\n * `__tests__/integration.stateGenerationReset.test.ts` の\n * 「読みを挟まない 3 連続の再セットで静的辺が戻らない」が固定する。\n */\n private _generatedPaths: Set<string> = new Set<string>();\n // `$watch` 宣言の監視対象パス。宣言が無ければ null(setByAddress のゼロコスト契約)\n private _watchPaths: ReadonlySet<string> | null = null;\n private _scanPaths: ReadonlySet<string> | null = null;\n private _version = 0;\n private _rootNode: Node | null = null;\n private _boundComponent: Element | null = null;\n private _boundComponentStateProp: string | null = null;\n private _hasMounts: boolean = false;\n private _hasGraftedVolumes: boolean = false;\n /** 読み書き境界の hook(設計案 H1)。宣言が要求する機能の分だけ付く */\n private _addressHooks: IAttachedHooks | null = null;\n // ボリューム(mount=)の控え(接ぎ木情報・枠・再入ガード)は webComponent/volumeLifecycle.ts が\n // 要素ごとに持つ(設計案 H3 — State はボリュームを知らない)\n private _bindableEventMap: Record<string, string> = {};\n private _commandTokenNames: Set<string> = new Set<string>();\n private _eventTokenNames: Set<string> = new Set<string>();\n // 自分のツリーを持たずに初期化を終えた(DCC 定義要素 — dcc/dccLifecycle.ts)。再接続でこの rootNode の\n // ツリーとして登録し直さない\n private _treeless: boolean = false;\n // connect サイクルの世代カウンタ(connectedCallback 冒頭でインクリメント)。\n // $connectedCallback の await 中の「切断 → 即再接続」では、新 connect が\n // _rootNode を再設定済みのため陳腐化した旧 connect の再開が _rootNode ガードを\n // 素通りして startStreams に到達し、同一の再接続に対して source が二重起動する。\n // 末尾で冒頭に捕捉した世代と照合し、陳腐 connect からの起動を skip する(設計書 §2-3)。\n private _connectGeneration: number = 0;\n\n constructor() {\n super();\n this._initializePromise = new Promise<void>((resolve) => {\n this._resolveInitialize = resolve;\n });\n this._connectedCallbackPromise = new Promise<void>((resolve, reject) => {\n this._resolveConnectedCallback = resolve;\n this._rejectConnectedCallback = reject;\n });\n this._loadingPromise = new Promise<void>((resolve) => {\n this._resolveLoading = resolve;\n });\n this._setStatePromise = new Promise<Record<string, any>>((resolve) => {\n this._resolveSetState = resolve;\n });\n }\n\n private get _state(): IState {\n if (typeof this.__state === \"undefined\") {\n raiseError(`${config.tagNames.state} _state is not initialized yet.`);\n }\n return this.__state;\n }\n\n private set _state(value: IState) {\n // 旧世代のデータ。再帰の生成物(辺・キャッシュ)を忘れるとき、台帳を辿る起点になる\n const previousState = this.__state;\n // 順序: **`value` しか読まない検証** → 旧世代の後始末 → 世代を進める → 差し替え → 再収集。\n //\n // 宣言の検証は世代更新を挟んで 2 群に割れる。\n // - 世代を進める**前**に走る 5 つ: `$recursion`(宣言とレジストリの構築)・`$commandTokens`・\n // `$eventTokens`・`$listKeys`・`$scan`。どれも `value` しか読まないのでここへ置ける。この 5 つで\n // throw した再セットは世代を進めず、`__state` も旧世代の読みもそのまま残る。\n // - 世代を進めた**後**に走る 3 つ: `$on`(下・`_eventTokenNames` と token registry を要る)・\n // `$streams`・`$watch`。この 3 つで throw した再セットは、世代が進んで `__state` も\n // 新しくなった後に落ちる。\n // throw の後に何が残るかは検証ごとに違う。散文で言い直さない —\n // `__tests__/integration.stateGenerationReset.test.ts` が 1 つずつ固定する。\n //\n // 後の 2 つがこの位置に要る理由(同じファイルが 1 本ずつ固定する):\n // - `$streams` の衝突検査は**新しい** value から集め直した `getterPaths` / `setterPaths` を\n // 見る(旧 state だけが持つ getter は、新 state の同名 `$streams` と衝突しない)。\n // - `$watch` の存在検査は**新しい** `__state` を見る(新 state にだけあるパスの watch は\n // `wcs/watch-path-missing` にならない)。\n // 宣言の段(設計案 H4)。文脈袋はこの set のぶんだけ作り、機能どうしの受け渡しに使う。\n // `$recursion` はここで解析され、構築したレジストリを袋に置く — `$scan` の検証がそれを読む\n const declarations = createDeclarationContext();\n declarations.set(\"previousState\", previousState);\n runValidateEarly(this, value, declarations);\n const commandTokenNames = processCommandTokensDeclaration(value);\n const eventTokenNames = processEventTokensDeclaration(value);\n // $listKeys の検証は `value` しか読まない(要素にも旧世代にも触れない)ので、ここで済ませる。\n // 反映は下の所定位置のまま(クリアと再収集の並びは変えない)。\n const listKeys = processListKeysDeclaration(value);\n // 検証の段(設計案 H4 の validate): 世代を進める前の、`value` しか読まない段。ここで throw した\n // 再セットは世代を進めない。core が作ったトークン名を袋へ publish する(`$scan` の検証が読む)\n declarations.set(\"eventTokenNames\", eventTokenNames);\n runValidate(this, value, declarations);\n // 検証がすべて済み、まだ世代を進めていない点(設計案 H4 の preCommit): 旧世代の後始末と\n // 差し替えがここに載る(`$recursion` — recursion/declarations.ts)\n runPreCommit(this, value, declarations);\n this._commandTokenNames = commandTokenNames;\n this._eventTokenNames = eventTokenNames;\n // 世代を進める(issue #258 の X10)。位置は「旧世代の後始末(forgetGenerated)の**後**・\n // `__state` の差し替えの**前**」。上の 5 つ(`value` しか読まない検証)で throw した再セットは\n // ここへ到達しないので、要素は丸ごと旧世代に留まる — 世代も、旧世代のキャッシュが返す読みも\n // 据え置き(同ファイルの「throw する再セットは世代を進めない」4 本が固定する)。\n this._stateGeneration++;\n this.__state = value;\n // 存在検査の台帳も世代に属する(#270)。「パスごとに 1 回」の印を前の世代から持ち越すと、\n // 下の経路情報の作り直しが新しい state で検査し直さない。初回のセットには捨てるものが無い\n if (typeof previousState !== \"undefined\") {\n pathDiagnostics?.reset(this);\n }\n // $updatedCallback の有無を state セット時に確定しておく(in はプロトタイプ\n // チェーンも見る・getter を評価しない)。drain 側はこのフラグで更新アドレスの\n // 集計と writable createState をスキップできる。\n // 注: state セット後に生オブジェクトへ直接 $updatedCallback を後付けする\n // パターンは検知できない(bindProperty / _state 再セットは検知する)。\n // ライフサイクルフックは宣言時に定義するのが規約。\n this._hasUpdatedCallback = STATE_UPDATED_CALLBACK_NAME in value;\n this._hasErrorCallback = STATE_ERROR_CALLBACK_NAME in value;\n // 再 set 時に二重 subscribe しないよう registry をクリアしてから $on を配線し直す。\n clearEventTokenRegistry(this);\n // 差し替え直後の段(設計案 H4 の applyEarly): `$on` の配線より前に走る(`$scan` の出力の実体化と\n // 購読 — 同じトークンでは reducer → effect の順、D11。scan/declarations.ts)\n runApplyEarly(this, value, declarations);\n processOnDeclaration(this, value, this._eventTokenNames);\n this._listPaths.clear();\n this._elementPaths.clear();\n this._getterPaths.clear();\n // 再 set 時の残骸が $streams の衝突検査(processStreamsDeclaration)に\n // 偽陽性で命中しないよう getterPaths と対称にクリアする。\n this._setterPaths.clear();\n this._pathSet.clear();\n const stateInfo = getStateInfo(value);\n for(const path of stateInfo.getterPaths) {\n this._getterPaths.add(path);\n }\n for(const path of stateInfo.setterPaths) {\n this._setterPaths.add(path);\n }\n // 宣言の反映(設計案 H4 の apply): パス収集の後に走る段。`$streams` の衝突検査が\n // 新しい getterPaths / setterPaths を見るので、この位置でなければならない(stream/streamRuntime.ts)\n runApply(this, value, declarations);\n // $listKeys: 宣言が無ければ null のままで、setByAddress のキー突合経路には\n // 一切入らない(docs/state-list-key-design.md §7-1)。再 set で必ず置き換える。\n this._listKeys = listKeys;\n // 生きているバインドの経路情報を作り直す(issue #258 の X7)。置き場所は\n // `_pathSet` / `_listPaths` / `_elementPaths` のクリアより後、startWatch / startStreams より前。\n // 上で存在検査の台帳を捨てているので、バインドのパスはここで新しい state に対して検査し直され、\n // 第 2 世代で消えたバインド先が報告される(#270 — `__tests__/integration.stateGenerationReset.test.ts`\n // の末尾が固定する)。\n this._rebuildPathInfo();\n // 依存グラフ登録の段(設計案 H4 の register): `_rebuildPathInfo` と `$scan` の登録の後。\n // `$watch` はここで宣言を解析し直す(watch/watchRuntime.ts)\n runRegister(this, value, declarations);\n // 接続中の再 set(S13)は新宣言で即再起動する(設計案 H4 の activate)。起動の可否・\n // 二重起動ガード・SSR の除外は機能側が持つ。初回(_initialize 中)は初期化前なので\n // ここでは起動されず、接続の末尾の activate が担う\n runActivate(this, null);\n this._resolveLoading?.();\n }\n\n attributeChangedCallback(_name: string, oldValue: string | null, newValue: string | null): void {\n // observedAttributes は \"mount\" のみ。同値 set(oldValue === newValue)は変更ではない\n if (!this._initialized || oldValue === newValue) {\n return;\n }\n console.warn(\n `[@wcstack/state] Changing the \"mount\" attribute after initialization is not supported and is ignored ` +\n `(was ${oldValue === null ? \"absent\" : `\"${oldValue}\"`}, now ${newValue === null ? \"absent\" : `\"${newValue}\"`}). ` +\n `Remove this <${config.tagNames.state}> element and create a new one with the desired mount path instead.`,\n );\n }\n\n private _loadFromSsrElement(): IState | null {\n if (!this.hasAttribute('enable-ssr')) return null;\n // `<wcs-ssr>` に載った state データの読み出しは SSR 機能(ssr/install.ts)。未 install なら名指しで落とす\n return requireSsrHooks(`the \"enable-ssr\" attribute`).loadState(this) as IState | null;\n }\n\n /** state / src / json / inner <script> / API set のソース解決(_initialize とボリュームで共用)。 */\n private async _loadStateFromSource(): Promise<Record<string, any>> {\n try {\n if (this.hasAttribute('state')) {\n const state = this.getAttribute('state');\n return loadFromScriptJson(state!);\n } else if (this.hasAttribute('src')) {\n const src = this.getAttribute('src');\n if (src && src.endsWith('.json')) {\n return await loadFromJsonFile(src);\n } else if (src && src.endsWith('.js')) {\n return await loadFromScriptFile(src);\n } else {\n raiseError(`Unsupported src file type: ${src}`);\n }\n } else if (this.hasAttribute('json')) {\n const json = this.getAttribute('json');\n return JSON.parse(json!);\n } else {\n const script = this.querySelector<HTMLScriptElement>('script[type=\"module\"]');\n if (script) {\n // sourceURL ラベル。v2 はルートに 1 ツリーなので名前次元は無く、要素の\n // タグ名(DCC 経路が host のタグ名を渡すのと同じ流儀)で特定十分\n return await loadFromInnerScript(script, config.tagNames.state);\n } else {\n const timerId = setTimeout(() => {\n // v2: name 属性は撤去済み(fail-fast)— 文言に name を出さない(tagName で特定十分)\n console.warn(`[@wcstack/state] Warning: No state source found for <${config.tagNames.state}> element.`);\n }, NO_SET_TIMEOUT);\n // 要注意!!!APIでセットする場合はここで待機する必要がある --(1)\n const state = await this._setStatePromise!;\n clearTimeout(timerId);\n return state;\n }\n }\n } catch(e) {\n raiseError(`Failed to initialize state: ${e}`);\n }\n }\n\n /**\n * 初回マウントのロードと登録。戻り値は「この接続で初期化を**完了**したか」で、\n * `false` は失敗ではなく**中断**(ロード中に要素が剥がされた — 下の注記)。\n */\n private async _initialize(): Promise<boolean> {\n // enable-ssr (クライアント側のみ): <wcs-ssr> から初期データを取得\n const ssrState = !inSsr() ? this._loadFromSsrElement() : null;\n if (ssrState !== null) {\n // ボリュームの接ぎ木が「採用」へ切り替わる根拠(D14)。データ merge より先に立てる\n this._hydratedFromSsr = true;\n }\n this._state = await this._loadStateFromSource();\n // SSR データがある場合、state 定義(メソッド/getter)を維持しつつデータ値を上書き\n if (ssrState !== null && this.__state) {\n for (const [key, value] of Object.entries(ssrState)) {\n if (key in this.__state) {\n const desc = Object.getOwnPropertyDescriptor(this.__state, key);\n // getter/setter はスキップ(定義側を優先)\n if (desc && (desc.get || desc.set)) continue;\n // 関数はスキップ\n if (typeof this.__state[key] === 'function') continue;\n }\n this.__state[key] = value;\n }\n }\n await this._loadingPromise;\n if (this._rootNode === null) {\n // ロード中に剥がされた(行プールの張り直し・DOM の移動・shadow の組み直し)。\n // これは初期化の**失敗ではなく中断**である: 作者のミスは 1 つも無く、state も\n // 健全。診断を出さず、要素を毒化せず(_initializeFailed を立てず)、\n // connectedCallbackPromise も拒否せずに、この接続だけを黙って終わらせる。\n //\n // 拒否してはいけない理由は取り返しのつかなさ: promise はコンストラクタで\n // 1 度だけ作られるので、一度拒否すると**付け直して正常に初期化できた要素**まで\n // 永久に「失敗」を報告し続け、それを待つ @wcstack/server の renderToString と\n // @wcstack/testing の mount が健全なページで throw する。\n // 付け直した接続が改めてここへ来て、通常どおり登録と解決を行う。\n return false;\n }\n setStateElement(this._rootNode, this);\n return true;\n }\n\n /**\n * 設定エラーでの fail-fast。initializePromise 等を解決してから raise する —\n * 未解決のまま投げると waitForStateInitialize(ホストの buildBindings)が\n * この要素を待ち続け、**ページ全体が無言でウェッジする**(1 つの設定ミスが\n * 無関係なバインディングまで道連れにする)。エラー自体は unhandled rejection\n * として loud に残る。\n */\n private _failInitialization(message: string): never {\n // 着地はここで完了(connectedCallback の catch が二重に着地させない — #257)\n this._initializationLanded = true;\n // _initialized は立てない — 切断時の後始末(createState を要する)が\n // 未ロードの state を触らないよう、初期化前ガードに掛かるままにする\n this._resolveInitialize?.();\n this._resolveLoading?.();\n this._resolveConnectedCallback?.();\n raiseError(message);\n }\n\n /**\n * `_initialize` の失敗の着地(#257)。旧挙動は「throw が connectedCallback の外へ\n * 出るだけ」で、`_initializePromise` も `_connectedCallbackPromise` も永久に未解決の\n * まま残り、作者が受け取るのは診断ではなく無言のハングだった。載るのは\n * `_initialize` が投げうるもの全部 — `_state` セッタの宣言検証($recursion /\n * $commandTokens / $eventTokens / $on / $streams / $listKeys / $watch)、\n * `_loadStateFromSource` のロード失敗(src の拡張子・json のパース・内包スクリプト・\n * 外部モジュール)、SSR データの merge、そして `setStateElement` の\n * 「1 rootNode 1 ツリー」違反(**別の**要素が 2 本目に来た形 — 同じ要素の再登録は\n * 冪等なので、ロード中の remove → append はここへ来ない)。\n *\n * 載**らない**もの: ロード中に要素が剥がされた形。作者のミスが 1 つも無いので\n * 初期化失敗ではなく中断として扱う(`_initialize` が `false` を返す)。\n *\n * もう 1 つ載らないのがボリューム(`mount=`)の失敗。`_initializeVolume` の catch が\n * 3 つの promise(initialize / loading / connectedCallback)を自分で解決してから raise し、\n * `connectedCallback` のボリューム分岐はそれを包まないので、ボリュームはこの着地に\n * 載らず connectedCallbackPromise を**拒否しない**。自前の報告が出るかどうかは失敗の\n * 種類による。報告が無い形では、逃げ方は `name=`(`_failInitialization` の注記)と\n * 同じで、throw はカスタム要素リアクションが捨てる戻り Promise へ出ていく\n * (ブラウザのコンソールには \"Uncaught (in promise)\" として残るが、promise を待つ側\n * = renderToString・mount・テストレシピには届かない)。失敗箇所ごとの正確な挙動は\n * `__tests__/integration.initFailureDiagnostics.test.ts` が固定している。挙動はこの\n * PR では変えない(枠の寿命は別 Issue)。\n *\n * `connectedCallback` が `_initialize` より前に await する 2 つ\n * (DCC の接続 — dcc/dccLifecycle.ts が内部面の `failInitializeLoudly` で載せる — と、\n * `bind-component` の preparing)の raise も同じ着地に載る。\n * 特に「初期化に失敗した要素の再接続」は `bindWebComponent` → `setInitialState` の\n * 復旧不能 raise でそこへ来るので、包まないと診断ゼロで素通りする。\n *\n * `_failInitialization`(設定エラーの fail-fast)との違いは 1 つ:\n * **connectedCallbackPromise を reject する**。ここまで来た要素は state を 1 つも\n * 持たない = このツリーは存在しない。resolve すると、それを待つ消費者\n * (@wcstack/server の renderToString・@wcstack/testing の mount・README の\n * テストレシピ)に「準備完了」と嘘をつく。下の SSR 経路(_rejectConnectedCallback)と\n * 同じ規範で、そちらと同じく**元のエラーをそのまま**投げ直す。\n *\n * `initializePromise` は従来どおり**解決**する(reject しない)。\n * `waitForStateInitialize` はページ中の全 `<wcs-state>` の initializePromise を\n * `Promise.all` で待つので、reject にすると 1 要素の設定ミスが無関係な\n * バインディングまで道連れになる(_failInitialization の注記と同じ理由)。\n *\n * 後始末はしない: `_initialized` を立てないので `disconnectedCallback` は初期化前\n * ガードで抜ける。`$listKeys` / `$watch` のようにセッタの後半で落ちた形では\n * `$on` の購読と stream registry が残るが、この要素は復旧不能(setInitialState が\n * throw する)なので、残骸は要素ごと捨てる前提で放置する。\n *\n * `ownsTree` が false の着地は、この要素だけを失敗させてルートに触らない。`mount=` の\n * readiness barrier(要件 D23)が使う: ボリュームはツリーの持ち主ではなく、ルートより先に\n * 接続したボリュームでは rootNode にまだ誰も居ないので、既定の着地だとまだ来ていないルートの\n * ノードを利用不能と印付けし、保留中の他のボリュームまで落としてしまう。\n */\n private _failInitializeLoudly(error: unknown, ownsTree: boolean = true): never {\n if (this._initializationLanded) {\n // 設定エラーの fail-fast が自分で着地済み(promise は解決済み)。ここで\n // reject に載せ替えると「ページの残りは生きている設定ミス」と「state を 1 つも\n // 持たない要素」を混ぜることになるので、伝播だけさせる\n throw error;\n }\n this._initializeFailed = true;\n // 診断は必ず 1 件出す。カスタム要素リアクションは connectedCallback の戻り\n // Promise を捨てるので、ブラウザの \"Uncaught (in promise)\" 以外に受け手が居ない\n console.error(`[@wcstack/state] <${config.tagNames.state}> failed to initialize.`, error);\n this._resolveInitialize?.();\n this._resolveLoading?.();\n // reject より先に handled を立てる。DOM 駆動のマウントでは\n // connectedCallbackPromise を誰も await しないため、印が無いと\n // unhandled rejection になる(Node ではプロセスごと落ちる)\n this._connectedCallbackPromise.catch(() => undefined);\n this._rejectConnectedCallback?.(error);\n // このツリーは存在しない。ready を即時解決のまま残すと waitForReady\n // (@wcstack/server)が「バインド構築済み」と報告し、保留中のボリュームは\n // ルート登録が来ないので永久に未解決のまま残る。\n // 生きたルートが既にこの rootNode に居る形(2 本目の <wcs-state> = v2 の\n // 「1 rootNode 1 ツリー」違反)では、ページは 1 本目で成立している —\n // ready も保留ボリュームも 1 本目のものなので触らない\n if (ownsTree && this._rootNode !== null && getStateElement(this._rootNode) === null) {\n markBindingsUnavailable(this._rootNode, error);\n // このルートを待っている機能(保留中のボリューム)に知らせる(設計案 H3)\n runInitializeFailed(this, this._rootNode, error);\n }\n throw error;\n }\n\n\n\n private async _callStateConnectedCallback(): Promise<void> {\n await this.createStateAsync(\"writable\", async (state) => {\n // stateに\"$connectedCallback\"があるか確認し、connectedCallbackAPIを呼び出す\n if (STATE_CONNECTED_CALLBACK_NAME in state) {\n await state[connectedCallbackSymbol]();\n }\n });\n }\n\n private _callStateDisconnectedCallback(): void {\n this.createState(\"writable\", (state) => {\n // stateに\"$disconnectedCallback\"があるか確認し、disconnectedCallbackAPIを呼び出す\n if (STATE_DISCONNECTED_CALLBACK_NAME in state) {\n state[disconnectedCallbackSymbol]();\n }\n });\n }\n\n async connectedCallback() {\n this._rootNode = this.getRootNode() as Node;\n // connect 世代を進めて冒頭で捕捉する(末尾の startStreams 前に照合し、\n // $connectedCallback の await 中に「切断 → 即再接続」された陳腐 connect の\n // 再開からの起動を防ぐ)。前回接続中の再 set(S13)で立った\n // _streamsStartedGeneration も世代不一致となり自然に無効化される。\n const connectGeneration = ++this._connectGeneration;\n // 着地の印は接続ごとに畳む(前の接続の fail-fast をこの接続へ持ち越さない — #257)\n this._initializationLanded = false;\n if (!this._initialized) {\n // 名前次元は v2 で撤去(D16 / §9)。名前付き State はボリュームへ移行する。\n // mount 併記(移行途中で name を残した形)は専用文言で誘導する\n if (this.hasAttribute(\"name\")) {\n this._failInitialization(\n this.hasAttribute(\"mount\")\n ? `\"mount\" replaces \"name\" — a volume has no name of its own. Remove the name attribute.`\n : `The \"name\" attribute was removed in v2 — there is a single state tree per root. ` +\n `Mount this state onto the tree instead: <wcs-state mount=\"${this.getAttribute(\"name\")}\" ...> ` +\n `and read it as \"${this.getAttribute(\"name\")}.<path>\".`,\n );\n }\n // この接続を引き取る機能(DCC 定義要素 — dcc/dccLifecycle.ts、ボリューム `mount=` —\n // webComponent/volumeLifecycle.ts。設計案 H3。聞く順は DCC → ボリュームで、従来の分岐順どおり)。\n // 引き取った機能がこの接続の初期化を所有する(promise を返すのは引き取ったときだけなので、\n // 引き取り手の無い素の state に microtask の境界は増えない)\n const claimed = runConnecting(this);\n if (claimed !== null) {\n await claimed;\n return;\n }\n // 引き取り手の居ない宣言 = その機能が未 install(readiness barrier、H5 / D13)。\n // full / auto では bootstrapState() が install するので起きない。どちらも初期化失敗として\n // 着地させる(要件 D23): throw するだけだと connectedCallbackPromise が未解決のまま残り、\n // それを待つ renderToString・mount・getBindingsReady が止まる\n const parentNode = this.parentNode;\n if (parentNode instanceof ShadowRoot && parentNode.host.hasAttribute(DCC_DEFINITION_ATTRIBUTE)) {\n try {\n requireLifecycleFeature(\"dcc\", `a <${config.tagNames.state}> inside a [${DCC_DEFINITION_ATTRIBUTE}] host`);\n } catch (error) {\n // DCC のロード失敗(dcc/dccLifecycle.ts)と同じ着地\n this._failInitializeLoudly(error);\n }\n }\n if (this.hasAttribute(\"mount\")) {\n try {\n requireLifecycleFeature(\"scopes\", `the \"mount\" attribute`);\n } catch (error) {\n // ボリュームはツリーの持ち主ではないので、ルートを巻き込まない着地\n this._failInitializeLoudly(error, false);\n }\n }\n // 接続の前処理(設計案 H3 の preparing)。`bind-component` はここで走り、マウントスコープを\n // 組んだときだけこの要素を丸ごと引き取る(webComponent/bindComponentLifecycle.ts)\n let prepared = false;\n try {\n // 引き取り手が無くても await する: 従来この位置には必ず `await this._initializeBindWebComponent()`\n // があり、素の state でも microtask の境界が 1 つ入っていた。同期にすると、内包スクリプトの\n // ロードのようにその境界に依存する経路が時間切れになる(実測)。接続は 1 要素 1 回なので費用は無い\n const preparing = runPreparing(this);\n if (preparing === null && this.hasAttribute(\"bind-component\")) {\n // 引き取り手の居ない `bind-component` = スコープ機能が未 install(readiness barrier、H5 / D13)。\n // 黙って素の state にしない。bind-component の他の設定エラーと同じく下の着地に載る\n requireLifecycleFeature(\"scopes\", `the \"bind-component\" attribute`);\n }\n prepared = await (preparing ?? false);\n } catch (error) {\n // bind-component の raise も同じ着地に載せる(#257)。とりわけ「初期化に\n // 失敗した要素の再接続」は bindWebComponent → setInitialState の復旧不能\n // raise でここへ来る — _initialize の外なので、包まないと素通りする。\n // 自分で着地済みの fail-fast(_failInitialization / initializeMountScope)は\n // _failInitializeLoudly の先頭で弾かれ、従来どおり伝播するだけ\n this._failInitializeLoudly(error);\n }\n if (prepared) {\n return;\n }\n let completed = false;\n try {\n completed = await this._initialize();\n } catch (error) {\n // ここが唯一の無防備な await だった(#257)。throw は下の 2 行と\n // 末尾の _resolveConnectedCallback を飛ばし、両 promise を永久未解決にする\n this._failInitializeLoudly(error);\n }\n if (!completed) {\n // ロード中に剥がされた = 失敗ではなく中断(_initialize の注記)。promise は\n // 未解決のまま残し、付け直した接続にそのまま解決させる\n return;\n }\n this._initialized = true;\n\n this._resolveInitialize?.();\n } else if (runReconnecting(this)) {\n // 再接続を引き取った機能(初期化済みボリューム — webComponent/volumeLifecycle.ts。設計案 H3)\n this._resolveConnectedCallback?.();\n return;\n } else if (!this._treeless && getStateElement(this._rootNode) !== this) {\n // 再接続(disconnect で名前登録が解除された後の再 connect): 登録を復元する。\n // 自分のツリーを持たない要素(DCC 定義要素)は登録しない。\n // createState が rootNode 経由でこの要素を解決できるようにするために必要\n // ($connectedCallback の再実行と $streams の initial からの再起動が依存する、設計書 §2-3)。\n setStateElement(this._rootNode, this);\n }\n // 切断中に入れ直した state を、戻ってきた rootNode のバインドへ適用する(#267)。上の登録より\n // 後であること — 適用は rootNode から state 要素を引く\n if (this._pendingReapplyPaths !== null) {\n const paths = this._pendingReapplyPaths;\n this._pendingReapplyPaths = null;\n this._reapplyBindings(paths);\n }\n // enable-ssr (クライアント側): SSR で $connectedCallback 済みなのでスキップ\n // inSsr() (サーバー側): レンダリング中なので実行する\n // 世代ガード(connectGeneration 照合): ロード完了前の remove → append では\n // _initialize が 2 本同時に走り、**負けたほうもここまで到達する**(登録は冪等に\n // 弾かれるだけで tail は止まらない)。ガードが無いと作者の $connectedCallback が\n // 1 接続につき 2 回走り、副作用も 2 回出る。下の startWatch / startStreams と\n // 同じ規範で、起動点を最新の connect に一本化する\n if ((!this.hasAttribute('enable-ssr') || inSsr())\n && connectGeneration === this._connectGeneration) {\n await this._callStateConnectedCallback();\n }\n\n // サーバーモード + enable-ssr: バインディング完了後に <wcs-ssr> を生成。\n // orchestrated(サーバー主導の最終パス、docs/ssr-router-design.md §5)では\n // 生成しない — renderToString が全要素の完了後にまとめて生成するため。\n // ここで生成すると、router 等が後から挿入した内容の構造テンプレートを\n // 取り逃がすレースがある(state のロード方式と文書順に依存)\n if (inSsr() && this.hasAttribute('enable-ssr') && !isOrchestratedSsr()) {\n try {\n // `<wcs-ssr>` の生成は SSR 機能(ssr/install.ts)。バインディング完了を待つのも機能側\n await requireSsrHooks(`the \"enable-ssr\" attribute`).emitSnapshot(this);\n } catch (error) {\n // reject を配管しないと _connectedCallbackPromise が永久に未解決になり、\n // renderToString が mutex を握ったまま connectedCallbackPromise 待ちで\n // 無言ハングする。getBindingsReady の reject 化(設計書 §8.2)を\n // SSR の消費者(render.ts)まで届けるための対。\n this._rejectConnectedCallback?.(error);\n throw error;\n }\n }\n\n // $streams の eager 起動($connectedCallback 完了後、設計書 §2-3)。\n // inSsr() 時は起動しない(SSR 出力には initial が乗る、§7-1)。\n // enable-ssr のクライアント側は $connectedCallback をスキップしても起動する\n // (stream はシリアライズ不能なランタイム副作用のため)。\n // $connectedCallback 完了後の起動(設計案 H4 の activate)。捕捉した世代を渡し、\n // 「切断 → 即再接続」で陳腐化した connect の再開からの起動は機能側が弾く\n runActivate(this, connectGeneration);\n\n this._resolveConnectedCallback?.();\n }\n\n disconnectedCallback() {\n // この切断を引き取る機能(ボリューム — webComponent/volumeLifecycle.ts。設計案 H3)\n if (runDisconnecting(this)) {\n return;\n }\n if (this._rootNode !== null) {\n if (!this._initialized) {\n // 初期化前に剥がされた(bind-component の await 中に shadow が張り直された等)。\n // 名前登録も token も stream もまだ無く、state も作れないので後始末は不要。\n // ここで createState すると \"_state is not initialized\" で CE リアクションが落ちる\n if (this._initializeFailed) {\n // 落ちたルート要素**本人**が DOM から消えた =「このルートノードにルートは\n // 来ない」はもう成り立たない(作者の復旧は取り除いて作り直す)。印が残ると、\n // 外してから修正版を接続するまでの窓で接続したボリュームが即座に孤児化する。\n // 条件は本人に限る(#257 第 3 ラウンド): 「初期化前に剥がされた要素」全部で\n // 落とすと、同じ rootNode の別要素(ゾンビの 2 本目・行プールの張り直し・\n // ロード中の DOM 移動)の切断で印が消え、以後のボリュームが孤児報告を\n // 受けられず永久保留へ戻る\n runInitializeFailureCleared(this, this._rootNode);\n }\n this._rootNode = null;\n return;\n }\n // try/finally: ユーザーの $disconnectedCallback が throw しても後続の後始末を\n // 必ず実行する。特に abortAllStreams が飛ぶと stream が消費を続け(ゾンビ I/O)、\n // activeStateElements の強参照残留で GC が妨げられ、切断済み要素が依存駆動\n // restart の対象にも残る(設計書 §3-2 / §5-1 違反)。throw 自体は従来どおり\n // 呼び出し元へ伝播させる(変わるのは後始末の保証のみ)。\n try {\n this._callStateDisconnectedCallback();\n } finally {\n setStateElement(this.rootNode, null);\n // command-token / event-token の registry は捨てない(#273)。`$on` は `_state` セッターでしか、\n // `command.<method>:` は値の適用でしか購読しないので、捨てると再接続の後の発火が購読者の\n // 居ない新しい token に届き、無言で止まる(下の stream / watch が registry を保持するのと同じ理由)。\n // 切断中の発火は state の解決で止まる: 要素のイベントは上の登録解除で state を引けず、\n // `$command` の emit は `rootNode` の無い createState を通れない。\n // namespace proxy の memo は破棄する(registry は残るので、再接続後の初回アクセスで\n // 同じ token を返す proxy が作り直される)。\n clearCommandNamespace(this);\n // 機能の停止(設計案 H4 の deactivate。起動の逆順 — stream を止めてから watch を外す)\n runDeactivate(this);\n this._rootNode = null;\n }\n }\n }\n\n get initialized(): boolean {\n return this._initialized;\n }\n\n /**\n * ライフサイクル機能(core/lifecycleHooks.ts、設計案 H3)へ開く内部面。接続を引き取った機能が\n * 要素の初期化を所有するために要る最小限。\n */\n get connectedRootNode(): Node | null {\n return this._rootNode;\n }\n\n clearConnectedRootNode(): void {\n this._rootNode = null;\n }\n\n markInitialized(): void {\n this._initialized = true;\n }\n\n settleInitialization(): void {\n this._resolveInitialize?.();\n this._resolveLoading?.();\n this._resolveConnectedCallback?.();\n }\n\n loadStateFromSource(): Promise<Record<string, any>> {\n return this._loadStateFromSource();\n }\n\n markTreeless(): void {\n this._treeless = true;\n }\n\n /** 初期化失敗の着地(`_failInitializeLoudly`)。接続を引き取った機能が自分の失敗を載せる */\n failInitializeLoudly(error: unknown): never {\n return this._failInitializeLoudly(error);\n }\n\n get connectGeneration(): number {\n return this._connectGeneration;\n }\n\n setWatchPaths(paths: ReadonlySet<string> | null): void {\n this._watchPaths = paths;\n }\n\n setScanPaths(paths: ReadonlySet<string> | null): void {\n this._scanPaths = paths;\n }\n\n /** 設定エラーの着地(`_failInitialization` の raise を除いた部分)。引き取った機能が使う */\n landInitialization(): void {\n this._initializationLanded = true;\n this._resolveInitialize?.();\n this._resolveLoading?.();\n this._resolveConnectedCallback?.();\n }\n\n setRecursionRegistry(registry: RecursionRegistry | null): void {\n this._recursionRegistry = registry;\n }\n\n addGeneratedPath(path: string): void {\n this._generatedPaths.add(path);\n }\n\n setBoundComponent(component: Element | null, stateProp: string | null): void {\n this._boundComponent = component;\n this._boundComponentStateProp = stateProp;\n }\n\n get initializePromise(): Promise<void> {\n return this._initializePromise;\n }\n\n get connectedCallbackPromise(): Promise<void> {\n return this._connectedCallbackPromise;\n }\n\n get listPaths(): Set<string> {\n return this._listPaths;\n }\n\n get listKeys(): ListKeyMap | null {\n return this._listKeys;\n }\n\n get hasRecursion(): boolean {\n return this._recursionRegistry !== null;\n }\n\n get recursionRegistry(): RecursionRegistry | null {\n return this._recursionRegistry;\n }\n\n get watchPaths(): ReadonlySet<string> | null {\n return this._watchPaths;\n }\n\n get scanPaths(): ReadonlySet<string> | null {\n return this._scanPaths;\n }\n\n get elementPaths(): Set<string> {\n return this._elementPaths;\n }\n\n /**\n * ボリューム(webComponent/volume.ts)のアクセサ登録: ツリーパスをキーにした\n * quoted-path アクセサを state オブジェクトに定義し、getter / setter 台帳と\n * 依存グラフに載せる。ルートのワイルドカード getter(`\"children.*.label\"`)と\n * 同じ機構に乗るので、評価は pushAddress 下・依存はグラフに載る。\n */\n /** ボリュームの watch パスをホットパス用ゲート(watchPaths)へ合流させる。 */\n addVolumeWatchPaths(paths: ReadonlySet<string>): void {\n if (paths.size === 0) {\n return;\n }\n const merged = new Set(this._watchPaths ?? []);\n for (const path of paths) {\n merged.add(path);\n }\n this._watchPaths = merged;\n // ルートが `$watch` を宣言していなくても、合流した watch パスの旧値は同じ hook が記録する\n this.attachAddressHooks(\"watch\", STATE_WATCH_NAME);\n }\n\n /** ボリュームの $listKeys(接頭辞翻訳済み)をルートの表へ合流させる。衝突は設定ミス。 */\n mergeVolumeListKeys(entries: ReadonlyMap<string, ListKeySpec>): void {\n if (entries.size === 0) {\n return;\n }\n const merged = new Map(this._listKeys ?? []);\n for (const [path, spec] of entries) {\n if (merged.has(path)) {\n raiseError(`$listKeys entry \"${path}\" is declared by both the root and a volume (or two volumes). Keep exactly one.`);\n }\n merged.set(path, spec);\n }\n this._listKeys = merged;\n }\n\n /** ボリュームが $updatedCallback を持つとき、収集ゲートを開ける(apply/applyChange.ts)。 */\n enableUpdatedCallback(): void {\n this._hasUpdatedCallback = true;\n }\n\n /** enable-ssr スナップショットから初期化されたか(D14 — webComponent/volume.ts が読む)。 */\n get hydratedFromSsr(): boolean {\n return this._hydratedFromSsr;\n }\n\n addListPath(path: string): void {\n this._listPaths.add(path);\n }\n\n findStateDescriptor(path: string): PropertyDescriptor | undefined {\n // own → プロトタイプチェーン(Object.prototype 手前まで)。打ち切り位置は\n // getAllPropertyDescriptors / getStateInfo と同じ = 「state が宣言したもの」の範囲。\n // 走査そのものは pathDiagnostics と共有する(2 本に分かれると打ち切り位置がずれる)。\n return findDescriptor(this._state, path);\n }\n\n defineTreeAccessor(path: string, descriptor: PropertyDescriptor): void {\n Object.defineProperty(this._state, path, descriptor);\n if (typeof descriptor.get === \"function\") {\n this._getterPaths.add(path);\n }\n if (typeof descriptor.set === \"function\") {\n this._setterPaths.add(path);\n }\n this.setPathInfo(path, \"prop\", \"internal\");\n }\n\n get getterPaths(): Set<string> {\n return this._getterPaths;\n }\n\n get setterPaths(): Set<string> {\n return this._setterPaths;\n }\n\n get loopContextStack(): ILoopContextStack {\n return this._loopContextStack;\n }\n\n get dynamicDependency(): Map<string, string[]> {\n return this._dynamicDependency;\n }\n\n get staticDependency(): Map<string, string[]> {\n return this._staticDependency;\n }\n\n get version(): number {\n return this._version;\n }\n\n /** state の世代(キャッシュ項目の印の正本 — cache/types.ts の `generation`)。 */\n get stateGeneration(): number {\n return this._stateGeneration;\n }\n\n get rootNode(): Node {\n if (this._rootNode === null) {\n raiseError('State rootNode is not available.');\n }\n return this._rootNode;\n }\n\n get boundComponentStateProp(): string | null {\n return this._boundComponentStateProp;\n }\n\n\n\n get hasMounts(): boolean {\n return this._hasMounts;\n }\n\n /** 唯一の呼び手は webComponent/mount.ts の registerMountRecord(Phase 2)。 */\n markHasMounts(): void {\n this._hasMounts = true;\n this._attachScopeHooks(\"bind-component\");\n }\n\n get hasGraftedVolumes(): boolean {\n return this._hasGraftedVolumes;\n }\n\n get addressHooks(): IAttachedHooks | null {\n return this._addressHooks;\n }\n\n /** 宣言 `declaration` が要求する機能 `feature` の hook をこの state に付ける(未 install なら throw、D13) */\n attachAddressHooks(feature: string, declaration: string): void {\n const hooks = requireFeature(feature, declaration);\n if (this._addressHooks === null) {\n this._addressHooks = createAttachedHooks();\n }\n appendHooks(this._addressHooks, hooks);\n }\n\n /** 唯一の呼び手は webComponent/volume.ts の graftVolume(D22 後段のガードが読む)。 */\n markHasGraftedVolumes(): void {\n this._hasGraftedVolumes = true;\n this._attachScopeHooks(\"mount\");\n }\n\n /** ボリュームがこのルートに予約された(接ぎ木前でも、予約下の読みは undefined が正 — D22) */\n markHasVolume(): void {\n this._attachScopeHooks(\"mount\");\n }\n\n /** スコープ機能(マウント・ボリューム)の hook をこの state に付ける(冪等) */\n private _attachScopeHooks(declaration: string): void {\n // install は `bootstrapState()` の `installVolumeGraft()` が済ませている(未 install は\n // `attachAddressHooks` の readiness barrier が名指しで落とす — D13)\n this.attachAddressHooks(\"scopes\", declaration);\n }\n\n get bindableEventMap(): Record<string, string> {\n return this._bindableEventMap;\n }\n\n get commandTokenNames(): ReadonlySet<string> {\n return this._commandTokenNames;\n }\n\n get eventTokenNames(): ReadonlySet<string> {\n return this._eventTokenNames;\n }\n\n setBindableEventMap(map: Record<string, string>): void {\n this._bindableEventMap = map;\n // `$bindables` の束ね先になった: 書き込み後の bindable イベントを撃つ hook を付ける\n // (install は dcc/defineDCC.ts が束ねる時点で済ませている)\n this.attachAddressHooks(\"dcc\", STATE_BINDABLES_NAME);\n }\n\n private _addDependency(\n map: Map<string, string[]>,\n sourcePath: string,\n targetPath: string\n ): boolean {\n const deps = map.get(sourcePath);\n if (deps === undefined) {\n map.set(sourcePath, [targetPath]);\n return true;\n } else if (!deps.includes(targetPath)) {\n deps.push(targetPath);\n return true;\n }\n return false;\n }\n\n /**\n * source, target\n *\n * products.*.price => products.*.tax\n * get \"products.*.tax\"() { return this[\"products.*.price\"] * 0.1; }\n *\n * products.*.price => products.summary\n * get \"products.summary\"() { return this.$getAll(\"products.*.price\", []).reduce(sum); }\n *\n * categories.*.name => categories.*.products.*.categoryName\n * get \"categories.*.products.*.categoryName\"() { return this[\"categories.*.name\"]; }\n *\n * @param sourcePath\n * @param targetPath\n */\n addDynamicDependency(sourcePath: string, targetPath: string): boolean {\n return this._addDependency(this._dynamicDependency, sourcePath, targetPath);\n }\n\n /**\n * source, target\n * products => products.*\n * products.* => products.*.price\n * products.* => products.*.name\n *\n * @param sourcePath\n * @param targetPath\n */\n addStaticDependency(sourcePath: string, targetPath: string): boolean {\n return this._addDependency(this._staticDependency, sourcePath, targetPath);\n }\n\n setPathInfo(path: string, bindingType: BindingType, source: PathInfoSource = \"binding\"): void {\n // 再セットで作り直すための台帳(issue #258 の X7)。同じパスは複数の呼び出し元から登録\n // されうる(バインド・`$watch` の宣言)ので、いちど `for` で登録されたパスは `for` のまま\n // 保つ — `listPaths` / `elementPaths` を決めるのは下のとおり `for` だけ。保たない場合に\n // 何が壊れるかは `__tests__/integration.stateGenerationReset.test.ts` の\n // 「`for` で登録したリストパスは `$watch` の prop 登録に上書きされない」が固定する。\n if (source !== \"internal\") {\n // `for` の登録はバインドからしか来ないので、`for` の登録を残すときは `bound` も真のまま\n const previous = this._pathRegistrations.get(path);\n if (typeof previous === \"undefined\") {\n this._pathRegistrations.set(path, { bindingType, bound: source === \"binding\" });\n } else if (previous.bindingType !== \"for\") {\n this._pathRegistrations.set(path, { bindingType, bound: previous.bound || source === \"binding\" });\n }\n }\n if (bindingType === \"for\") {\n this._listPaths.add(path);\n this._elementPaths.add(path + '.' + WILDCARD);\n }\n if (!this._pathSet.has(path)) {\n const pathInfo = getPathInfo(path);\n this._pathSet.add(path);\n // 存在しないパスへの配線は「黙って更新されない」だけで終わるため、\n // 新規パスを 1 回だけ検査して確実な miss を報告する(diagnostics/pathChecks.ts — 開発時の\n // 診断なので features/diagnostics。入っていなければ検査しない)。\n // パスごとに 1 回・バインド確立時のみで、更新のホットパスには乗らない。\n pathDiagnostics?.check(this, this.__state, path, source);\n if (pathInfo.parentPath !== null) {\n let currentPathInfo = pathInfo;\n while(currentPathInfo.parentPath !== null) {\n if (!this.addStaticDependency(currentPathInfo.parentPath, currentPathInfo.path)) {\n break;\n }\n currentPathInfo = getPathInfo(currentPathInfo.parentPath);\n }\n }\n }\n }\n\n /**\n * 再セットで消した経路情報を、生き残ったバインドの登録から作り直す(issue #258 の X7)。\n *\n * `_pathSet.clear()` は残す。あのクリアには、`forgetGeneration` が外した静的辺を「行が\n * 作り直されたときに登録し直させる」自己修復が乗っている(辺が戻ることは\n * `__tests__/integration.stateGenerationReset.test.ts` の\n * 「静的な辺 nodes.* → nodes.*.total が戻る」が固定する)。消したうえで、生きているバインド\n * ぶんだけ `setPathInfo` をやり直す — `$recursion` のアンカーで既に同じことをしている手口を、\n * バインド全体へ広げたもの。\n *\n * `_generatedPaths`(これまでの世代の生成アクセサの具体パス)は張り直さない。行バインドが\n * 名指していても、新しい世代ではまだ実体化されていないため(recursion/generation.ts)。読みが\n * 実体化したときに `defineTreeAccessor` が登録し直す。\n *\n * 作り直すのはバインドが登録したパスだけ(`_pathRegistrations` の `bound`・#270)。`$watch` /\n * `$scan` だけの登録は飛ばす — 作り直しの後で今の世代の宣言が自分で登録し直し、そこで存在も\n * 検査される。ここで `_pathSet` に入れてしまうと、宣言側の `setPathInfo` が `_pathSet.has` で\n * 素通りし、両方の世代で宣言し続けたパスが新しい state で消えても報告されない。\n *\n * 反復中に `setPathInfo` が台帳へ書き戻す(既存キーの上書きのみで新キーは増えない)ので、\n * 誤解を避けるためスナップショットを取ってから回す。\n */\n private _rebuildPathInfo(): void {\n for (const [path, registration] of Array.from(this._pathRegistrations)) {\n if (!registration.bound || this._generatedPaths.has(path)) {\n continue;\n }\n this.setPathInfo(path, registration.bindingType);\n }\n }\n\n private _createState<T>(rootNode: Node, mutability: Mutability, callback: (state: IStateProxy) => T): T {\n try {\n const stateProxy = createStateProxy(rootNode, this._state, mutability);\n return callback(stateProxy);\n } finally {\n // cleanup if needed\n }\n }\n\n async createStateAsync(mutability: Mutability, callback: (state: IStateProxy) => Promise<void>): Promise<void> {\n return await this._createState(this.rootNode, mutability, callback);\n }\n\n createState(mutability: Mutability, callback: (state: IStateProxy) => void): void {\n this._createState(this.rootNode, mutability, callback);\n }\n\n nextVersion(): number {\n this._version++;\n return this._version;\n }\n\n get hasUpdatedCallback(): boolean {\n return this._hasUpdatedCallback;\n }\n\n get hasErrorCallback(): boolean {\n return this._hasErrorCallback;\n }\n\n get crossRowListPaths(): ReadonlySet<string> {\n return this._crossRowListPaths;\n }\n\n addCrossRowListPath(path: string): void {\n this._crossRowListPaths.add(path);\n }\n\n get indexDependentGetterPaths(): ReadonlySet<string> {\n return this._indexDependentGetterPaths;\n }\n\n addIndexDependentGetterPath(path: string): void {\n this._indexDependentGetterPaths.add(path);\n }\n\n\n setInitialState(state: Record<string, any>): void {\n if (!this._initialized) {\n if (this._initializeFailed) {\n // 初期化に失敗した要素は再武装しない(#257)。_setStatePromise は解決済みで、\n // ここで渡し直しても読み手が居ないため、旧挙動は無言の no-op だった。\n // 再武装は「落ちた宣言の残骸($on の購読・stream registry)をどう畳むか」を\n // 決める別の設計判断なので、ここでは唯一有効な復旧手段を伝えるに留める\n raiseError(\n `<${config.tagNames.state}> failed to initialize (the diagnostic was reported when it connected), ` +\n `so its state cannot be replaced. Remove this element and create a new one with the corrected state.`,\n );\n }\n this._resolveSetState?.(state);\n return;\n }\n // state の差し替えを拒む機能(ロード済みボリューム #268 — webComponent/volumeLifecycle.ts。設計案 H3)に聞く\n runReplacingState(this);\n // D22 と同型の防御: 接ぎ木済みボリューム / マウント記録の居るツリーの丸ごと再 set は、\n // 接ぎ木データ・quoted-path アクセサ(defineTreeAccessor)・マーカーの getterPaths・\n // 合流済み宣言面($watch / $listKeys / $updatedCallback ゲート)を全て無言で捨てる。\n // 「マウントポイントを含む親の丸ごと書きは throw」(setByAddress の D22 後段)と\n // 同じ設定ミスとして loud に落とす。\n if (this._hasGraftedVolumes || this._hasMounts) {\n raiseError(\n `Cannot replace the whole state of a tree that has grafted volumes or mounted components: ` +\n `re-setting would silently drop grafted data, tree accessors and mount ledgers (D22). ` +\n `Write the changed paths instead.`,\n );\n }\n const previousState = this.__state;\n this._state = state;\n // 再セットは描画し直す(#267)。読みは世代印で新しい state を返すので、確立済みのバインドも\n // ここで新しい世代に揃える(apply/reapplyStateBindings.ts)。消えたキーのバインドも失敗として\n // 報告させるため、前後両方の state のキーを起点にする\n const paths = collectReapplyPaths([previousState, state]);\n if (this._rootNode === null) {\n // 切断中は適用先の rootNode が無い。再接続(connectedCallback)で適用し直す\n this._pendingReapplyPaths = new Set([...(this._pendingReapplyPaths ?? []), ...paths]);\n return;\n }\n this._reapplyBindings(paths);\n }\n\n /** 確立済みのバインドを今の世代で適用し直す(#267)。行のバインドは経路情報の台帳のパスから引く。 */\n private _reapplyBindings(paths: Iterable<string>): void {\n reapplyStateBindings(this, paths, this._pathRegistrations.keys());\n }\n}\n\n","/**\n * `$commandTokens: [\"a\", \"b\", ...]` 配列宣言を解析し、宣言された名前群を Set で返す。\n *\n * 注入は行わず、proxy 側で `state.$command.<name>` として token を解決する設計。\n * (以前の実装は state 直下に各名前の getter を注入していたが、リアクティブ値との\n * 名前空間衝突を避け識別性を上げるため `$command` ネームスペース集約に切り替え。)\n *\n * 対応している宣言形式は **オブジェクトリテラル** のみ。\n * クラス本体に `static $commandTokens = [...]` を書く形式や、\n * クラスのプロトタイプ上の同名コマンドの検出は現状サポートしない。\n */\n\nimport { STATE_COMMAND_NAMESPACE_NAME, STATE_COMMAND_TOKENS_NAME } from \"../define\";\nimport { raiseError } from \"../raiseError\";\nimport { IState } from \"../types\";\n\nexport function processCommandTokensDeclaration(state: IState): Set<string> {\n const names = new Set<string>();\n const declared = (state as Record<string, unknown>)[STATE_COMMAND_TOKENS_NAME];\n if (typeof declared === \"undefined\") {\n return names;\n }\n if (!Array.isArray(declared)) {\n raiseError(`${STATE_COMMAND_TOKENS_NAME} must be an array of strings.`);\n }\n for (const name of declared) {\n if (typeof name !== \"string\" || name.length === 0) {\n raiseError(`${STATE_COMMAND_TOKENS_NAME} entries must be non-empty strings.`);\n }\n if (name === STATE_COMMAND_NAMESPACE_NAME) {\n raiseError(`${STATE_COMMAND_TOKENS_NAME} entry \"${name}\" conflicts with the reserved namespace name \"${STATE_COMMAND_NAMESPACE_NAME}\".`);\n }\n if (names.has(name)) {\n raiseError(`${STATE_COMMAND_TOKENS_NAME} entry \"${name}\" is duplicated.`);\n }\n names.add(name);\n }\n return names;\n}\n","/**\n * `$eventTokens: [\"a\", \"b\", ...]` 配列宣言を解析し、宣言された名前群を Set で返す。\n *\n * event-token は command-token の双対(element→state 方向)。要素が dispatch する\n * イベントを `eventToken.<prop>: <name>` で token に流し、state 側は `$on` マップで受ける。\n * ここで宣言された名前のみが `eventToken.X` / `$on` の有効なチャネル名になる(typo 耐性)。\n *\n * 対応している宣言形式は **オブジェクトリテラル** のみ。\n */\n\nimport { STATE_EVENT_TOKENS_NAME } from \"../define\";\nimport { raiseError } from \"../raiseError\";\nimport { IState } from \"../types\";\n\nexport function processEventTokensDeclaration(state: IState): Set<string> {\n const names = new Set<string>();\n const declared = (state as Record<string, unknown>)[STATE_EVENT_TOKENS_NAME];\n if (typeof declared === \"undefined\") {\n return names;\n }\n if (!Array.isArray(declared)) {\n raiseError(`${STATE_EVENT_TOKENS_NAME} must be an array of strings.`);\n }\n for (const name of declared) {\n if (typeof name !== \"string\" || name.length === 0) {\n raiseError(`${STATE_EVENT_TOKENS_NAME} entries must be non-empty strings.`);\n }\n if (names.has(name)) {\n raiseError(`${STATE_EVENT_TOKENS_NAME} entry \"${name}\" is duplicated.`);\n }\n names.add(name);\n }\n return names;\n}\n","/**\n * list/listKeys.ts\n *\n * `$listKeys: { <listPath>: <fieldName | (row) => key> }` 宣言マップを解析し、\n * 「リストパス → キー指定」表を構築する(docs/state-list-key-design.md §3)。\n *\n * この表が存在するリストパスへの配列代入は、setByAddress でキー突合され、\n * 一致行は旧オブジェクトを据え置いたまま変化フィールドだけが per-path 書き込みで\n * 流し込まれる(§2)。未宣言なら書き込み経路は従来と完全に同一。\n *\n * 「そのパスが実際にリストか」は宣言時には判定できない(listPaths は\n * バインディング収集時に確定する)。実行時に配列でなければ経路に入らないだけで、\n * 宣言自体はエラーにしない。\n */\n\nimport { DELIMITER, RECURSION_WILDCARD, STATE_LIST_KEYS_NAME, WILDCARD } from \"../define\";\nimport { raiseError } from \"../raiseError\";\nimport type { IState } from \"../types\";\n\n/** キー指定: フラットなフィールド名、または行から複合キーを作る関数 */\nexport type ListKeySpec = string | ((row: any) => unknown);\n\nexport type ListKeyMap = ReadonlyMap<string, ListKeySpec>;\n\n/**\n * `$listKeys` 宣言を検証して Map 化する。宣言が無ければ null(=ゼロコスト経路)。\n *\n * 検証内容(§3.1):\n * - `$listKeys` はオブジェクト\n * - パスは非空文字列 / 空セグメント・先頭末尾の `.` を禁止\n * - パス末尾が `*` であることを禁止(リストパスであって要素パスではない)\n * - キー指定は非空文字列か関数\n * - 文字列キーは `.` / `*` を含まないフラットなフィールド名\n * - `Object.prototype` 継承名を禁止(`__proto__` / `constructor` 等)\n */\nexport function processListKeysDeclaration(state: IState): ListKeyMap | null {\n const declared = (state as Record<string, unknown>)[STATE_LIST_KEYS_NAME];\n if (typeof declared === \"undefined\") {\n return null;\n }\n if (typeof declared !== \"object\" || declared === null) {\n raiseError(`${STATE_LIST_KEYS_NAME} must be an object mapping list paths to key specs.`);\n }\n const entries = new Map<string, ListKeySpec>();\n for (const [path, spec] of Object.entries(declared as Record<string, unknown>)) {\n if (path.length === 0) {\n raiseError(`${STATE_LIST_KEYS_NAME} entry path must be a non-empty string.`);\n }\n const segments = path.split(DELIMITER);\n if (segments.some((segment) => segment.length === 0)) {\n raiseError(`${STATE_LIST_KEYS_NAME} entry \"${path}\" must not contain empty path segments.`);\n }\n if (segments[segments.length - 1] === WILDCARD) {\n raiseError(\n `${STATE_LIST_KEYS_NAME} entry \"${path}\" must be the list path itself, not the element path ` +\n `(drop the trailing \"${DELIMITER}${WILDCARD}\").`\n );\n }\n // `**` は `$listKeys` の消費者ではない。受理すると宣言は永久に効かず(キー突合は\n // 具体パスで引く)、他の壊れた形は raise するのと非対称になる。深さごとに具体パスで宣言する。\n if (path.indexOf(RECURSION_WILDCARD) !== -1) {\n raiseError(\n `[wcs/recursion-unsupported] ${STATE_LIST_KEYS_NAME} entry \"${path}\" uses \"${RECURSION_WILDCARD}\", ` +\n `which ${STATE_LIST_KEYS_NAME} does not interpret — a keyed list is one concrete list path. ` +\n `Declare the key per depth instead (for example \"nodes${DELIMITER}${WILDCARD}${DELIMITER}children\").`\n );\n }\n if (typeof spec === \"function\") {\n entries.set(path, spec as (row: any) => unknown);\n continue;\n }\n if (typeof spec !== \"string\") {\n raiseError(\n `${STATE_LIST_KEYS_NAME} entry \"${path}\" key spec must be a field name (string) or a function.`\n );\n }\n if (spec.length === 0) {\n raiseError(`${STATE_LIST_KEYS_NAME} entry \"${path}\" key field name must be a non-empty string.`);\n }\n if (spec.includes(DELIMITER) || spec.includes(WILDCARD)) {\n raiseError(\n `${STATE_LIST_KEYS_NAME} entry \"${path}\" key field name \"${spec}\" must be a flat property name ` +\n `(\"${DELIMITER}\" / \"${WILDCARD}\" are not allowed).`\n );\n }\n // own key でなくても `in` 判定が真になる継承名は、キー抽出が prototype 由来の\n // 値(constructor など)を拾って全行同一キー扱いになるため名前の防衛線で落とす。\n if (spec in Object.prototype) {\n raiseError(\n `${STATE_LIST_KEYS_NAME} entry \"${path}\" key field name \"${spec}\" must not be a property name ` +\n `inherited from Object.prototype (e.g. \"__proto__\", \"constructor\").`\n );\n }\n entries.set(path, spec);\n }\n return entries.size > 0 ? entries : null;\n}\n","/**\n * `$on: { <name>: (state, event, ...listIndexes) => {...} }` マップを解析し、\n * 各ハンドラを対応する event-token に subscribe する(state 側の受信配線)。\n *\n * - `$on` のキーは `$eventTokens` で宣言済みでなければならない(typo 耐性)。\n * - 各値は関数でなければならない。\n * - 引数規約は `(state, event, ...listIndexes)`。`this` 束縛は行わず引数で state を渡すため\n * アロー関数で書ける(command-token の emit 規約と対称)。\n *\n * `$eventTokens` で宣言されたが `$on` に対応が無い token は subscriber ゼロ(emit は no-op)。\n */\n\nimport { IStateElement } from \"../components/types\";\nimport { STATE_ON_NAME } from \"../define\";\nimport { didYouMean } from \"../errorGuidance\";\nimport { raiseError } from \"../raiseError\";\nimport { IState } from \"../types\";\nimport { TokenSubscriber } from \"../token/Token\";\nimport { getOrCreateEventToken } from \"./eventTokenRegistry\";\n\nexport function processOnDeclaration(\n stateElement: IStateElement,\n state: IState,\n eventTokenNames: ReadonlySet<string>,\n): void {\n const declared = (state as Record<string, unknown>)[STATE_ON_NAME];\n if (typeof declared === \"undefined\") {\n return;\n }\n if (typeof declared !== \"object\" || declared === null) {\n raiseError(`${STATE_ON_NAME} must be an object mapping event-token names to handler functions.`);\n }\n for (const [name, handler] of Object.entries(declared as Record<string, unknown>)) {\n if (!eventTokenNames.has(name)) {\n raiseError(`${STATE_ON_NAME} entry \"${name}\" is not declared in $eventTokens.${didYouMean(name, eventTokenNames)}`);\n }\n if (typeof handler !== \"function\") {\n raiseError(`${STATE_ON_NAME} entry \"${name}\" must be a function.`);\n }\n const token = getOrCreateEventToken(stateElement, name);\n token.subscribe(handler as TokenSubscriber);\n }\n}\n","import { raiseError } from \"../raiseError\";\nimport { IState } from \"../types\";\n\n\nexport function loadFromScriptJson(id: string): IState {\n const script = document.getElementById(id) as HTMLScriptElement;\n if (script && script.type === 'application/json') {\n try {\n const data = JSON.parse(script.textContent || '{}');\n return data;\n } catch (e) {\n raiseError('Failed to parse JSON from script element:' + e);\n }\n }\n return {};\n}","import { raiseError } from \"../raiseError\";\nimport { IState } from \"../types\";\n\nexport async function loadFromJsonFile(url: string): Promise<IState> {\n try {\n const response = await fetch(url);\n if (!response.ok) {\n raiseError(`Failed to fetch JSON file: ${response.statusText}`);\n }\n const data = await response.json();\n return data;\n } catch (e) {\n console.error('Failed to load JSON file:', e);\n return {};\n }\n}","import { State } from \"./components/State\";\nimport { config } from \"./config\";\n\n/**\n * Register this package's tags. Pass a scoped `CustomElementRegistry` to define\n * them for a single shadow tree -- scoped registries do not inherit the global\n * one, so a tree using one needs its own definitions.\n */\ntype ComponentDefiner = (registry: CustomElementRegistry) => void;\n\nconst definers: ComponentDefiner[] = [];\n\n/**\n * 機能のタグの定義を登録する(冪等 — 同じ definer は 1 回だけ)。`<wcs-ssr>` は ssr/install.ts が登録する。\n * 機能のタグは `<wcs-state>` より**先**に定義される(下)。\n */\nexport function registerComponentDefiner(definer: ComponentDefiner): void {\n if (!definers.includes(definer)) {\n definers.push(definer);\n }\n}\n\nexport function registerComponents(registry: CustomElementRegistry = customElements) {\n // 機能のタグを先に定義する: SSR 出力の `<wcs-ssr>` は state の接続が読むので、\n // 未 upgrade のまま state が先に動くと stateData が無い\n for (let i = 0; i < definers.length; i++) {\n definers[i](registry);\n }\n if (!registry.get(config.tagNames.state)) {\n registry.define(config.tagNames.state, State);\n }\n}\n"],"names":["LoopContextStack","_loopContextStack","Array","MAX_LOOP_DEPTH","fill","undefined","_length","createLoopContext","elementStateAddress","callback","listIndex","raiseError","loopContext","this","lastLoopContext","pathInfo","wildcardCount","prevWildcardPathInfo","wildcardPathInfos","length","retValue","Promise","finally","derivesFromGetter","stateElement","path","getterPaths","size","cumulativePath","getPathInfo","cumulativePaths","has","INDEX_PARAM_RE","STREAM_STATUS_PATH_PREFIX","STATE_STREAM_STATUS_NAMESPACE_NAME","DELIMITER","STREAM_ERROR_PATH_PREFIX","STATE_STREAM_ERROR_NAMESPACE_NAME","symbolApiCacheByHandler","WeakMap","get","target","prop","receiver","handler","index","INDEX_BY_INDEX_NAME","charCodeAt","test","INDEX_PARAM_PREFIX","MAX_WILDCARD_DEPTH","addressStackLength","toString","lastAddress","lastAddressStack","lastInfo","untracking","addIndexDependentGetterPath","scopedIndex","lastPathInfo","shiftHooks","addressHooks","shifts","indexShift","i","indexListIndex","listIndexAtWildcard","hooks","getHooks","handled","NOT_HANDLED","indexes","getAll","value","options","setAll","_prop","resolvedAddress","getResolvedAddress","getListIndex","address","createStateAddress","absAddress","liftAddress","updater","getUpdater","enqueueAbsoluteAddress","walkDependency","staticDependency","dynamicDependency","listPaths","depAddress","absDepAddress","dirtyCacheEntryByAbsoluteStateAddress","written","postUpdate","resolve","_target","_receiver","indexOf","RECURSION_WILDCARD","addDynamicDependency","trackDependency","key","recordTrackedKeyedPath","Object","is","current","beginUntrack","endUntrack","registerKeyedDependency","liftAddressForKeyed","keyPath","tracked","level","levelListIndex","innermost","listValue","wildcardParentPaths","getListIndexesByList","registerIndexWatcher","registerIndexKeyedDependency","fn","untrackDependency","STATE_COMMAND_NAMESPACE_NAME","getCommandNamespace","startsWith","stateAddress","getByAddress","cache","Map","set","getSymbolApiCache","cached","api","setLoopContextSymbol","setLoopContext","pushAddress","popAddress","clearLoopContext","getByAddressSymbol","hasByAddressSymbol","hasByAddress","setByAddressSymbol","setByAddress","connectedCallbackSymbol","async","Reflect","STATE_CONNECTED_CALLBACK_NAME","call","connectedCallback","disconnectedCallbackSymbol","STATE_DISCONNECTED_CALLBACK_NAME","disconnectedCallback","updatedCallbackSymbol","refs","STATE_UPDATED_CALLBACK_NAME","result","paths","Set","indexesListByPath","ref","absolutePathInfo","pathName","add","getScopedIndexes","indexesList","push","from","updated","updatedCallback","errorCallbackSymbol","error","info","STATE_ERROR_CALLBACK_NAME","errorCallback","StateHandler","_stateElement","_addressStack","_addressStackIndex","_loopContext","_mutability","_untrackDepth","constructor","rootNode","mutability","getStateElement","_hasRepeatedAddress","_describeAddressCycle","seen","entry","_tailAddressPaths","reverse","join","trapGet","assertWritable","trapSet","HTMLElementBase","HTMLElement","STRUCTURAL_BINDING_TYPES","reapplyStateBindings","registeredPaths","rowPathInfosByElementPath","lastWildcardPath","rowPathInfos","bindings","visited","collect","peekBindingsForAddress","rowPathInfo","beginStateListBaselineBatch","createState","state","ordered","structural","values","binding","bindingType","sort","a","b","replaceNode","compareDocumentPosition","Node","DOCUMENT_POSITION_FOLLOWING","concat","orderStructuralFirst","apply","applyChangeFromBindings","inSsr","pending","runTransition","catch","reportDeferredApplyFailure","endStateListBaselineBatch","State","static","getBindingsReady","observedAttributes","__state","_hasUpdatedCallback","_hasErrorCallback","_hydratedFromSsr","_crossRowListPaths","_indexDependentGetterPaths","_initialized","_initializeFailed","_initializationLanded","_initializePromise","_resolveInitialize","_connectedCallbackPromise","_resolveConnectedCallback","_rejectConnectedCallback","_loadingPromise","_resolveLoading","_setStatePromise","_resolveSetState","_listPaths","_listKeys","_recursionRegistry","_elementPaths","_getterPaths","_setterPaths","createLoopContextStack","_dynamicDependency","_staticDependency","_pathSet","_stateGeneration","_pathRegistrations","_pendingReapplyPaths","_generatedPaths","_watchPaths","_scanPaths","_version","_rootNode","_boundComponent","_boundComponentStateProp","_hasMounts","_hasGraftedVolumes","_addressHooks","_bindableEventMap","_commandTokenNames","_eventTokenNames","_treeless","_connectGeneration","super","reject","_state","config","tagNames","previousState","declarations","createDeclarationContext","runValidateEarly","commandTokenNames","names","declared","STATE_COMMAND_TOKENS_NAME","isArray","name","processCommandTokensDeclaration","eventTokenNames","STATE_EVENT_TOKENS_NAME","processEventTokensDeclaration","listKeys","STATE_LIST_KEYS_NAME","entries","spec","segments","split","some","segment","WILDCARD","includes","prototype","processListKeysDeclaration","runValidate","runPreCommit","pathDiagnostics","reset","clearEventTokenRegistry","runApplyEarly","STATE_ON_NAME","didYouMean","getOrCreateEventToken","subscribe","processOnDeclaration","clear","stateInfo","setterPaths","descriptors","getAllPropertyDescriptors","descriptor","getStateInfo","runApply","_rebuildPathInfo","runRegister","runActivate","attributeChangedCallback","_name","oldValue","newValue","console","warn","_loadFromSsrElement","hasAttribute","requireSsrHooks","loadState","_loadStateFromSource","id","script","document","getElementById","type","JSON","parse","textContent","e","loadFromScriptJson","getAttribute","json","querySelector","loadFromInnerScript","timerId","setTimeout","NO_SET_TIMEOUT","clearTimeout","src","endsWith","url","response","fetch","ok","statusText","loadFromJsonFile","loadFromScriptFile","_initialize","ssrState","desc","getOwnPropertyDescriptor","setStateElement","_failInitialization","message","_failInitializeLoudly","ownsTree","markBindingsUnavailable","runInitializeFailed","_callStateConnectedCallback","createStateAsync","_callStateDisconnectedCallback","getRootNode","connectGeneration","runReconnecting","claimed","runConnecting","parentNode","ShadowRoot","host","DCC_DEFINITION_ATTRIBUTE","requireLifecycleFeature","prepared","preparing","runPreparing","completed","_reapplyBindings","isOrchestratedSsr","emitSnapshot","runDisconnecting","runInitializeFailureCleared","clearCommandNamespace","runDeactivate","initialized","connectedRootNode","clearConnectedRootNode","markInitialized","settleInitialization","loadStateFromSource","markTreeless","failInitializeLoudly","setWatchPaths","setScanPaths","landInitialization","setRecursionRegistry","registry","addGeneratedPath","setBoundComponent","component","stateProp","initializePromise","connectedCallbackPromise","hasRecursion","recursionRegistry","watchPaths","scanPaths","elementPaths","addVolumeWatchPaths","merged","attachAddressHooks","STATE_WATCH_NAME","mergeVolumeListKeys","enableUpdatedCallback","hydratedFromSsr","addListPath","findStateDescriptor","findDescriptor","defineTreeAccessor","defineProperty","setPathInfo","loopContextStack","version","stateGeneration","boundComponentStateProp","hasMounts","markHasMounts","_attachScopeHooks","hasGraftedVolumes","feature","declaration","requireFeature","createAttachedHooks","appendHooks","markHasGraftedVolumes","markHasVolume","bindableEventMap","setBindableEventMap","map","STATE_BINDABLES_NAME","_addDependency","sourcePath","targetPath","deps","addStaticDependency","source","previous","bound","check","parentPath","currentPathInfo","registration","_createState","stateProxy","Proxy","createStateProxy","nextVersion","hasUpdatedCallback","hasErrorCallback","crossRowListPaths","addCrossRowListPath","indexDependentGetterPaths","setInitialState","runReplacingState","states","collectReapplyPaths","keys","definers","registerComponentDefiner","definer","registerComponents","customElements","define"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{g as t,v as e,C as n,W as s,E as a,l as o,D as l,o as r,F as i,G as d,s as c,H as f}from"./pathDiagnostics.js";import{r as u}from"./errorGuidance.js";import{aA as h,H as p,l as g,aB as y,N as I,K as w,k as m,M as x,L as P,aC as v,F as A,aD as b,G as $,af as k,aE as R,aF as E,aG as S,aH as M,aI as j,aJ as C,aK as L,a6 as O,c as D,aL as T,ab as V,X as B,aM as N,J as H,x as G}from"./binder.js";import{N as q}from"./getAllPropertyDescriptors.js";import{c as z}from"./checkDependency.js";import{c as W}from"./filterRegistry.js";const F=new WeakMap;function K(t,e){let n=F.get(t);void 0===n&&(n=new Map,F.set(t,n));let s=n.get(e);return void 0===s&&(s=new h(e,t),n.set(e,s)),s}const J=new WeakMap;function U(t){const e=J.get(t);if(void 0!==e)return e;const n=new Proxy(Object.create(null),{get(e,n){if("string"==typeof n&&t.commandTokenNames.has(n))return K(t,n)},has:(e,n)=>"string"==typeof n&&t.commandTokenNames.has(n),ownKeys:()=>Array.from(t.commandTokenNames),getOwnPropertyDescriptor(e,n){if("string"==typeof n&&t.commandTokenNames.has(n))return{configurable:!0,enumerable:!0,value:K(t,n)}},set(){u("$command namespace is read-only; assigning to it is not allowed.")},deleteProperty(){u("$command namespace is read-only; deleting from it is not allowed.")}});return J.set(t,n),n}function X(t){J.delete(t)}function Q(t){"readonly"===t.mutability&&u("This state is readonly.")}const Y=new Map;class Z{path;segments;wildcardCount;wildcardType;wildcardIndexes;pathInfo;constructor(e){const n=e.split("."),s=n.slice();let a=0,o=0,l=0,r="none";const i=[];for(let t=0;t<n.length;t++){const e=n[t];if("*"===e)s[t]="*",i.push(null),a++,l++;else{const n=Number(e);Number.isNaN(n)||(s[t]="*",i.push(n),o++,l++)}}const d=s.join("."),c=t(d);(a>0||o>0)&&(r=a===l?"context":o===l?"all":"partial"),this.path=e,this.segments=n,this.wildcardCount=l,this.wildcardType=r,this.wildcardIndexes=i,this.pathInfo=c}}function _(t){let e;return Y.get(t)??(Y.set(t,e=new Z(t)),e)}function tt(t,e){if(0===t.addressStackLength)return null;const n=t.lastAddressStack;if(null===n)return null;const s=n.pathInfo.indexByWildcardPath[e];return void 0===s||null===n.listIndex?null:p(n.listIndex,s,n.pathInfo.wildcardCount)}function et(t,e){return(!0!==t.hasMounts||35!==e.pathInfo.lastSegment.charCodeAt(0))&&(e.pathInfo.wildcardCount>0||t.getterPaths.has(e.pathInfo.path))}function nt(t,e,n,s,a){const o=t.addressHooks;if(o){const l=o.readMissing;for(let o=0;o<l.length;o++){const r=l[o](t,e,n,s,a);if(r!==q)return r}}return q}function st(t,o,l,r,i){if(o.pathInfo.segments[0]===e)return function(t,e){let n=t;for(let t=1;t<e.length;t++){if(Object(n)!==n)return;n=Reflect.get(n,e[t])}return n}(U(i),o.pathInfo.segments);if(!(o.pathInfo.path in t)){if(null===o.parentAddress){const e=nt(i,o,null,l,r);if(e!==q)return e;u(n(o.pathInfo.path,t,i.getterPaths))}const e=at(t,o.parentAddress,l,r);if(null==e)return;const d=o.pathInfo.segments[o.pathInfo.segments.length-1],c=i.addressHooks;if(c&&0!==c.readMissing.length&&d!==s&&!(d in Object(e))){const t=nt(i,o,Object(e),l,r);if(t!==q)return t}if(d===s){const t=o.listIndex?.index??u(a(`path "${o.pathInfo.path}"`,o.pathInfo.wildcardCount,o.listIndex?.length??0));return Reflect.get(e,t)}return Reflect.get(e,d)}if(!i.getterPaths.has(o.pathInfo.path))return Reflect.get(t,o.pathInfo.path);r.pushAddress(o);try{return Reflect.get(t,o.pathInfo.path,l)}finally{r.popAddress()}}function at(t,e,n,s){z(s,e),!0===s.stateElement.hasRecursion&&s.stateElement.recursionRegistry.materializeForPathInfo(s.stateElement,e.pathInfo);const a=s.stateElement,o=a.addressHooks;if(o){const t=o.read;for(let o=0;o<t.length;o++){const l=t[o](a,e,n,s);if(l!==q)return l}}return et(a,e)?function(t,e,n,s,a){const o=g(a,e),l=y(o),r=a.stateGeneration;if(null!==l&&!1===l.dirty&&l.generation===r)return l.value;const i=st(t,e,n,s,a);return I(o,{value:i,dirty:!1,generation:r}),i}(t,e,n,s,a):st(t,e,n,s,a)}function ot(t,e,n,s,a,o){const l=new Map,r=(s,a,o,i,d,c,f)=>{const h=s[a]??null;if(null===h)return void f.push(c);const p=m(h,o),y=g(n.stateElement,p),I=x(y),w=at(t,p,e,n),v=P(o,I,w).newIndexes,A=i[d]??null;if(l.set(y,w),null===A)for(let t=0;t<v.length;t++){const e=v[t];r(s,a+1,e,i,d+1,c.concat(e.index),f)}else{const t=v[A]??u(`ListIndex not found at index ${A} of ${h.path}`);a+1<s.length?r(s,a+1,t,i,d+1,c.concat(t.index),f):f.push(c.concat(t.index))}},i=[];if(r(s.wildcardParentPathInfos,0,null,a,0,[],i),o.commitDiffBaseline)for(const[t,e]of l.entries())w(t,Array.isArray(e)?e:[]);return i}function lt(t,e,n,s,a){let o=null;for(let l=0;l<s.wildcardParentPathInfos.length;l++){const r=s.wildcardParentPathInfos[l],i=at(t,m(r,o),e,n),d=v(i,o);null==d&&u(`ListIndexes not found: ${r.path}`);const c=a[l];o=d[c]??u(`ListIndex not found at index ${c} of ${r.path}`)}return o}function rt(t,e,n,s){"object"==typeof t&&null!==t||u(`${o} list "${e}": ${n} row at index ${s} must be a plain object (got ${null===t?"null":typeof t}).`);const a=Object.getPrototypeOf(t);a!==Object.prototype&&null!==a&&u(`${o} list "${e}": ${n} row at index ${s} must be a plain object (class instances and exotic objects cannot be value-expanded).`)}function it(t,e,n,s,a){const l="function"==typeof e?e(t):t[e];return null==l&&u(`${o} list "${n}": ${s} row at index ${a} has no key (${"function"==typeof e?"key function":`field "${e}"`} returned ${String(l)}).`),l}function dt(t,e,n,s){const a=new Array(t.length),l=new Set;for(let r=0;r<t.length;r++){const i=t[r];rt(i,n,s,r);const d=it(i,e,n,s,r);l.has(d)&&u(`${o} list "${n}": duplicate key ${JSON.stringify(d)} in ${s} list.`),l.add(d),a[r]=d}return a}function ct(t,e){const n=[];for(const s of Object.keys(e))Object.is(t[s],e[s])||n.push({field:s,value:e[s]});for(const s of Object.keys(t))Object.hasOwn(e,s)||null==t[s]||n.push({field:s,value:null});return n}function ft(t,e,n,a){if(e.pathInfo.path in t)return!0;const o=e.parentAddress;if(null===o)return!1;const l=at(t,o,n,a);if(null===l||"object"!=typeof l&&"function"!=typeof l)return!1;const r=e.pathInfo.lastSegment;if(r===s){const t=e.listIndex?.index;return"number"==typeof t&&t in l}return r in l}const ut=new WeakMap;function ht(t,e){null===e?ut.delete(t):ut.set(t,e)}function pt(e,n,s){const a=e.wildcardParentPaths[n],o=t(a),l=m(o,s),r=g(e.stateElement,l),i=x(r),d=e.stateProxy[A](l),c=P(l.listIndex,i,d);e.observedListValueByAbsAddress.set(r,Array.isArray(d)?d:[]);const f=function(t,e){switch(e){case"old":return t.oldIndexes;case"new":return t.newIndexes;case"add":return t.addIndexSet;case"change":return t.changeIndexSet;case"delete":return t.deleteIndexSet;default:return W.debug&&console.log(`Invalid search type: ${e}`),[]}}(c,e.searchType);if(n===e.wildcardPaths.length-1)e.targetListIndexes.push(...f);else for(const t of f)pt(e,n+1,t)}const gt=[];function yt(t,e,n,s,a){return"full"===t.listExpansion||t.stateElement.crossRowListPaths?.has(e)?{fullRows:a.newIndexes,movedRows:null}:0===a.addIndexSet.size&&0===a.changeIndexSet.size?0===a.deleteIndexSet.size?t.keyedMergePath===e?{fullRows:gt,movedRows:null}:{fullRows:a.newIndexes,movedRows:null}:{fullRows:gt,movedRows:null}:{fullRows:a.addIndexSet,movedRows:a.changeIndexSet}}const It=[];function wt(e,n,s){const a=e.stateElement.indexDependentGetterPaths;if(!a||0===a.size)return It;let o=null;const r=n+l;for(const e of a){if(e!==n&&!e.startsWith(r))continue;const a=t(e);if(a.wildcardCount!==s.wildcardCount)return null;(o??=[]).push(a)}return o??It}function mt(e,n,a){const o=n.pathInfo.path,l=e.staticMap.get(o);if(l)for(const r of l){const l=t(r);if(e.listPathSet.has(o)&&l.lastSegment===s){const t=e.stateProxy[A](n),s=g(e.stateElement,n),i=x(s),d=P(n.listIndex,i,t);e.observedListValueByAbsAddress.set(s,Array.isArray(t)?t:[]);const c=yt(e,o,0,0,d);for(const t of c.fullRows){const n=m(l,t);e.result.add(n),a.push(n)}if(null!==c.movedRows){const t=wt(e,r,l);if(null===t)for(const t of c.movedRows){const n=m(l,t);e.result.add(n),a.push(n)}else if(t.length>0)for(const n of c.movedRows)for(const s of t){const t=m(s,n);e.result.add(t),a.push(t)}}}else{const t=m(l,n.listIndex);e.result.add(t),a.push(t)}}const r=e.dynamicMap.get(o);if(r)for(const s of r){const o=t(s),l=[];if(o.wildcardCount>0){const t=b(n.pathInfo,o);if(o.wildcardCount-t>=1){let s;t>0?(null===n.listIndex&&u(`Cannot expand dynamic dependency with wildcard for non-list address: ${n.pathInfo.path}`),s=p(n.listIndex,t-1,n.pathInfo.wildcardCount)):s=null;const a={stateElement:e.stateElement,observedListValueByAbsAddress:e.observedListValueByAbsAddress,targetListIndexes:[],wildcardPaths:o.wildcardPaths,wildcardParentPaths:o.wildcardParentPaths,stateProxy:e.stateProxy,searchType:e.searchType};pt(a,t,s),l.push(...a.targetListIndexes)}else{null===n.listIndex&&u(`Cannot expand dynamic dependency with wildcard for non-list address: ${n.pathInfo.path}`);const e=p(n.listIndex,t-1,n.pathInfo.wildcardCount);l.push(e)}}else l.push(null);for(const t of l){const n=m(o,t);e.result.add(n),a.push(n)}}}function xt(t,e,n,s,a,o,l,r,i){const d=e.pathInfo.path;if(!n.has(d)&&!s.has(d))return r(e),[];const c=function(t,e,n,s){const a=new Map,o=new Map,l=[t];for(o.set(t,0);l.length>0;){const t=l.pop();if(a.has(t))continue;const s=e.get(t),r=n.get(t);let i;i=void 0===s?r??[]:void 0===r?s:s.concat(r),a.set(t,i);for(let t=0;t<i.length;t++){const e=i[t];o.set(e,(o.get(e)??0)+1),a.has(e)||l.push(e)}}const r=new Map,i=new Set,d=[];for(const[t,e]of o)0===e&&(r.set(t,0),i.add(t),d.push(t));for(let t=0;t<d.length;t++){const e=d[t],n=r.get(e)+1;n>s&&u(`Maximum dependency depth of ${s} exceeded. Possible circular dependency detected at path: ${e}`);const l=a.get(e);for(let t=0;t<l.length;t++){const e=l[t];n>(r.get(e)??-1)&&r.set(e,n);const s=o.get(e)-1;o.set(e,s),0===s&&(i.add(e),d.push(e))}}if(i.size!==a.size){let t=-1;for(const e of i){const n=r.get(e);n>t&&(t=n)}const e=t+1;for(const t of a.keys())i.has(t)||r.set(t,e)}return r}(d,n,s,1e3),f={ranks:c,stateElement:t,observedListValueByAbsAddress:new Map,staticMap:n,dynamicMap:s,result:new Set,listPathSet:a,visited:new Set,stateProxy:o,searchType:l,listExpansion:i?.listExpansion??"full",keyedMergePath:i?.keyedMergePath??null};!function(t,e,n){const s=[],a=t.ranks,o=(t,e)=>{let n=a.get(t.pathInfo.path)??e;n<e&&(n=e),(s[n]??=[]).push(t)};o(e,0);const l=[];for(let e=0;e<s.length;e++){const a=s[e];if(void 0!==a)for(let s=0;s<a.length;s++){const r=a[s];if(!t.visited.has(r)){t.visited.add(r),n(r),l.length=0,mt(t,r,l);for(let t=0;t<l.length;t++)o(l[t],e+1)}}}}(f,e,r);for(const[t,e]of f.observedListValueByAbsAddress)w(t,e);return Array.from(f.result)}function Pt(t,e,n,s,a){const o=t.addressHooks;if(o){const l=o.writeObserve;for(let o=0;o<l.length;o++)l[o](t,e,n,s,a)}}function vt(t,e,n){const s=t.addressHooks;if(s){const a=s.written;for(let s=0;s<a.length;s++)a[s](t,e,n)}}function At(t,e,n){const s=t.addressHooks;if(s){const a=s.swapped;for(let s=0;s<a.length;s++)a[s](t,e,n)}}function bt(t,e,n,s,a,o){const l=E(t,e),r=S(t,e);if(!l&&!r)return;const i=D(),d=W.enablePropagationContext?M()??null:null,c=t=>{k(t),i.enqueueAbsoluteAddress(t,d)};l&&j(t,e,n,s,a).forEach(c),r&&C(t,e,n?s:o(),a).forEach(c)}function $t(t,e,n,s,a,o,l="diff"){const r=W.enablePropagationContext?M()??L(-1):null,i=D();i.enqueueAbsoluteAddress(e,r),o&&k(e),xt(s.stateElement,t,s.stateElement.staticDependency,s.stateElement.dynamicDependency,s.stateElement.listPaths,n,"new",e=>{if(e===t)return;const n=g(s.stateElement,e);k(n),i.enqueueAbsoluteAddress(n,r)},{listExpansion:l,keyedMergePath:a})}function kt(t,e,n,s,a){a&&(t.getterPaths.has(e)?k(n):I(n,{value:s,dirty:!1,generation:t.stateGeneration}))}function Rt(t,e,n,o,l,r,i,d){try{if(!(e.pathInfo.path in t)){const n=e.parentAddress;if(null===n)return Reflect.set(t,e.pathInfo.path,o);const i=at(t,n,l,r),d=e.pathInfo.segments[e.pathInfo.segments.length-1];if(d===s){const t=e.listIndex?.index??u(a(`path "${e.pathInfo.path}"`,e.pathInfo.wildcardCount,e.listIndex?.length??0));return Reflect.set(i,t,o)}return Reflect.set(i,d,o)}if(!r.stateElement.setterPaths.has(e.pathInfo.path))return Reflect.set(t,e.pathInfo.path,o);r.pushAddress(e),r.beginUntrack();try{return Reflect.set(t,e.pathInfo.path,o,l)}finally{r.endUntrack(),r.popAddress()}}finally{$t(e,n,l,r,i,d)}}function Et(e,n,a,o,r,i,d,c){const f=n.parentAddress??u(`address.parentAddress is undefined path: ${n.pathInfo.path}`),h=at(e,f,r,i)??[];let p=(y=h,ut.get(y)??null);var y;if(null===p){const t=$(h)??[];p={value:[...h],listIndexes:[...t]},ht(h,p)}try{return Rt(e,n,a,o,r,i,d,c)}finally{const a=p.value.indexOf(o),d=at(e,f,r,i)??[],c=Array.isArray(d)?$(d)??[]:[],u=n.listIndex.index,y=-1!==a?p.listIndexes[a]:O(f.listIndex,-1);c[u]=y;if(new Set(d).size===p.value.length){for(let t=0;t<c.length;t++)c[t].index=t;ht(h,null),function(e,n,a,o,r,i){const d=i.stateElement,c=D(),f=g(d,e);T(f)===a&&(V(n.value,n.listIndexes),B(f,n.value),N(n.value));c.enqueueRenderOnlyAddress(f);const u=new Map;n.listIndexes.forEach((t,e)=>u.set(t,e));const h=t(e.pathInfo.path+l+s);for(let t=0;t<o.length;t++){const e=o[t],s=u.get(e);if(s===t)continue;const a=m(h,e),l=g(d,a);if(void 0===s){const e=H(d,h,n.listIndexes[t]??null);At(d,l,e),$t(a,l,r,i,null,et(d,a),"full");continue}xt(d,a,d.staticDependency,d.dynamicDependency,d.listPaths,r,"new",t=>{const e=g(d,t);k(e),c.enqueueRenderOnlyAddress(e)},{listExpansion:"diff"})}}(f,p,d,c,r,i)}}}function St(e,n,a,o,r){const i=r.stateElement.listKeys;if(null!=i&&Array.isArray(a)){const d=i.get(n.pathInfo.path);if(void 0!==d){const i=at(e,n,o,r),c=function(t,e,n,s){const a=dt(s,e,t,"new");if(!Array.isArray(n)||0===n.length||0===s.length)return null;const o=n,l=dt(o,e,t,"current"),r=new Map;for(let t=0;t<o.length;t++)r.set(l[t],o[t]);const i=new Array(s.length),d=[];for(let t=0;t<s.length;t++){const e=s[t],n=r.get(a[t]);void 0!==n&&n!==e?(i[t]=n,d.push({position:t,oldRow:n,newRow:e})):i[t]=e}return d.length>0?{list:i,matched:d}:null}(n.pathInfo.path,d,i,a);if(null!==c)return function(e,n,a,o,r,i){const d=n.pathInfo.path,c=n.listIndex;null===$(o)&&P(c,null,o);const f=P(c,o,a.list),u=Mt(e,n,a.list,r,i,d),h=t(d+l+s);for(const n of a.matched){const s=ct(n.oldRow,n.newRow);if(0===s.length)continue;const a=f.newIndexes[n.position];for(const o of s){if(void 0===a){n.oldRow[o.field]=o.value;continue}const s=t(h.path+l+o.field);St(e,m(s,a),o.value,r,i)}}return u}(e,n,c,i,o,r)}}return Mt(e,n,a,o,r,null)}function Mt(t,e,n,o,l,i){const d=l.stateElement,c=e.pathInfo.path,f=d.addressHooks;if(f){const t=f.write;for(let s=0;s<t.length;s++){const a=t[s](d,e,n,o,l);if(a!==q)return a}}const h=R();if(!(c in t)&&null!==e.parentAddress&&!d.elementPaths.has(c)){const p=at(t,e.parentAddress,o,l);if("object"==typeof p&&null!==p){const t=e.pathInfo.lastSegment,y=t===s?e.listIndex?.index:t;let I,w=!1;if(!h&&W.sameValueGuard&&(null===n||"object"!=typeof n)){const t=void 0!==y&&y in p,e=void 0!==y?p[y]:void 0;if(t&&Object.is(e,n))return!0;I=e,w=!0}bt(d,c,w,I,n,()=>p[y]);const m=et(d,e),x=g(d,e);null!==r&&r({type:"state:write",absoluteAddress:x,value:n,oldValue:I,hasOldValue:w}),Pt(d,c,x,I,w);let P=!1;try{if(void 0===y&&u(a(`path "${c}"`,e.pathInfo.wildcardCount,e.listIndex?.length??0)),f&&0!==f.writeMissing.length&&t!==s&&!(y in p)){const t=f.writeMissing;for(let s=0;s<t.length;s++){P=!0;const a=t[s](d,e,p,y,n,o,l);if(a!==q)return a;P=!1}}return Reflect.set(p,y,n)}finally{$t(e,x,o,l,i,m),P?k(x):kt(d,c,x,n,m),vt(d,e.pathInfo,{value:n})}}}let p,y=!1;if(!h&&W.sameValueGuard&&(null===n||"object"!=typeof n)){const s=at(t,e,o,l);if(ft(t,e,o,l)&&Object.is(s,n))return!0;p=s,y=!0}bt(d,c,y,p,n,()=>at(t,e,o,l));const I=d.elementPaths.has(e.pathInfo.path),w=et(d,e),m=g(d,e);null!==r&&r({type:"state:write",absoluteAddress:m,value:n,oldValue:p,hasOldValue:y}),Pt(d,c,m,p,y);try{return I?Et(t,e,m,n,o,l,i,w):Rt(t,e,m,n,o,l,i,w)}finally{I||kt(d,c,m,n,w),vt(d,e.pathInfo,{value:n})}}function jt(e,n,s,a){return(n,o,...l)=>{const r=t(n);if(a.addressStackLength>0){const t=a.lastAddressStack?.pathInfo??null,e=a.stateElement;null!==t&&t.path!==r.path&&e.getterPaths.has(t.path)&&e.addDynamicDependency(r.path,t.path)}o.length!==r.wildcardParentPathInfos.length&&u(i("$resolve",n,r.wildcardParentPathInfos.length,o.length));const d=lt(e,s,a,r,o),c=m(r,d);if(0===l.length)return at(e,c,s,a);Q(a),St(e,c,l[0],s,a)}}function Ct(e,n,s,a){const o=jt(e,0,s,a);return(n,l)=>{const r=t(n);if(void 0===l||Array.isArray(l)||u(`$getAll("${n}") requires the indexes to be an array when given (omit them for the loop context, or pass [] to expand every level) — got `+(null===l?"null":typeof l)+"."),a.addressStackLength>0){const t=a.lastAddressStack?.pathInfo??null,e=a.stateElement;null!==t&&t.path!==r.path&&e.getterPaths.has(t.path)&&e.addDynamicDependency(r.path,t.path)}if(void 0!==l&&l.length>r.wildcardParentPathInfos.length&&u(i("$getAll",n,r.wildcardParentPathInfos.length,l.length)),void 0===l){for(let t=r.wildcardPaths.length-1;t>=0;t--){const e=tt(a,r.wildcardPaths[t]);if(e){l=G(e,e.length);break}}if(void 0===l){const t=a.addressStackLength>0?a.lastAddressStack:null,e=t?.listIndex??null;r.wildcardCount>0&&null!==t&&null!==e&&e.length>0&&u(d(n,t.pathInfo.path)),l=[]}}const c=ot(e,s,a,r,l,{commitDiffBaseline:!0}),f=[];for(let t=0;t<c.length;t++)f.push(o(r.path,c[t]));return f}}function Lt(t,e,n,s){const a=e.pathInfo;switch(e.wildcardType){case"none":return null;case"context":return tt(s,a.wildcardPaths.at(-1)??u(`lastWildcardPath is null: ${e.pathInfo.path}`))??u(`ListIndex not found: ${e.pathInfo.path}`);case"all":{let a=null;for(let o=0;o<e.pathInfo.wildcardCount;o++){const l=e.pathInfo.wildcardParentPathInfos[o]??u(`wildcardParentPathInfo is null: ${e.pathInfo.path}`),r=at(t,m(l,a),n,s),i=v(r,a)??u(`ListIndex not found: ${l.path}`),d=e.wildcardIndexes[o]??u(`wildcardIndex is null: ${e.pathInfo.path}`);a=i[d]??u(`ListIndex not found at index ${d} of ${l.path}`)}return a}case"partial":u(`Partial wildcard type is not supported yet: ${e.pathInfo.path}`)}}function Ot(e,n,s,a){return(n,o,l,r)=>{Q(a);const d=t(n);Array.isArray(o)||u(c(n,"requires an explicit indexes array (pass [] to expand every level).")),o.length>d.wildcardParentPathInfos.length&&u(i("$setAll",n,d.wildcardParentPathInfos.length,o.length));const h=!0===r?.spread,p="function"==typeof l;h&&p&&u(c(n,"cannot combine { spread: true } with a mapper function.")),h&&!Array.isArray(l)&&u(c(n,"requires an array as the value when { spread: true } is set."));const g=ot(e,s,a,d,o,{commitDiffBaseline:!1});h&&l.length!==g.length&&u(f(n,g.length,l.length));const y=[];for(let t=0;t<g.length;t++){const n=lt(e,s,a,d,g[t]);y.push(m(d,n))}let I=0;for(let t=0;t<y.length;t++){const n=y[t];let o;if(p){o=l(at(e,n,s,a),...g[t])}else o=h?l[t]:l;void 0!==o&&(St(e,n,o,s,a),I++)}return I}}export{Q as a,Ct as b,Ot as c,_ as d,Lt as e,U as f,at as g,ft as h,X as i,jt as r,St as s,xt as w};
|
|
2
|
+
//# sourceMappingURL=setAll.js.map
|