@wcstack/state 1.7.1 → 1.8.4

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.min.js","sources":["../../src/config.ts","../../src/version.ts","../../src/raiseError.ts","../../src/bindings/initializeBindingPromiseByNode.ts","../../src/bindings/replaceToReplaceNode.ts","../../src/structural/resolveNodePath.ts","../../src/bindings/getBindingInfos.ts","../../src/bindings/getBindingsByNode.ts","../../src/define.ts","../../src/address/PathInfo.ts","../../src/structural/define.ts","../../src/filters/errorMessages.ts","../../src/filters/builtinFilters.ts","../../src/bindTextParser/parseFilters.ts","../../src/bindTextParser/parseFilterArgs.ts","../../src/bindTextParser/utils.ts","../../src/bindTextParser/parsePropPart.ts","../../src/bindTextParser/parseStatePart.ts","../../src/bindTextParser/parseBindTextsForElement.ts","../../src/bindings/parseCommentNode.ts","../../src/bindings/getParseBindTextResults.ts","../../src/bindTextParser/parseBindTextForEmbeddedNode.ts","../../src/bindings/getSubscriberNodes.ts","../../src/bindings/collectNodesAndBindingInfos.ts","../../src/list/loopContextByNode.ts","../../src/proxy/symbols.ts","../../src/event/handler.ts","../../src/getCustomElement.ts","../../src/event/isPossibleTwoWay.ts","../../src/event/twowayHandler.ts","../../src/list/lastListValueByAbsoluteStateAddress.ts","../../src/address/AbsolutePathInfo.ts","../../src/address/AbsoluteStateAddress.ts","../../src/apply/rootNodeByFragment.ts","../../src/address/calcWildcardLen.ts","../../src/list/getListIndexByBindingInfo.ts","../../src/binding/getAbsoluteStateAddressByBinding.ts","../../src/webComponent/completeWebComponent.ts","../../src/apply/getFilteredValue.ts","../../src/apply/applyChangeToCheckbox.ts","../../src/createEmptyArray.ts","../../src/address/StateAddress.ts","../../src/bindings/indexBindingsByContent.ts","../../src/polyfills.ts","../../src/getUUID.ts","../../src/list/createListIndex.ts","../../src/list/listIndexesByList.ts","../../src/list/createListDiff.ts","../../src/binding/getBindingSetByAbsoluteStateAddress.ts","../../src/binding/getStateAddressByBindingInfo.ts","../../src/bindings/bindingsByContent.ts","../../src/bindings/nodesByContent.ts","../../src/bindings/bindLoopContextToContent.ts","../../src/structural/activateContent.ts","../../src/structural/contentsByNode.ts","../../src/createEmptySet.ts","../../src/structural/createContent.ts","../../src/bindings/initializeBindings.ts","../../src/apply/applyChangeToFor.ts","../../src/apply/applyChangeToIf.ts","../../src/apply/ssrPropertyStore.ts","../../src/apply/applyChangeToProperty.ts","../../src/apply/applyChangeToText.ts","../../src/apply/applyChangeToWebComponent.ts","../../src/apply/getValue.ts","../../src/list/getIndexValueByLoopContext.ts","../../src/apply/applyChange.ts","../../src/apply/applyChangeToClass.ts","../../src/apply/applyChangeToAttribute.ts","../../src/apply/applyChangeToStyle.ts","../../src/apply/applyChangeToRadio.ts","../../src/apply/applyChangeFromBindings.ts","../../src/event/radioHandler.ts","../../src/event/checkboxHandler.ts","../../src/mustache/convertMustacheToComments.ts","../../src/structural/createNotFilter.ts","../../src/structural/expandShorthandPaths.ts","../../src/structural/getNodePath.ts","../../src/structural/getFragmentNodeInfos.ts","../../src/structural/optimizeFragment.ts","../../src/structural/collectStructuralFragments.ts","../../src/waitForStateInitialize.ts","../../src/buildBindings.ts","../../src/hydrateBindings.ts","../../src/stateElementByName.ts","../../src/structural/fragmentInfoByUUID.ts","../../src/components/Ssr.ts","../../src/stateLoader/loadFromInnerScript.ts","../../src/stateLoader/loadFromScriptFile.ts","../../src/list/loopContext.ts","../../src/dcc/dccPropertyFactories.ts","../../src/address/ResolvedAddress.ts","../../src/cache/cacheEntryByAbsoluteStateAddress.ts","../../src/proxy/methods/getByAddress.ts","../../src/proxy/methods/checkDependency.ts","../../src/proxy/methods/getContextListIndex.ts","../../src/updater/updater.ts","../../src/proxy/methods/swapInfo.ts","../../src/dependency/walkDependency.ts","../../src/proxy/methods/setByAddress.ts","../../src/proxy/apis/resolve.ts","../../src/proxy/apis/getAll.ts","../../src/proxy/methods/getListIndex.ts","../../src/proxy/methods/setLoopContext.ts","../../src/proxy/traps/get.ts","../../src/proxy/apis/postUpdate.ts","../../src/proxy/apis/trackDependency.ts","../../src/proxy/apis/connectedCallback.ts","../../src/proxy/apis/disconnectedCallback.ts","../../src/proxy/apis/updatedCallback.ts","../../src/proxy/StateHandler.ts","../../src/proxy/traps/set.ts","../../src/webComponent/lastValueByAbsoluteStateAddress.ts","../../src/webComponent/stateElementByWebComponent.ts","../../src/webComponent/MappingRule.ts","../../src/webComponent/meltFrozenObject.ts","../../src/webComponent/innerState.ts","../../src/webComponent/outerState.ts","../../src/webComponent/plainOuterState.ts","../../src/webComponent/bindWebComponent.ts","../../src/components/State.ts","../../src/stateLoader/loadFromScriptJson.ts","../../src/stateLoader/loadFromJsonFile.ts","../../src/dcc/defineDCC.ts","../../src/dcc/wcBindable.ts","../../src/registerComponents.ts","../../src/bootstrapState.ts","../../src/defineState.ts"],"sourcesContent":["import { IConfig, IWritableConfig } from \"./types.js\";\r\n\r\nlet _inSsrCache: boolean | null = null;\r\n\r\nexport function inSsr(): boolean {\r\n if (_inSsrCache !== null) return _inSsrCache;\r\n const html = document.querySelector('html');\r\n _inSsrCache = html ? html.hasAttribute('data-wcs-server') : false;\r\n return _inSsrCache;\r\n}\r\n\r\n/** @internal テスト用: inSsr() キャッシュをリセット */\r\nexport function resetSsrCache(): void {\r\n _inSsrCache = null;\r\n}\r\n\r\ninterface IInternalConfig {\r\n bindAttributeName: string;\r\n commentTextPrefix: string;\r\n commentForPrefix: string;\r\n commentIfPrefix: string;\r\n commentElseIfPrefix: string;\r\n commentElsePrefix: string;\r\n tagNames: {\r\n state: string;\r\n ssr: string;\r\n };\r\n locale: string;\r\n debug: boolean;\r\n enableMustache: boolean;\r\n}\r\n\r\nconst _config: IInternalConfig = {\r\n bindAttributeName: 'data-wcs',\r\n commentTextPrefix: 'wcs-text',\r\n commentForPrefix: 'wcs-for',\r\n commentIfPrefix: 'wcs-if',\r\n commentElseIfPrefix: 'wcs-elseif',\r\n commentElsePrefix: 'wcs-else',\r\n tagNames: {\r\n state: 'wcs-state',\r\n ssr: 'wcs-ssr',\r\n },\r\n locale: 'en',\r\n debug: false,\r\n enableMustache: true,\r\n};\r\n\r\n// backward compatible export (read-only usage)\r\nexport const config: IConfig = _config as IConfig;\r\n\r\nexport function getConfig(): IConfig {\r\n return config;\r\n}\r\n\r\nexport function setConfig(partialConfig: IWritableConfig): void {\r\n if (partialConfig.tagNames) {\r\n Object.assign(_config.tagNames, partialConfig.tagNames);\r\n }\r\n if (typeof partialConfig.bindAttributeName === \"string\") {\r\n _config.bindAttributeName = partialConfig.bindAttributeName;\r\n }\r\n if (typeof partialConfig.commentTextPrefix === \"string\") {\r\n _config.commentTextPrefix = partialConfig.commentTextPrefix;\r\n }\r\n if (typeof partialConfig.commentForPrefix === \"string\") {\r\n _config.commentForPrefix = partialConfig.commentForPrefix;\r\n }\r\n if (typeof partialConfig.commentIfPrefix === \"string\") {\r\n _config.commentIfPrefix = partialConfig.commentIfPrefix;\r\n }\r\n if (typeof partialConfig.commentElseIfPrefix === \"string\") {\r\n _config.commentElseIfPrefix = partialConfig.commentElseIfPrefix;\r\n }\r\n if (typeof partialConfig.commentElsePrefix === \"string\") {\r\n _config.commentElsePrefix = partialConfig.commentElsePrefix;\r\n }\r\n if (typeof partialConfig.locale === \"string\") {\r\n _config.locale = partialConfig.locale;\r\n }\r\n if (typeof partialConfig.debug === \"boolean\") {\r\n _config.debug = partialConfig.debug;\r\n }\r\n if (typeof partialConfig.enableMustache === \"boolean\") {\r\n _config.enableMustache = partialConfig.enableMustache;\r\n }\r\n}\r\n","import pkg from \"../package.json\" with { type: \"json\" };\r\nexport const VERSION = pkg.version;\r\n","\r\nexport function raiseError(message: string): never {\r\n throw new Error(`[@wcstack/state] ${message}`);\r\n}","import { IInitializeBindingPromise } from \"./types\";\r\n\r\nconst bindingPromiseByNode = new WeakMap<Node, IInitializeBindingPromise>();\r\n\r\nlet id = 0;\r\n\r\nexport function getInitializeBindingPromiseByNode(node: Node): IInitializeBindingPromise {\r\n let bindingPromise = bindingPromiseByNode.get(node) || null;\r\n if (bindingPromise !== null) {\r\n return bindingPromise;\r\n }\r\n let resolveFn = undefined;\r\n const promise = new Promise<void>((resolve) => {\r\n resolveFn = resolve;\r\n });\r\n bindingPromise = {\r\n id: ++id,\r\n promise,\r\n resolve: resolveFn!\r\n };\r\n bindingPromiseByNode.set(node, bindingPromise);\r\n return bindingPromise;\r\n}\r\n\r\nexport async function waitInitializeBinding(node: Node): Promise<void> {\r\n const bindingPromise = getInitializeBindingPromiseByNode(node);\r\n await bindingPromise.promise;\r\n}\r\n\r\nexport function resolveInitializedBinding(node: Node): void {\r\n const bindingPromise = getInitializeBindingPromiseByNode(node);\r\n bindingPromise.resolve();\r\n}\r\n","import { IBindingInfo } from \"../types.js\";\r\n\r\nexport function replaceToReplaceNode(bindingInfo: IBindingInfo): void {\r\n const node = bindingInfo.node;\r\n const replaceNode = bindingInfo.replaceNode;\r\n if (node === replaceNode) {\r\n return;\r\n }\r\n if (node.parentNode === null) {\r\n // already replaced\r\n return;\r\n }\r\n node.parentNode.replaceChild(replaceNode, node);\r\n}\r\n","\r\nexport function resolveNodePath(root: Node, path: number[]): Node | null {\r\n let currentNode = root;\r\n if (path.length === 0) return currentNode;\r\n // path.reduce()だと途中でnullになる可能性があるので、\r\n for(let i = 0; i < path.length; i++) {\r\n currentNode = currentNode?.childNodes[path[i]] ?? null;\r\n if (currentNode === null) break;\r\n }\r\n return currentNode;\r\n}","import { IBindingInfo } from \"../types\";\r\nimport { ParseBindTextResult } from \"../bindTextParser/types\";\r\n\r\nexport function getBindingInfos(node: Node, parseBindingTextResults: ParseBindTextResult[]): IBindingInfo[] {\r\n const bindingInfos: IBindingInfo[] = [];\r\n for (const parseBindingTextResult of parseBindingTextResults) {\r\n if (parseBindingTextResult.bindingType !== 'text') {\r\n bindingInfos.push({\r\n ...parseBindingTextResult,\r\n node: node,\r\n replaceNode: node,\r\n });\r\n } else {\r\n const replaceNode = document.createTextNode('');\r\n bindingInfos.push({\r\n ...parseBindingTextResult,\r\n node: node,\r\n replaceNode: replaceNode,\r\n });\r\n }\r\n }\r\n return bindingInfos;\r\n}\r\n","import { IBindingInfo } from \"../binding/types\";\r\n\r\nconst bindingsByNode = new WeakMap<Node, IBindingInfo[]>();\r\n\r\nexport function getBindingsByNode(node: Node): IBindingInfo[] | null {\r\n return bindingsByNode.get(node) || null;\r\n}\r\n\r\nexport function setBindingsByNode(node: Node, bindings: IBindingInfo[]): void {\r\n bindingsByNode.set(node, bindings);\r\n}\r\n\r\nexport function addBindingByNode(node: Node, binding: IBindingInfo): void {\r\n const bindings = getBindingsByNode(node);\r\n if (bindings === null) {\r\n setBindingsByNode(node, [binding]);\r\n } else {\r\n bindings.push(binding);\r\n }\r\n}","export const DELIMITER = '.';\r\nexport const WILDCARD = '*';\r\nexport const MAX_WILDCARD_DEPTH = 128;\r\nexport const MAX_LOOP_DEPTH = 128;\r\n\r\n/**\r\n * stackIndexByIndexName\r\n * インデックス名からスタックインデックスへのマッピング\r\n * $1 => 0\r\n * $2 => 1\r\n * :\r\n * ${i + 1} => i\r\n * i < MAX_WILDCARD_DEPTH\r\n */\r\nconst tmpIndexByIndexName: { [key: PropertyKey]: number } = {};\r\nfor (let i = 0; i < MAX_WILDCARD_DEPTH; i++) {\r\n tmpIndexByIndexName[`$${i+1}`] = i;\r\n}\r\nexport const INDEX_BY_INDEX_NAME: { [key: PropertyKey]: number } = Object.freeze(tmpIndexByIndexName);\r\n\r\nexport const NO_SET_TIMEOUT = 60 * 1000; // 1分\r\n\r\nexport const SVG_NAMESPACE = 'http://www.w3.org/2000/svg';\r\n\r\nexport const STATE_CONNECTED_CALLBACK_NAME = \"$connectedCallback\";\r\nexport const STATE_DISCONNECTED_CALLBACK_NAME = \"$disconnectedCallback\";\r\nexport const STATE_UPDATED_CALLBACK_NAME = \"$updatedCallback\";\r\n\r\nexport const WEBCOMPONENT_STATE_READY_CALLBACK_NAME = \"$stateReadyCallback\";\r\n\r\nexport const STATE_BINDABLES_NAME = \"$bindables\";\r\nexport const DCC_DEFINITION_ATTRIBUTE = \"data-wc-definition\";\r\n","import { WILDCARD } from \"../define.js\";\r\nimport { IPathInfo } from \"./types.js\";\r\n\r\nconst _cache: Map<string, IPathInfo> = new Map();\r\n\r\nlet id: number = 0;\r\nexport function getPathInfo(path: string): IPathInfo {\r\n let pathInfo = _cache.get(path);\r\n if (typeof pathInfo !== \"undefined\") {\r\n return pathInfo;\r\n }\r\n pathInfo = Object.freeze(new PathInfo(path));\r\n _cache.set(path, pathInfo);\r\n return pathInfo;\r\n}\r\n\r\nclass PathInfo implements IPathInfo {\r\n readonly id: number = ++id;\r\n readonly path: string;\r\n readonly segments: string[];\r\n readonly lastSegment: string;\r\n readonly cumulativePaths: string[];\r\n readonly cumulativePathSet: Set<string>;\r\n readonly cumulativePathInfos: IPathInfo[];\r\n readonly cumulativePathInfoSet: Set<IPathInfo>;\r\n readonly parentPath: string | null;\r\n readonly wildcardPaths: string[];\r\n readonly wildcardPathSet: Set<string>;\r\n readonly indexByWildcardPath: Record<string, number>;\r\n readonly wildcardPathInfos: IPathInfo[];\r\n readonly wildcardPathInfoSet: Set<IPathInfo>;\r\n readonly wildcardParentPaths: string[];\r\n readonly wildcardParentPathSet: Set<string>;\r\n readonly wildcardParentPathInfos: IPathInfo[];\r\n readonly wildcardParentPathInfoSet: Set<IPathInfo>;\r\n readonly wildcardPositions: number[];\r\n readonly lastWildcardPath: string | null;\r\n readonly lastWildcardInfo: IPathInfo | null;\r\n readonly wildcardCount: number;\r\n readonly parentPathInfo: IPathInfo | null;\r\n constructor(path: string) {\r\n // Helper to get or create StructuredPathInfo instances, avoiding redundant creation for self-reference\r\n const getPattern = (_path: string): IPathInfo => {\r\n return (path === _path) ? this : getPathInfo(_path);\r\n };\r\n \r\n // Split the pattern into individual path segments (e.g., \"items.*.name\" → [\"items\", \"*\", \"name\"])\r\n const segments = path.split(\".\");\r\n \r\n // Arrays to track all cumulative paths from root to each segment\r\n const cumulativePaths = [];\r\n const cumulativePathInfos: IPathInfo[] = [];\r\n \r\n // Arrays to track wildcard-specific information\r\n const wildcardPaths = [];\r\n const indexByWildcardPath: Record<string, number> = {}; // Maps wildcard path to its index position\r\n const wildcardPathInfos = [];\r\n const wildcardParentPaths = []; // Paths of parent segments for each wildcard\r\n const wildcardParentPathInfos = [];\r\n const wildcardPositions = [];\r\n \r\n let currentPatternPath = \"\", prevPatternPath = \"\";\r\n let wildcardCount = 0;\r\n \r\n // Iterate through each segment to build cumulative paths and identify wildcards\r\n for(let i = 0; i < segments.length; i++) {\r\n currentPatternPath += segments[i];\r\n \r\n // If this segment is a wildcard, track it with all wildcard-specific metadata\r\n if (segments[i] === WILDCARD) {\r\n wildcardPaths.push(currentPatternPath);\r\n indexByWildcardPath[currentPatternPath] = wildcardCount; // Store wildcard's ordinal position\r\n wildcardPathInfos.push(getPattern(currentPatternPath));\r\n wildcardParentPaths.push(prevPatternPath); // Parent path is the previous cumulative path\r\n wildcardParentPathInfos.push(getPattern(prevPatternPath));\r\n wildcardPositions.push(i);\r\n wildcardCount++;\r\n }\r\n \r\n // Track all cumulative paths for hierarchical navigation (e.g., \"items\", \"items.*\", \"items.*.name\")\r\n cumulativePaths.push(currentPatternPath);\r\n cumulativePathInfos.push(getPattern(currentPatternPath));\r\n \r\n // Save current path as previous for next iteration, then add separator\r\n prevPatternPath = currentPatternPath;\r\n currentPatternPath += \".\";\r\n }\r\n \r\n // Determine the deepest (last) wildcard path and the parent path of the entire pattern\r\n const lastWildcardPath = wildcardPaths.length > 0 ? wildcardPaths[wildcardPaths.length - 1] : null;\r\n const parentPath = cumulativePaths.length > 1 ? cumulativePaths[cumulativePaths.length - 2] : null;\r\n \r\n // Assign all analyzed data to readonly properties\r\n this.path = path;\r\n this.segments = segments;\r\n this.lastSegment = segments[segments.length - 1];\r\n this.cumulativePaths = cumulativePaths;\r\n this.cumulativePathSet = new Set(cumulativePaths); // Set for fast lookup\r\n this.cumulativePathInfos = cumulativePathInfos;\r\n this.cumulativePathInfoSet = new Set(cumulativePathInfos);\r\n this.wildcardPaths = wildcardPaths;\r\n this.wildcardPathSet = new Set(wildcardPaths);\r\n this.indexByWildcardPath = indexByWildcardPath;\r\n this.wildcardPathInfos = wildcardPathInfos;\r\n this.wildcardPathInfoSet = new Set(wildcardPathInfos);\r\n this.wildcardParentPaths = wildcardParentPaths;\r\n this.wildcardParentPathSet = new Set(wildcardParentPaths);\r\n this.wildcardParentPathInfos = wildcardParentPathInfos;\r\n this.wildcardParentPathInfoSet = new Set(wildcardParentPathInfos);\r\n this.wildcardPositions = wildcardPositions;\r\n this.lastWildcardPath = lastWildcardPath;\r\n this.lastWildcardInfo = lastWildcardPath ? getPattern(lastWildcardPath) : null;\r\n this.parentPath = parentPath;\r\n this.parentPathInfo = parentPath ? getPattern(parentPath) : null;\r\n this.wildcardCount = wildcardCount;\r\n }\r\n}\r\n","import { BindingType } from \"../types.js\";\r\n\r\nexport const STRUCTURAL_BINDING_TYPE_SET: Set<BindingType> = new Set([\r\n \"if\",\r\n \"elseif\",\r\n \"else\",\r\n \"for\",\r\n]);\r\n","/**\r\n * errorMessages.ts\r\n *\r\n * Error message generation utilities used by filter functions.\r\n *\r\n * Main responsibilities:\r\n * - Throws clear error messages when filter options or value type checks fail\r\n * - Takes function name as argument to specify which filter caused the error\r\n *\r\n * Design points:\r\n * - optionsRequired: Error when required option is not specified\r\n * - optionMustBeNumber: Error when option value is not a number\r\n * - valueMustBeNumber: Error when value is not a number\r\n * - valueMustBeBoolean: Error when value is not boolean\r\n * - valueMustBeDate: Error when value is not a Date\r\n */\r\nimport { raiseError } from \"../raiseError\";\r\n\r\n/**\r\n * Throws error when filter requires at least one option but none provided.\r\n * \r\n * @param fnName - Name of the filter function\r\n * @returns Never returns (always throws)\r\n */\r\nexport function optionsRequired(fnName:string): never {\r\n raiseError(`filter ${fnName} requires at least one option`);\r\n}\r\n\r\n/**\r\n * Throws error when filter option must be a number but invalid value provided.\r\n * \r\n * @param fnName - Name of the filter function\r\n * @returns Never returns (always throws)\r\n */\r\nexport function optionMustBeNumber(fnName:string): never {\r\n raiseError(`filter ${fnName} requires a number as option`);\r\n}\r\n\r\n/**\r\n * Throws error when filter requires numeric value but non-number provided.\r\n * \r\n * @param fnName - Name of the filter function\r\n * @returns Never returns (always throws)\r\n */\r\nexport function valueMustBeNumber(fnName:string): never {\r\n raiseError(`filter ${fnName} requires a number value`);\r\n}\r\n\r\n/**\r\n * Throws error when filter requires numeric value but non-number provided.\r\n * \r\n * @param fnName - Name of the filter function\r\n * @returns Never returns (always throws)\r\n */\r\nexport function valueMustBeString(fnName:string): never {\r\n raiseError(`filter ${fnName} requires a string value`);\r\n}\r\n\r\n/**\r\n * Throws error when filter requires boolean value but non-boolean provided.\r\n * \r\n * @param fnName - Name of the filter function\r\n * @returns Never returns (always throws)\r\n */\r\nexport function valueMustBeBoolean(fnName:string): never {\r\n raiseError(`filter ${fnName} requires a boolean value`);\r\n} \r\n\r\n/**\r\n * Throws error when filter requires Date value but non-Date provided.\r\n * \r\n * @param fnName - Name of the filter function\r\n * @returns Never returns (always throws)\r\n */\r\nexport function valueMustBeDate(fnName:string): never {\r\n raiseError(`filter ${fnName} requires a date value`);\r\n}","/**\r\n * builtinFilters.ts\r\n *\r\n * Implementation file for built-in filter functions available in Structive.\r\n *\r\n * Main responsibilities:\r\n * - Provides filters for conversion, comparison, formatting, and validation of numbers, strings, dates, booleans, etc.\r\n * - Defines functions with options for each filter name, enabling flexible use during binding\r\n * - Designed for common use as both input and output filters\r\n *\r\n * Design points:\r\n * - Comprehensive coverage of diverse filters: eq, ne, lt, gt, inc, fix, locale, uc, lc, cap, trim, slice, pad, int, float, round, date, time, ymd, falsy, truthy, defaults, boolean, number, string, null, etc.\r\n * - Rich type checking and error handling for option values\r\n * - Centralized management of filter functions with FilterWithOptions type, easy to extend\r\n * - Dynamic retrieval of filter functions from filter names and options via builtinFilterFn\r\n */\r\nimport { config } from \"../config.js\";\r\nimport { raiseError } from \"../raiseError.js\";\r\nimport { optionMustBeNumber, optionsRequired, valueMustBeBoolean, valueMustBeDate, valueMustBeNumber } from \"./errorMessages.js\";\r\nimport { FilterFn, FilterWithOptions } from \"./types\";\r\n\r\nfunction validateNumberString(value: string): boolean {\r\n if (!value || isNaN(Number(value))) {\r\n return false;\r\n }\r\n return true;\r\n}\r\n\r\n/**\r\n * Equality filter - compares value with option.\r\n * \r\n * @param options - Array with comparison value as first element\r\n * @returns Filter function that returns boolean\r\n */\r\nconst eq = (options?:string[]): FilterFn<boolean> => {\r\n const opt = options?.[0] ?? optionsRequired('eq');\r\n return (value: unknown): boolean => {\r\n // Align types for comparison\r\n if (typeof value === 'number') {\r\n if (!validateNumberString(opt)) {optionMustBeNumber('eq');}\r\n return value === Number(opt);\r\n }\r\n if (typeof value === 'string') {\r\n return value === opt;\r\n }\r\n // Strict equality for others\r\n return value === opt;\r\n }\r\n}\r\n\r\n/**\r\n * Inequality filter - compares value with option.\r\n * \r\n * @param options - Array with comparison value as first element\r\n * @returns Filter function that returns boolean\r\n */\r\nconst ne = (options?:string[]): FilterFn<boolean> => {\r\n const opt = options?.[0] ?? optionsRequired('ne');\r\n return (value: unknown): boolean => {\r\n // Align types for comparison\r\n if (typeof value === 'number') {\r\n if (!validateNumberString(opt)) {optionMustBeNumber('ne');}\r\n return value !== Number(opt);\r\n }\r\n if (typeof value === 'string') {\r\n return value !== opt;\r\n }\r\n // Strict equality for others\r\n return value !== opt;\r\n }\r\n}\r\n\r\n/**\r\n * Boolean NOT filter - inverts boolean value.\r\n * \r\n * @param options - Unused\r\n * @returns Filter function that returns inverted boolean\r\n */\r\nconst not = (_options?:string[]): FilterFn<boolean> => {\r\n return (value: unknown): boolean => {\r\n if (typeof value !== 'boolean') {valueMustBeBoolean('not');}\r\n return !value;\r\n }\r\n}\r\n\r\n/**\r\n * Less than filter - checks if value is less than option.\r\n * \r\n * @param options - Array with comparison number as first element\r\n * @returns Filter function that returns boolean\r\n */\r\nconst lt = (options?:string[]): FilterFn<boolean> => {\r\n const opt = options?.[0] ?? optionsRequired('lt');\r\n if (!validateNumberString(opt)) {optionMustBeNumber('lt');}\r\n return (value: unknown): boolean => {\r\n if (typeof value !== 'number') {valueMustBeNumber('lt');}\r\n return value < Number(opt);\r\n }\r\n}\r\n\r\n/**\r\n * Less than or equal filter - checks if value is less than or equal to option.\r\n * \r\n * @param options - Array with comparison number as first element\r\n * @returns Filter function that returns boolean\r\n */\r\nconst le = (options?:string[]): FilterFn<boolean> => {\r\n const opt = options?.[0] ?? optionsRequired('le');\r\n if (!validateNumberString(opt)) {optionMustBeNumber('le');}\r\n return (value: unknown): boolean => {\r\n if (typeof value !== 'number') {valueMustBeNumber('le');}\r\n return value <= Number(opt);\r\n }\r\n}\r\n\r\n/**\r\n * Greater than filter - checks if value is greater than option.\r\n * \r\n * @param options - Array with comparison number as first element\r\n * @returns Filter function that returns boolean\r\n */\r\nconst gt = (options?:string[]): FilterFn<boolean> => {\r\n const opt = options?.[0] ?? optionsRequired('gt');\r\n if (!validateNumberString(opt)) {optionMustBeNumber('gt');}\r\n return (value: unknown): boolean => {\r\n if (typeof value !== 'number') {valueMustBeNumber('gt');}\r\n return value > Number(opt);\r\n }\r\n}\r\n\r\n/**\r\n * Greater than or equal filter - checks if value is greater than or equal to option.\r\n * \r\n * @param options - Array with comparison number as first element\r\n * @returns Filter function that returns boolean\r\n */\r\nconst ge = (options?:string[]): FilterFn<boolean> => {\r\n const opt = options?.[0] ?? optionsRequired('ge');\r\n if (!validateNumberString(opt)) {optionMustBeNumber('ge');}\r\n return (value: unknown): boolean => {\r\n if (typeof value !== 'number') {valueMustBeNumber('ge');}\r\n return value >= Number(opt);\r\n }\r\n}\r\n\r\n/**\r\n * Increment filter - adds option value to input value.\r\n * \r\n * @param options - Array with increment number as first element\r\n * @returns Filter function that returns incremented number\r\n */\r\nconst inc = (options?:string[]): FilterFn<number> => {\r\n const opt = options?.[0] ?? optionsRequired('inc');\r\n if (!validateNumberString(opt)) {optionMustBeNumber('inc');}\r\n return (value: unknown): number => {\r\n if (typeof value !== 'number') {valueMustBeNumber('inc');}\r\n return value + Number(opt);\r\n }\r\n}\r\n\r\n/**\r\n * Decrement filter - subtracts option value from input value.\r\n * \r\n * @param options - Array with decrement number as first element\r\n * @returns Filter function that returns decremented number\r\n */\r\nconst dec = (options?:string[]): FilterFn<number> => {\r\n const opt = options?.[0] ?? optionsRequired('dec');\r\n if (!validateNumberString(opt)) {optionMustBeNumber('dec');}\r\n return (value: unknown): number => {\r\n if (typeof value !== 'number') {valueMustBeNumber('dec');}\r\n return value - Number(opt);\r\n }\r\n}\r\n\r\n/**\r\n * Multiply filter - multiplies value by option.\r\n * \r\n * @param options - Array with multiplier number as first element\r\n * @returns Filter function that returns multiplied number\r\n */\r\nconst mul = (options?:string[]): FilterFn<number> => {\r\n const opt = options?.[0] ?? optionsRequired('mul');\r\n if (!validateNumberString(opt)) {optionMustBeNumber('mul');}\r\n return (value: unknown): number => {\r\n if (typeof value !== 'number') {valueMustBeNumber('mul');}\r\n return value * Number(opt);\r\n }\r\n}\r\n\r\n/**\r\n * Divide filter - divides value by option.\r\n * \r\n * @param options - Array with divisor number as first element\r\n * @returns Filter function that returns divided number\r\n */\r\nconst div = (options?:string[]): FilterFn<number> => {\r\n const opt = options?.[0] ?? optionsRequired('div');\r\n if (!validateNumberString(opt)) {optionMustBeNumber('div');}\r\n return (value: unknown): number => {\r\n if (typeof value !== 'number') {valueMustBeNumber('div');}\r\n return value / Number(opt);\r\n }\r\n}\r\n\r\n/**\r\n * Modulo filter - returns remainder of division.\r\n * \r\n * @param options - Array with divisor number as first element\r\n * @returns Filter function that returns remainder\r\n */\r\nconst mod = (options?:string[]): FilterFn<number> => {\r\n const opt = options?.[0] ?? optionsRequired('mod');\r\n if (!validateNumberString(opt)) {optionMustBeNumber('mod');}\r\n return (value: unknown): number => {\r\n if (typeof value !== 'number') {valueMustBeNumber('mod');}\r\n return value % Number(opt);\r\n }\r\n}\r\n\r\n/**\r\n * Fixed decimal filter - formats number to fixed decimal places.\r\n * \r\n * @param options - Array with decimal places as first element (default: 0)\r\n * @returns Filter function that returns formatted string\r\n */\r\nconst fix = (options?:string[]): FilterFn<string> => {\r\n const opt = options?.[0] ?? \"0\";\r\n if (!validateNumberString(opt)) {optionMustBeNumber('fix');}\r\n return (value: unknown): string => {\r\n if (typeof value !== 'number') {valueMustBeNumber('fix');}\r\n return value.toFixed(Number(opt));\r\n }\r\n}\r\n\r\n/**\r\n * Locale number filter - formats number according to locale.\r\n * \r\n * @param options - Array with locale string as first element (default: config.locale)\r\n * @returns Filter function that returns localized number string\r\n */\r\nconst locale = (options?:string[]): FilterFn<string> => {\r\n const opt = options?.[0] ?? config.locale;\r\n return (value: unknown): string => {\r\n if (typeof value !== 'number') {valueMustBeNumber('locale');}\r\n return value.toLocaleString(opt);\r\n }\r\n}\r\n\r\n/**\r\n * Uppercase filter - converts string to uppercase.\r\n * \r\n * @param options - Unused\r\n * @returns Filter function that returns uppercase string\r\n */\r\nconst uc = (_options?:string[]): FilterFn<string> => {\r\n return (value: unknown): string => {\r\n return String(value).toUpperCase();\r\n }\r\n}\r\n\r\n/**\r\n * Lowercase filter - converts string to lowercase.\r\n * \r\n * @param options - Unused\r\n * @returns Filter function that returns lowercase string\r\n */\r\nconst lc = (_options?:string[]): FilterFn<string> => {\r\n return (value: unknown): string => {\r\n return String(value).toLowerCase();\r\n }\r\n}\r\n\r\n/**\r\n * Capitalize filter - capitalizes first character of string.\r\n * \r\n * @param options - Unused\r\n * @returns Filter function that returns capitalized string\r\n */\r\nconst cap = (_options?:string[]): FilterFn<string> => {\r\n return (value: unknown): string => {\r\n const v = String(value);\r\n if (v.length === 0) {return v;}\r\n if (v.length === 1) {return v.toUpperCase();}\r\n return v.charAt(0).toUpperCase() + v.slice(1);\r\n }\r\n}\r\n\r\n/**\r\n * Trim filter - removes whitespace from both ends of string.\r\n * \r\n * @param options - Unused\r\n * @returns Filter function that returns trimmed string\r\n */\r\nconst trim = (_options?:string[]): FilterFn<string> => {\r\n return (value: unknown): string => {\r\n return String(value).trim();\r\n }\r\n}\r\n\r\n/**\r\n * Slice filter - extracts portion of string from specified index.\r\n * \r\n * @param options - Array with start index and optional end index\r\n * @returns Filter function that returns sliced string\r\n */\r\nconst slice = (options?:string[]): FilterFn<string> => {\r\n const numberedOpts: number[] = [];\r\n const opt1 = options?.[0] ?? optionsRequired('slice');\r\n if (!validateNumberString(opt1)) {optionMustBeNumber('slice');}\r\n numberedOpts.push(Number(opt1));\r\n const opt2 = options?.[1];\r\n if (typeof opt2 !== 'undefined') {\r\n if (!validateNumberString(opt2)) {optionMustBeNumber('slice');}\r\n numberedOpts.push(Number(opt2));\r\n }\r\n return (value: unknown): string => {\r\n return String(value).slice(...numberedOpts);\r\n }\r\n}\r\n\r\n/**\r\n * Substring filter - extracts substring from specified position and length.\r\n * \r\n * @param options - Array with start index and length\r\n * @returns Filter function that returns substring\r\n */\r\nconst substr = (options?:string[]): FilterFn<string> => {\r\n const opt1 = options?.[0] ?? optionsRequired('substr');\r\n if (!validateNumberString(opt1)) {optionMustBeNumber('substr');}\r\n const opt2 = options?.[1] ?? optionsRequired('substr');\r\n if (!validateNumberString(opt2)) {optionMustBeNumber('substr');}\r\n return (value: unknown): string => {\r\n return String(value).substr(Number(opt1), Number(opt2));\r\n }\r\n}\r\n\r\n/**\r\n * Pad filter - pads string to specified length from start.\r\n * \r\n * @param options - Array with target length and pad string (default: '0')\r\n * @returns Filter function that returns padded string\r\n */\r\nconst pad = (options?:string[]): FilterFn<string> => {\r\n const opt1 = options?.[0] ?? optionsRequired('pad');\r\n if (!validateNumberString(opt1)) {optionMustBeNumber('pad');}\r\n const opt2 = options?.[1] ?? '0';\r\n return (value: unknown): string => {\r\n return String(value).padStart(Number(opt1), opt2);\r\n }\r\n}\r\n\r\n/**\r\n * Repeat filter - repeats string specified number of times.\r\n * \r\n * @param options - Array with repeat count as first element\r\n * @returns Filter function that returns repeated string\r\n */\r\nconst rep = (options?:string[]): FilterFn<string> => {\r\n const opt = options?.[0] ?? optionsRequired('rep');\r\n if (!validateNumberString(opt)) {optionMustBeNumber('rep');}\r\n return (value: unknown): string => {\r\n return String(value).repeat(Number(opt));\r\n }\r\n}\r\n\r\n/**\r\n * Reverse filter - reverses character order in string.\r\n * \r\n * @param options - Unused\r\n * @returns Filter function that returns reversed string\r\n */\r\nconst rev = (_options?:string[]): FilterFn<string> => {\r\n return (value: unknown): string => {\r\n return String(value).split('').reverse().join('');\r\n }\r\n}\r\n\r\n/**\r\n * Integer filter - parses value to integer.\r\n * \r\n * @param options - Unused\r\n * @returns Filter function that returns integer\r\n */\r\nconst int = (_options?:string[]): FilterFn<number> => {\r\n return (value: unknown): number => {\r\n return parseInt(String(value), 10);\r\n }\r\n}\r\n\r\n/**\r\n * Float filter - parses value to floating point number.\r\n * \r\n * @param options - Unused\r\n * @returns Filter function that returns float\r\n */\r\nconst float = (_options?:string[]): FilterFn<number> => {\r\n return (value: unknown): number => {\r\n return parseFloat(String(value));\r\n }\r\n}\r\n\r\n/**\r\n * Round filter - rounds number to specified decimal places.\r\n * \r\n * @param options - Array with decimal places as first element (default: 0)\r\n * @returns Filter function that returns rounded number\r\n */\r\nconst round = (options?:string[]): FilterFn<number> => {\r\n const opt = options?.[0] ?? '0';\r\n if (!validateNumberString(opt)) {optionMustBeNumber('round');}\r\n return (value: unknown): number => {\r\n if (typeof value !== 'number') {valueMustBeNumber('round');}\r\n const optValue = Math.pow(10, Number(opt));\r\n return Math.round(value * optValue) / optValue;\r\n }\r\n}\r\n\r\n/**\r\n * Floor filter - rounds number down to specified decimal places.\r\n * \r\n * @param options - Array with decimal places as first element (default: 0)\r\n * @returns Filter function that returns floored number\r\n */\r\nconst floor = (options?:string[]): FilterFn<number> => {\r\n const opt = options?.[0] ?? '0';\r\n if (!validateNumberString(opt)) {optionMustBeNumber('floor');}\r\n return (value: unknown): number => {\r\n if (typeof value !== 'number') {valueMustBeNumber('floor');}\r\n const optValue = Math.pow(10, Number(opt));\r\n return Math.floor(value * optValue) / optValue;\r\n }\r\n}\r\n\r\n/**\r\n * Ceiling filter - rounds number up to specified decimal places.\r\n * \r\n * @param options - Array with decimal places as first element (default: 0)\r\n * @returns Filter function that returns ceiled number\r\n */\r\nconst ceil = (options?:string[]): FilterFn<number> => {\r\n const opt = options?.[0] ?? '0';\r\n if (!validateNumberString(opt)) {optionMustBeNumber('ceil');}\r\n return (value: unknown): number => {\r\n if (typeof value !== 'number') {valueMustBeNumber('ceil');}\r\n const optValue = Math.pow(10, Number(opt));\r\n return Math.ceil(value * optValue) / optValue;\r\n }\r\n}\r\n\r\n/**\r\n * Percent filter - formats number as percentage string.\r\n * \r\n * @param options - Array with decimal places as first element (default: 0)\r\n * @returns Filter function that returns percentage string with '%'\r\n */\r\nconst percent = (options?:string[]): FilterFn<string> => {\r\n const opt = options?.[0] ?? '0';\r\n if (!validateNumberString(opt)) {optionMustBeNumber('percent');}\r\n return (value: unknown): string => {\r\n if (typeof value !== 'number') {valueMustBeNumber('percent');}\r\n return `${(value * 100).toFixed(Number(opt))}%`;\r\n }\r\n}\r\n\r\n/**\r\n * Date filter - formats Date object as localized date string.\r\n * \r\n * @param options - Array with locale string as first element (default: config.locale)\r\n * @returns Filter function that returns date string\r\n */\r\nconst date = (options?:string[]): FilterFn<string> => {\r\n const opt = options?.[0] ?? config.locale;\r\n return (value: unknown): string => {\r\n if (!(value instanceof Date)) {valueMustBeDate('date');}\r\n return value.toLocaleDateString(opt);\r\n }\r\n}\r\n\r\n/**\r\n * Time filter - formats Date object as localized time string.\r\n * \r\n * @param options - Array with locale string as first element (default: config.locale)\r\n * @returns Filter function that returns time string\r\n */\r\nconst time = (options?:string[]): FilterFn<string> => {\r\n const opt = options?.[0] ?? config.locale;\r\n return (value: unknown): string => {\r\n if (!(value instanceof Date)) {valueMustBeDate('time');}\r\n return value.toLocaleTimeString(opt);\r\n }\r\n}\r\n\r\n/**\r\n * DateTime filter - formats Date object as localized date and time string.\r\n * \r\n * @param options - Array with locale string as first element (default: config.locale)\r\n * @returns Filter function that returns datetime string\r\n */\r\nconst datetime = (options?:string[]): FilterFn<string> => {\r\n const opt = options?.[0] ?? config.locale;\r\n return (value: unknown): string => {\r\n if (!(value instanceof Date)) {valueMustBeDate('datetime');}\r\n return value.toLocaleString(opt);\r\n }\r\n}\r\n\r\n/**\r\n * Year-Month-Day filter - formats Date object as YYYY-MM-DD string.\r\n * \r\n * @param options - Array with separator string as first element (default: '-')\r\n * @returns Filter function that returns formatted date string\r\n */\r\nconst ymd = (options?:string[]): FilterFn<string> => {\r\n const opt = options?.[0] ?? '-';\r\n return (value: unknown): string => {\r\n if (!(value instanceof Date)) {valueMustBeDate('ymd');}\r\n const year = value.getFullYear().toString();\r\n const month = (value.getMonth() + 1).toString().padStart(2, '0');\r\n const day = value.getDate().toString().padStart(2, '0');\r\n return `${year}${opt}${month}${opt}${day}`;\r\n }\r\n}\r\n\r\n/**\r\n * Falsy filter - checks if value is falsy.\r\n * \r\n * @param options - Unused\r\n * @returns Filter function that returns true for false/null/undefined/0/''/NaN\r\n */\r\nconst falsy = (_options?:string[]): FilterFn<boolean> => {\r\n return (value: unknown): boolean => value === false || value === null || value === undefined || value === 0 || value === '' || Number.isNaN(value);\r\n}\r\n\r\n/**\r\n * Truthy filter - checks if value is truthy.\r\n * \r\n * @param options - Unused\r\n * @returns Filter function that returns true for non-falsy values\r\n */\r\nconst truthy = (_options?:string[]): FilterFn<boolean> => {\r\n return (value: unknown): boolean =>value !== false && value !== null && value !== undefined && value !== 0 && value !== '' && !Number.isNaN(value);\r\n}\r\n\r\n/**\r\n * Default filter - returns default value if input is falsy.\r\n * \r\n * @param options - Array with default value as first element\r\n * @returns Filter function that returns value or default\r\n */\r\nconst defaults = (options?:string[]): FilterFn<unknown> => {\r\n const opt = options?.[0] ?? optionsRequired('defaults');\r\n return (value: unknown): unknown => {\r\n if (value === false || value === null || value === undefined || value === 0 || value === '' || Number.isNaN(value)) {return opt;}\r\n return value;\r\n }\r\n}\r\n\r\n/**\r\n * Boolean filter - converts value to boolean.\r\n * \r\n * @param options - Unused\r\n * @returns Filter function that returns boolean\r\n */\r\nconst boolean = (_options?:string[]): FilterFn<boolean> => {\r\n return (value: unknown): boolean => {\r\n return Boolean(value);\r\n }\r\n}\r\n\r\n/**\r\n * Number filter - converts value to number.\r\n * \r\n * @param options - Unused\r\n * @returns Filter function that returns number\r\n */\r\nconst number = (_options?:string[]): FilterFn<number> => {\r\n return (value: unknown): number => {\r\n return Number(value);\r\n }\r\n}\r\n\r\n/**\r\n * String filter - converts value to string.\r\n * \r\n * @param options - Unused\r\n * @returns Filter function that returns string\r\n */\r\nconst string = (_options?:string[]): FilterFn<string> => {\r\n return (value: unknown): string => {\r\n return String(value);\r\n }\r\n}\r\n\r\n/**\r\n * Null filter - converts empty string to null.\r\n * \r\n * @param options - Unused\r\n * @returns Filter function that returns null for empty string, otherwise original value\r\n */\r\nconst _null = (_options?:string[]): FilterFn<unknown> => {\r\n return (value: unknown): unknown => {\r\n return (value === \"\") ? null : value;\r\n } \r\n}\r\n\r\nconst builtinFilters: FilterWithOptions = {\r\n \"eq\": eq,\r\n \"ne\": ne,\r\n \"not\": not,\r\n\r\n \"lt\": lt,\r\n \"le\": le,\r\n \"gt\": gt,\r\n \"ge\": ge,\r\n\r\n \"inc\": inc,\r\n \"dec\": dec,\r\n \"mul\": mul,\r\n \"div\": div,\r\n \"mod\": mod,\r\n\r\n \"fix\": fix,\r\n \"locale\": locale,\r\n \"uc\": uc,\r\n \"lc\": lc,\r\n \"cap\": cap,\r\n \"trim\": trim,\r\n \"slice\": slice,\r\n \"substr\": substr,\r\n \"pad\": pad,\r\n \"rep\": rep,\r\n \"rev\": rev,\r\n\r\n \"int\": int,\r\n \"float\": float,\r\n \"round\": round,\r\n \"floor\": floor,\r\n \"ceil\": ceil,\r\n \"percent\": percent,\r\n\r\n \"date\": date,\r\n \"time\": time,\r\n \"datetime\": datetime,\r\n \"ymd\": ymd,\r\n\r\n \"falsy\": falsy,\r\n \"truthy\": truthy,\r\n \"defaults\": defaults,\r\n\r\n \"boolean\": boolean,\r\n \"number\": number,\r\n \"string\": string,\r\n \"null\": _null,\r\n};\r\n\r\nexport const outputBuiltinFilters = builtinFilters;\r\nexport const inputBuiltinFilters = builtinFilters;\r\n\r\nexport const builtinFiltersByFilterIOType = {\r\n \"input\": inputBuiltinFilters,\r\n \"output\": outputBuiltinFilters,\r\n} as const;\r\n\r\n/**\r\n * Retrieves built-in filter function by name and options.\r\n * \r\n * @param name - Filter name\r\n * @param options - Array of option strings\r\n * @returns Function that takes FilterWithOptions and returns filter function\r\n */\r\nexport const builtinFilterFn = (name:string, options: string[]) => (filters: FilterWithOptions) => {\r\n const filter = filters[name];\r\n if (!filter) {\r\n raiseError(`filter not found: ${name}`);\r\n }\r\n return filter(options);\r\n}\r\n\r\n","import { builtinFilterFn, builtinFiltersByFilterIOType } from \"../filters/builtinFilters\";\r\nimport { FilterFn, FilterIOType } from \"../filters/types\";\r\nimport { raiseError } from \"../raiseError\";\r\nimport { IFilterInfo } from \"../types\";\r\nimport { parseFilterArgs } from \"./parseFilterArgs\";\r\n\r\nconst filterFnByKey: Map<string, FilterFn<unknown>> = new Map();\r\n\r\n// format: filterName(arg1,arg2) or filterName\r\n\r\nexport function parseFilters(filterTextList: string[], filterIOType: FilterIOType): IFilterInfo[] {\r\n const builtinFilters = builtinFiltersByFilterIOType[filterIOType];\r\n const filters: IFilterInfo[] = filterTextList.map((filterText) => {\r\n const openParenIndex = filterText.indexOf('(');\r\n const closeParenIndex = filterText.lastIndexOf(')');\r\n // check parentheses\r\n if (openParenIndex !== -1 && closeParenIndex === -1) {\r\n raiseError(`Invalid filter format: missing closing parenthesis in \"${filterText}\"`);\r\n }\r\n if (closeParenIndex !== -1 && openParenIndex === -1) {\r\n raiseError(`Invalid filter format: missing opening parenthesis in \"${filterText}\"`);\r\n }\r\n if (openParenIndex === -1) {\r\n // no arguments\r\n const filterName = filterText.trim();\r\n const filterKey = `${filterName}():${filterIOType}`;\r\n let filterFn = filterFnByKey.get(filterKey);\r\n if (typeof filterFn === 'undefined') {\r\n filterFn = builtinFilterFn(filterName, [])(builtinFilters);\r\n filterFnByKey.set(filterKey, filterFn);\r\n }\r\n return {\r\n filterName: filterName,\r\n args: [],\r\n filterFn: filterFn,\r\n };\r\n } else {\r\n const argsText = filterText.substring(openParenIndex + 1, closeParenIndex);\r\n const filterName = filterText.substring(0, openParenIndex).trim();\r\n const args = parseFilterArgs(argsText);\r\n const filterKey = `${filterName}(${args.join(',')}):${filterIOType}`;\r\n let filterFn = filterFnByKey.get(filterKey);\r\n if (typeof filterFn === 'undefined') {\r\n filterFn = builtinFilterFn(filterName, args)(builtinFilters);\r\n filterFnByKey.set(filterKey, filterFn);\r\n }\r\n return {\r\n filterName,\r\n args,\r\n filterFn,\r\n };\r\n }\r\n });\r\n return filters;\r\n}","export function parseFilterArgs(argsText: string): string[] {\n const args: string[] = [];\n let current = '';\n let inQuote: string | null = null;\n let hasQuote = false;\n\n for (let i = 0; i < argsText.length; i++) {\n const char = argsText[i];\n\n if (inQuote) {\n if (char === inQuote) {\n inQuote = null;\n } else {\n current += char;\n }\n } else if (char === '\"' || char === \"'\") {\n inQuote = char;\n hasQuote = true;\n } else if (char === ',') {\n args.push(current.trim());\n current = '';\n hasQuote = false;\n } else {\n current += char;\n }\n }\n\n const last = current.trim();\n if (last || hasQuote) {\n args.push(last);\n }\n\n return args;\n}\n","\r\nexport const trimFn = (s: string): string => s.trim();\r\n","import { IBindingInfo, IFilterInfo } from \"../types\";\r\nimport { parseFilters } from \"./parseFilters\";\r\nimport { trimFn } from \"./utils\";\r\n\r\ntype PropPartParseResult = Pick<IBindingInfo, 'propName' | 'propSegments' | 'propModifiers' | 'inFilters'>;\r\n\r\nconst cacheFilterInfos = new Map<string, IFilterInfo[]>();\r\n\r\n// format: propName#moodifier1,modifier2\r\n// propName-format: path.to.property (e.g., textContent, style.color, not include :)\r\n// special path: \r\n// 'attr.attributeName' for attributes (e.g., attr.href, attr.data-id)\r\n// 'style.propertyName' for style properties (e.g., style.backgroundColor, style.fontSize)\r\n// 'class.className' for class names (e.g., class.active, class.hidden)\r\n// 'onclick', 'onchange' etc. for event listeners\r\n\r\nexport function parsePropPart(propPart: string): PropPartParseResult {\r\n const pos = propPart.indexOf('|');\r\n let propText: string = '';\r\n let filterTexts: string[] = [];\r\n let filtersText = '';\r\n let filters: IFilterInfo[] = [];\r\n if (pos !== -1) {\r\n propText = propPart.slice(0, pos).trim();\r\n filtersText = propPart.slice(pos + 1).trim();\r\n if (cacheFilterInfos.has(filtersText)) {\r\n filters = cacheFilterInfos.get(filtersText)!;\r\n } else {\r\n filterTexts = filtersText.split('|').map(trimFn);\r\n filters = parseFilters(filterTexts, \"input\");\r\n cacheFilterInfos.set(filtersText, filters);\r\n }\r\n } else {\r\n propText = propPart.trim();\r\n }\r\n\r\n const [propName, propModifiersText] = propText.split('#').map(trimFn);\r\n const propSegments = propName.split('.').map(trimFn);\r\n const propModifiers = propModifiersText\r\n ? propModifiersText.split(',').map(trimFn)\r\n : [];\r\n return {\r\n propName,\r\n propSegments,\r\n propModifiers,\r\n inFilters: filters,\r\n };\r\n}","import { getPathInfo } from \"../address/PathInfo\";\r\nimport { IBindingInfo, IFilterInfo } from \"../types\";\r\nimport { parseFilters } from \"./parseFilters\";\r\nimport { trimFn } from \"./utils\";\r\n\r\ntype StatePartParseResult = Pick<IBindingInfo, \r\n 'stateName' | 'statePathName' | 'statePathInfo' | 'outFilters'>;\r\n\r\nconst cacheFilterInfos = new Map<string, IFilterInfo[]>();\r\n\r\n// format: statePath@stateName|filter|filter\r\n// statePath-format: path.to.property (e.g., user.name.first, users.*.name, users.0.name, not include @)\r\n// stateName: optional, default is 'default'\r\n// filters-format: filterName or filterName(arg1,arg2)\r\nexport function parseStatePart(statePart: string): StatePartParseResult {\r\n const pos = statePart.indexOf('|');\r\n let stateAndPath: string = '';\r\n let filterTexts: string[] = [];\r\n let filtersText = '';\r\n let filters: IFilterInfo[] = [];\r\n if (pos !== -1) {\r\n stateAndPath = statePart.slice(0, pos).trim();\r\n filtersText = statePart.slice(pos + 1).trim();\r\n if (cacheFilterInfos.has(filtersText)) {\r\n filters = cacheFilterInfos.get(filtersText)!;\r\n } else {\r\n filterTexts = filtersText.split('|').map(trimFn);\r\n filters = parseFilters(filterTexts, \"output\");\r\n cacheFilterInfos.set(filtersText, filters);\r\n }\r\n } else {\r\n stateAndPath = statePart.trim();\r\n }\r\n const [statePathName, stateName = 'default'] = stateAndPath.split('@').map(trimFn);\r\n const pathInfo = getPathInfo(statePathName);\r\n return {\r\n stateName,\r\n statePathName,\r\n statePathInfo: pathInfo,\r\n outFilters: filters,\r\n };\r\n}\r\n","import { getPathInfo } from \"../address/PathInfo.js\";\r\nimport { raiseError } from \"../raiseError.js\";\r\nimport { STRUCTURAL_BINDING_TYPE_SET } from \"../structural/define.js\";\r\nimport { parsePropPart } from \"./parsePropPart.js\";\r\nimport { parseStatePart } from \"./parseStatePart.js\";\r\nimport { ParseBindTextResult } from \"./types.js\";\r\nimport { trimFn } from \"./utils.js\";\r\n\r\n// format: propPart:statePart; propPart:statePart; ...\r\n// special-propPart:\r\n// if: statePart (single binding for conditional rendering)\r\n// else: (single binding for conditional rendering, and statePart is ignored)\r\n// elseif: statePart only (single binding for conditional rendering)\r\n// for: statePart only (single binding for loop rendering)\r\n// onclick: statePart, onchange: statePart etc. (event listeners)\r\n\r\nexport function parseBindTextsForElement(bindText: string): ParseBindTextResult[] {\r\n const [ ...bindTexts ] = bindText.split(';').map(trimFn).filter(s => s.length > 0);\r\n const results = bindTexts.map((bindText): ParseBindTextResult => {\r\n const separatorIndex = bindText.indexOf(':');\r\n if (separatorIndex === -1) {\r\n raiseError(`Invalid bindText: \"${bindText}\". Missing ':' separator between propPart and statePart.`);\r\n }\r\n const propPart = bindText.slice(0, separatorIndex).trim();\r\n const statePart = bindText.slice(separatorIndex + 1).trim();\r\n if (propPart === 'else') {\r\n const pathInfo = getPathInfo('#else');\r\n return {\r\n propName: 'else',\r\n propSegments: ['else'],\r\n propModifiers: [],\r\n statePathName: '#else',\r\n statePathInfo: pathInfo,\r\n stateName: '',\r\n inFilters: [],\r\n outFilters: [],\r\n bindingType: 'else',\r\n };\r\n } else if (propPart === 'if' \r\n || propPart === 'elseif' \r\n || propPart === 'for'\r\n || propPart === 'radio'\r\n || propPart === 'checkbox'\r\n ) {\r\n const stateResult = parseStatePart(statePart);\r\n return {\r\n propName: propPart,\r\n propSegments: [propPart],\r\n propModifiers: [],\r\n inFilters: [],\r\n ...stateResult,\r\n bindingType: propPart,\r\n };\r\n } else {\r\n const stateResult = parseStatePart(statePart);\r\n const propResult = parsePropPart(propPart);\r\n if (propResult.propSegments[0].startsWith('on')) {\r\n return {\r\n ...propResult,\r\n ...stateResult,\r\n bindingType: 'event',\r\n };\r\n } else {\r\n return {\r\n ...propResult,\r\n ...stateResult,\r\n bindingType: 'prop',\r\n };\r\n }\r\n }\r\n });\r\n // check for sigle binding for 'if', 'elseif', 'else', 'for'\r\n if (results.length > 1) {\r\n const isIncludeSingleBinding = results.some(r => STRUCTURAL_BINDING_TYPE_SET.has(r.bindingType));\r\n if (isIncludeSingleBinding) {\r\n raiseError(`Invalid bindText: \"${bindText}\". 'if', 'elseif', 'else', and 'for' bindings must be single binding.`);\r\n }\r\n }\r\n return results;\r\n}\r\n\r\n","import { config } from \"../config\";\r\n\r\nconst bindTextByNode = new WeakMap<Node, string>();\r\n\r\n// format: <!--@@wcs-text:path-->\r\n// bind-stateはconfig.commentTextPrefixで変更可能\r\n// format: <!--@@wcs-for:UUID-->\r\n// bind-stateはconfig.commentForPrefixで変更可能\r\n// format: <!--@@wcs-if:UUID-->\r\n// bind-stateはconfig.commentIfPrefixで変更可能\r\n// format: <!--@@wcs-else:UUID-->\r\n// bind-stateはconfig.commentElsePrefixで変更可能\r\n// format: <!--@@wcs-elseif:UUID-->\r\n// bind-stateはconfig.commentElseIfPrefixで変更可能\r\nconst bindingTypeKeywordSet: Set<string> = new Set<string>([\r\n config.commentTextPrefix,\r\n config.commentForPrefix,\r\n config.commentIfPrefix,\r\n config.commentElseIfPrefix,\r\n config.commentElsePrefix,\r\n]);\r\n\r\n// format: <!--@@:path-->は<!--@@wcs-text:path-->と同義にする\r\nconst EMBEDDED_REGEX = new RegExp(`^\\\\s*@@\\\\s*(.*?)\\\\s*:\\\\s*(.+?)\\\\s*$`);\r\n\r\nexport function parseCommentNode(node: Node): string | null {\r\n const savedText = bindTextByNode.get(node);\r\n if (typeof savedText === \"string\") {\r\n return savedText;\r\n }\r\n if (node.nodeType !== Node.COMMENT_NODE) {\r\n return null;\r\n }\r\n const commentNode = node as Comment;\r\n const text = commentNode.data.trim();\r\n const match = EMBEDDED_REGEX.exec(text);\r\n if (match === null) {\r\n return null;\r\n }\r\n // 空の場合は wcs-text として扱う\r\n const keyword = match[1] || config.commentTextPrefix;\r\n if (!bindingTypeKeywordSet.has(keyword)) {\r\n return null;\r\n }\r\n bindTextByNode.set(node, match[2]);\r\n return match[2];\r\n}\r\n\r\nexport function getCommentNodeBindText(node: Node): string | null {\r\n return bindTextByNode.get(node) || null;\r\n}","import { config } from \"../config\";\r\nimport { raiseError } from \"../raiseError\";\r\nimport { parseBindTextsForElement } from \"../bindTextParser/parseBindTextsForElement\";\r\nimport { parseCommentNode } from \"./parseCommentNode\";\r\nimport { parseBindTextForEmbeddedNode } from \"../bindTextParser/parseBindTextForEmbeddedNode\";\r\nimport { ParseBindTextResult } from \"../bindTextParser/types\";\r\nimport { getFragmentInfoByUUID } from \"../structural/fragmentInfoByUUID\";\r\n\r\nexport function getParseBindTextResults(node: Node): ParseBindTextResult[] {\r\n if (node.nodeType === Node.ELEMENT_NODE) {\r\n const element = node as Element;\r\n const bindText = element.getAttribute(config.bindAttributeName) || '';\r\n return parseBindTextsForElement(bindText);\r\n } else if (node.nodeType === Node.COMMENT_NODE) {\r\n const bindTextOrUUID = parseCommentNode(node);\r\n if (bindTextOrUUID === null) {\r\n raiseError(`Comment node binding text not found.`);\r\n }\r\n const fragmentInfo = getFragmentInfoByUUID(bindTextOrUUID);\r\n let parseBindingTextResult = fragmentInfo?.parseBindTextResult ?? null;\r\n let uuid: string | null = null;\r\n if (parseBindingTextResult === null) {\r\n // It is not a structural fragment UUID, so treat it as bindText\r\n parseBindingTextResult = parseBindTextForEmbeddedNode(bindTextOrUUID);\r\n uuid = null;\r\n } else {\r\n uuid = bindTextOrUUID;\r\n }\r\n return [{\r\n ...parseBindingTextResult,\r\n uuid: uuid,\r\n }]\r\n }\r\n return [];\r\n}","import { parseStatePart } from \"./parseStatePart.js\";\r\nimport { ParseBindTextResult } from \"./types.js\";\r\n\r\nexport function parseBindTextForEmbeddedNode(bindText: string): ParseBindTextResult {\r\n const stateResult = parseStatePart(bindText);\r\n return {\r\n propName: 'textContent',\r\n propSegments: ['textContent'],\r\n propModifiers: [],\r\n inFilters: [],\r\n ...stateResult,\r\n bindingType: 'text',\r\n }\r\n}","import { config } from \"../config\";\r\nimport { parseCommentNode } from \"./parseCommentNode\";\r\n\r\n/**\r\n * data-wcs 属性または埋め込みノード<!--{{}}-->を持つノードをすべて取得する\r\n * @param root \r\n * @returns \r\n */\r\n\r\nexport function getSubscriberNodes(root: Document | Element | DocumentFragment): Node[] {\r\n const subscriberNodes: Node[] = [];\r\n const walker = document.createTreeWalker(\r\n root, \r\n NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT, \r\n {\r\n acceptNode(node: Node) {\r\n if (node.nodeType === Node.ELEMENT_NODE) {\r\n const element = node as Element;\r\n const hasBinding = element.hasAttribute(config.bindAttributeName);\r\n return hasBinding\r\n ? NodeFilter.FILTER_ACCEPT\r\n : NodeFilter.FILTER_SKIP;\r\n } else {\r\n // Comment node\r\n return parseCommentNode(node) !== null\r\n ? NodeFilter.FILTER_ACCEPT \r\n : NodeFilter.FILTER_SKIP;\r\n }\r\n }\r\n }\r\n );\r\n \r\n while (walker.nextNode()) {\r\n subscriberNodes.push(walker.currentNode);\r\n }\r\n return subscriberNodes;\r\n}","import { raiseError } from \"../raiseError\";\r\nimport { resolveNodePath } from \"../structural/resolveNodePath\";\r\nimport { IFragmentNodeInfo } from \"../structural/types\";\r\nimport { IBindingInfo } from \"../types\";\r\nimport { getBindingInfos } from \"./getBindingInfos\";\r\nimport { setBindingsByNode } from \"./getBindingsByNode\";\r\nimport { getParseBindTextResults } from \"./getParseBindTextResults\";\r\nimport { getSubscriberNodes } from \"./getSubscriberNodes\";\r\nimport { resolveInitializedBinding } from \"./initializeBindingPromiseByNode\";\r\n\r\nconst registeredNodeSet = new WeakSet<Node>();\r\n\r\nexport function collectNodesAndBindingInfos(\r\n root: Document | Element | DocumentFragment\r\n): [ Node[], IBindingInfo[] ] {\r\n const subscriberNodes = getSubscriberNodes(root);\r\n const allBindings: IBindingInfo[] = [];\r\n for(const node of subscriberNodes) {\r\n if (!registeredNodeSet.has(node)) {\r\n registeredNodeSet.add(node);\r\n const parseBindingTextResults = getParseBindTextResults(node);\r\n const bindings = getBindingInfos(node, parseBindingTextResults);\r\n setBindingsByNode(node, bindings);\r\n resolveInitializedBinding(node);\r\n allBindings.push(...bindings);\r\n }\r\n }\r\n return [subscriberNodes, allBindings];\r\n}\r\n\r\nexport function collectNodesAndBindingInfosByFragment(\r\n root: DocumentFragment,\r\n nodeInfos: IFragmentNodeInfo[],\r\n): [ Node[], IBindingInfo[] ] {\r\n const nodes: Node[] = [];\r\n const allBindings: IBindingInfo[] = [];\r\n for(const nodeInfo of nodeInfos) {\r\n const node = resolveNodePath(root, nodeInfo.nodePath);\r\n if (node === null) {\r\n raiseError(`Node not found by path [${nodeInfo.nodePath.join(', ')}] in fragment.`);\r\n }\r\n if (!registeredNodeSet.has(node)) {\r\n registeredNodeSet.add(node);\r\n const bindings = getBindingInfos(node, nodeInfo.parseBindTextResults);\r\n setBindingsByNode(node, bindings);\r\n resolveInitializedBinding(node);\r\n allBindings.push(...bindings);\r\n nodes.push(node);\r\n }\r\n }\r\n return [nodes, allBindings];\r\n}\r\n\r\nexport function unregisterNode(node: Node): void {\r\n registeredNodeSet.delete(node);\r\n}","import { ILoopContext } from \"./types\";\r\n\r\nconst loopContextByNode = new WeakMap<Node, ILoopContext>();\r\n\r\nexport function getLoopContextByNode(node: Node): ILoopContext | null {\r\n let paramNode: Node | null = node;\r\n while (paramNode) {\r\n const loopContext = loopContextByNode.get(paramNode);\r\n if (loopContext) {\r\n return loopContext;\r\n }\r\n paramNode = paramNode.parentNode;\r\n }\r\n return null;\r\n}\r\n\r\nexport function setLoopContextByNode(node: Node, loopContext: ILoopContext | null): void {\r\n if (loopContext === null) {\r\n loopContextByNode.delete(node);\r\n return;\r\n }\r\n loopContextByNode.set(node, loopContext);\r\n}\r\n","\r\nexport const setLoopContextAsyncSymbol: unique symbol = Symbol(\"$$setLoopContextAsync\");\r\nexport const setLoopContextSymbol: unique symbol = Symbol(\"$$setLoopContext\");\r\nexport const getByAddressSymbol: unique symbol = Symbol(\"$$getByAddress\");\r\nexport const setByAddressSymbol: unique symbol = Symbol(\"$$setByAddress\");\r\nexport const connectedCallbackSymbol: unique symbol = Symbol(\"$$connectedCallback\");\r\nexport const disconnectedCallbackSymbol: unique symbol = Symbol(\"$$disconnectedCallback\");\r\nexport const updatedCallbackSymbol: unique symbol = Symbol(\"$$updatedCallback\");\r\n","import { getLoopContextByNode } from \"../list/loopContextByNode\";\r\nimport { setLoopContextSymbol } from \"../proxy/symbols\";\r\nimport { raiseError } from \"../raiseError\";\r\nimport { getStateElementByName } from \"../stateElementByName\";\r\nimport { IBindingInfo } from \"../types\";\r\n\r\nconst handlerByHandlerKey: Map<string, (event: Event) => any> = new Map();\r\nconst bindingSetByHandlerKey: Map<string, Set<IBindingInfo>> = new Map();\r\n\r\nfunction getHandlerKey(binding: IBindingInfo): string {\r\n const modifierKey = binding.propModifiers.filter(m => m === 'prevent' || m === 'stop').sort().join(',');\r\n return `${binding.stateName}::${binding.statePathName}::${modifierKey}`;\r\n}\r\n\r\nconst stateEventHandlerFunction = (\r\n stateName: string,\r\n handlerName: string,\r\n modifiers: string[]\r\n) => (event: Event): any => {\r\n if (modifiers.includes('prevent')) event.preventDefault();\r\n if (modifiers.includes('stop')) event.stopPropagation();\r\n\r\n const node = event.target as Element;\r\n const rootNode = node.getRootNode() as Node;\r\n const stateElement = getStateElementByName(rootNode, stateName);\r\n if (stateElement === null) {\r\n raiseError(`State element with name \"${stateName}\" not found for event handler.`);\r\n }\r\n\r\n const loopContext = getLoopContextByNode(node);\r\n stateElement.createStateAsync(\"writable\", async (state) => {\r\n state[setLoopContextSymbol](loopContext, () => {\r\n const handler = state[handlerName];\r\n if (typeof handler !== \"function\") {\r\n raiseError(`Handler \"${handlerName}\" is not a function on state \"${stateName}\".`);\r\n }\r\n return Reflect.apply(handler, state, [event, ...(loopContext?.listIndex.indexes ?? [])]);\r\n });\r\n });\r\n}\r\n\r\nexport function attachEventHandler(binding: IBindingInfo): boolean {\r\n if (!binding.propName.startsWith(\"on\")) {\r\n return false;\r\n }\r\n const key = getHandlerKey(binding);\r\n let stateEventHandler = handlerByHandlerKey.get(key);\r\n if (typeof stateEventHandler === \"undefined\") {\r\n stateEventHandler = stateEventHandlerFunction(binding.stateName, binding.statePathName, binding.propModifiers);\r\n handlerByHandlerKey.set(key, stateEventHandler);\r\n }\r\n\r\n const eventName = binding.propName.slice(2);\r\n (binding.node as Element).addEventListener(eventName, stateEventHandler);\r\n\r\n let bindingSet = bindingSetByHandlerKey.get(key);\r\n if (typeof bindingSet === \"undefined\") {\r\n bindingSet = new Set<IBindingInfo>([binding]);\r\n bindingSetByHandlerKey.set(key, bindingSet);\r\n } else {\r\n bindingSet.add(binding);\r\n }\r\n return true;\r\n}\r\n\r\nexport function detachEventHandler(binding: IBindingInfo): boolean {\r\n if (!binding.propName.startsWith(\"on\")) {\r\n return false;\r\n }\r\n const key = getHandlerKey(binding);\r\n const stateEventHandler = handlerByHandlerKey.get(key);\r\n if (typeof stateEventHandler === \"undefined\") {\r\n return false;\r\n }\r\n const eventName = binding.propName.slice(2);\r\n (binding.node as Element).removeEventListener(eventName, stateEventHandler);\r\n\r\n const bindingSet = bindingSetByHandlerKey.get(key);\r\n if (typeof bindingSet === \"undefined\") {\r\n return false;\r\n }\r\n bindingSet.delete(binding);\r\n if (bindingSet.size === 0) {\r\n handlerByHandlerKey.delete(key);\r\n bindingSetByHandlerKey.delete(key);\r\n }\r\n return true;\r\n}\r\n\r\nexport const __private__ = {\r\n handlerByHandlerKey,\r\n bindingSetByHandlerKey,\r\n};\r\n\r\n","\r\nconst cache = new WeakMap<Node, string | null>();\r\n\r\nexport function getCustomElement(node: Node): string | null {\r\n const cached = cache.get(node);\r\n if (cached !== undefined) {\r\n return cached;\r\n }\r\n let value: string | null = null;\r\n try {\r\n if (node.nodeType !== Node.ELEMENT_NODE) {\r\n return value;\r\n }\r\n const element = node as Element;\r\n const tagName = element.tagName.toLowerCase();\r\n if (tagName.includes(\"-\")) {\r\n return value = tagName;\r\n }\r\n if (element.hasAttribute(\"is\")) {\r\n const is = element.getAttribute(\"is\")!;\r\n if (is.includes(\"-\")) {\r\n return value = is;\r\n }\r\n }\r\n return value;\r\n } finally {\r\n cache.set(node, value);\r\n }\r\n}\r\n","import { getCustomElement } from \"../getCustomElement\";\r\nimport { raiseError } from \"../raiseError\";\r\nimport { IWcBindable } from \"./types\";\r\n\r\nconst CHECK_TYPES = new Set([ 'radio', 'checkbox' ]);\r\nconst DEFAULT_VALUE_PROP_NAMES = new Set([ 'value', 'valueAsNumber', 'valueAsDate' ]);\r\n\r\nexport function isPossibleTwoWay(node: Node, propName: string): boolean {\r\n if (node.nodeType !== Node.ELEMENT_NODE) {\r\n return false;\r\n }\r\n const element = node as Element;\r\n const tagName = element.tagName.toLowerCase();\r\n if (tagName === 'input') {\r\n const inputType = (element.getAttribute('type') || 'text').toLowerCase();\r\n if (inputType === 'button') {\r\n return false;\r\n }\r\n if (CHECK_TYPES.has(inputType) && propName === 'checked') {\r\n return true;\r\n }\r\n if (DEFAULT_VALUE_PROP_NAMES.has(propName)) {\r\n return true;\r\n }\r\n }\r\n if (tagName === 'select' && propName === 'value') {\r\n return true;\r\n }\r\n if (tagName === 'textarea' && propName === 'value') {\r\n return true;\r\n }\r\n const customTagName = getCustomElement(element);\r\n if (customTagName !== null) {\r\n const customClass = customElements.get(customTagName) as any;\r\n if (typeof customClass === \"undefined\") {\r\n raiseError(`Custom element <${customTagName}> is not defined. Cannot determine if property \"${propName}\" is suitable for two-way binding.`);\r\n }\r\n const bindable: IWcBindable | undefined = customClass.wcBindable;\r\n if (bindable?.protocol === \"wc-bindable\" && bindable?.version === 1) {\r\n if (bindable.properties.some(p => p.name === propName)) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n}","import { isPossibleTwoWay } from \"./isPossibleTwoWay\";\r\nimport { getLoopContextByNode } from \"../list/loopContextByNode\";\r\nimport { raiseError } from \"../raiseError\";\r\nimport { getStateElementByName } from \"../stateElementByName\";\r\nimport { IBindingInfo, IFilterInfo } from \"../types\";\r\nimport { setLoopContextSymbol } from \"../proxy/symbols\";\r\nimport { getCustomElement } from \"../getCustomElement\";\r\nimport { IWcBindable } from \"./types\";\r\n\r\nconst handlerByHandlerKey: Map<string, (event: Event) => any> = new Map();\r\nconst bindingSetByHandlerKey: Map<string, Set<IBindingInfo>> = new Map();\r\n\r\nconst DEFAULT_GETTER = (e: Event) => (e as CustomEvent).detail;\r\n\r\nfunction getHandlerKey(binding: IBindingInfo, eventName: string, hasGetter: boolean): string {\r\n const filterKey = binding.inFilters.map(f => f.filterName + '(' + f.args.join(',') + ')').join('|');\r\n return `${binding.stateName}::${binding.propName}::${binding.statePathName}::${eventName}::${filterKey}::${hasGetter ? 'g' : 'n'}`;\r\n}\r\n\r\nfunction getEventName(binding: IBindingInfo): string {\r\n const tagName = (binding.node as Element).tagName.toLowerCase();\r\n // 1.default event name\r\n let eventName = (tagName === 'select') ? 'change' : 'input';\r\n // 2.wcBindable protocol\r\n const customTagName = getCustomElement(binding.node as Element);\r\n if (customTagName !== null) {\r\n const customClass = customElements.get(customTagName) as any;\r\n if (typeof customClass === \"undefined\") {\r\n raiseError(`Custom element <${customTagName}> is not defined. Cannot determine event name for two-way binding.`);\r\n }\r\n const bindable: IWcBindable | undefined = customClass.wcBindable;\r\n if (bindable?.protocol === \"wc-bindable\" && bindable?.version === 1) {\r\n const propDesc = bindable.properties.find(p => p.name === binding.propName);\r\n if (propDesc) {\r\n eventName = propDesc.event;\r\n }\r\n }\r\n }\r\n // 3.modifier\r\n for(const modifier of binding.propModifiers) {\r\n if (modifier.startsWith('on')) {\r\n eventName = modifier.slice(2);\r\n }\r\n }\r\n return eventName;\r\n}\r\n\r\nfunction getValueGetter(binding: IBindingInfo): ((event: Event) => any) | null {\r\n const customTagName = getCustomElement(binding.node as Element);\r\n if (customTagName !== null) {\r\n const customClass = customElements.get(customTagName) as any;\r\n if (customClass) {\r\n const bindable: IWcBindable | undefined = customClass.wcBindable;\r\n if (bindable?.protocol === \"wc-bindable\" && bindable?.version === 1) {\r\n const propDesc = bindable.properties.find(p => p.name === binding.propName);\r\n if (propDesc) {\r\n return propDesc.getter ?? DEFAULT_GETTER;\r\n }\r\n }\r\n }\r\n }\r\n return null;\r\n}\r\n\r\nconst twowayEventHandlerFunction = (\r\n stateName: string,\r\n propName: string,\r\n statePathName: string,\r\n inFilters: IFilterInfo[],\r\n valueGetter: ((event: Event) => any) | null,\r\n) => (event: Event): any => {\r\n const node = event.target as Element;\r\n if (node === null) {\r\n console.warn(`[@wcstack/state] event.target is null.`);\r\n return;\r\n }\r\n let newValue: any;\r\n if (valueGetter !== null) {\r\n newValue = valueGetter(event);\r\n } else {\r\n if (!(propName in node)) {\r\n console.warn(`[@wcstack/state] Property \"${propName}\" does not exist on target element.`);\r\n return;\r\n }\r\n newValue = (node as any)[propName];\r\n }\r\n let filteredNewValue = newValue;\r\n for(const filter of inFilters) {\r\n filteredNewValue = filter.filterFn(filteredNewValue);\r\n }\r\n\r\n const rootNode = node.getRootNode() as Node;\r\n const stateElement = getStateElementByName(rootNode, stateName);\r\n if (stateElement === null) {\r\n raiseError(`State element with name \"${stateName}\" not found for two-way binding.`);\r\n }\r\n\r\n const loopContext = getLoopContextByNode(node);\r\n stateElement.createState(\"writable\", (state) => {\r\n state[setLoopContextSymbol](loopContext, () => {\r\n state[statePathName] = filteredNewValue;\r\n });\r\n });\r\n}\r\n\r\nexport function attachTwowayEventHandler(binding: IBindingInfo): void {\r\n const customTagName = getCustomElement(binding.node as Element);\r\n if (customTagName !== null) {\r\n const customClass = customElements.get(customTagName);\r\n if (typeof customClass === \"undefined\") {\r\n customElements.whenDefined(customTagName).then(() => {\r\n attachTwowayEventHandler(binding);\r\n });\r\n return;\r\n }\r\n }\r\n\r\n if (isPossibleTwoWay(binding.node, binding.propName) && binding.propModifiers.indexOf('ro') === -1) {\r\n const eventName = getEventName(binding);\r\n const valueGetter = getValueGetter(binding);\r\n const key = getHandlerKey(binding, eventName, valueGetter !== null);\r\n let twowayEventHandler = handlerByHandlerKey.get(key);\r\n if (typeof twowayEventHandler === \"undefined\") {\r\n twowayEventHandler = twowayEventHandlerFunction(\r\n binding.stateName,\r\n binding.propName,\r\n binding.statePathName,\r\n binding.inFilters,\r\n valueGetter\r\n );\r\n handlerByHandlerKey.set(key, twowayEventHandler);\r\n }\r\n (binding.node as Element).addEventListener(eventName, twowayEventHandler);\r\n let bindingSet = bindingSetByHandlerKey.get(key);\r\n if (typeof bindingSet === \"undefined\") {\r\n bindingSet = new Set<IBindingInfo>([binding]);\r\n bindingSetByHandlerKey.set(key, bindingSet);\r\n } else {\r\n bindingSet.add(binding);\r\n }\r\n }\r\n}\r\n\r\nexport function detachTwowayEventHandler(binding: IBindingInfo): void {\r\n const customTagName = getCustomElement(binding.node as Element);\r\n if (customTagName !== null) {\r\n const customClass = customElements.get(customTagName);\r\n if (typeof customClass === \"undefined\") {\r\n customElements.whenDefined(customTagName).then(() => {\r\n detachTwowayEventHandler(binding);\r\n });\r\n return;\r\n }\r\n }\r\n\r\n if (isPossibleTwoWay(binding.node, binding.propName) && binding.propModifiers.indexOf('ro') === -1) {\r\n const eventName = getEventName(binding);\r\n const valueGetter = getValueGetter(binding);\r\n const key = getHandlerKey(binding, eventName, valueGetter !== null);\r\n const twowayEventHandler = handlerByHandlerKey.get(key);\r\n if (typeof twowayEventHandler === \"undefined\") {\r\n return;\r\n }\r\n (binding.node as Element).removeEventListener(eventName, twowayEventHandler);\r\n\r\n const bindingSet = bindingSetByHandlerKey.get(key);\r\n if (typeof bindingSet === \"undefined\") {\r\n return;\r\n }\r\n bindingSet.delete(binding);\r\n if (bindingSet.size === 0) {\r\n handlerByHandlerKey.delete(key);\r\n bindingSetByHandlerKey.delete(key);\r\n }\r\n }\r\n}\r\n\r\nexport const __private__ = {\r\n handlerByHandlerKey,\r\n bindingSetByHandlerKey,\r\n getHandlerKey,\r\n getEventName,\r\n getValueGetter,\r\n twowayEventHandlerFunction,\r\n DEFAULT_GETTER,\r\n};\r\n","import { IAbsoluteStateAddress } from \"../address/types\";\r\n\r\nconst lastListValueByAbsoluteStateAddress: WeakMap<IAbsoluteStateAddress, readonly unknown[]> = new WeakMap();\r\n\r\nexport function getLastListValueByAbsoluteStateAddress(address: IAbsoluteStateAddress): readonly unknown[] {\r\n return lastListValueByAbsoluteStateAddress.get(address) ?? [];\r\n}\r\n\r\nexport function setLastListValueByAbsoluteStateAddress(address: IAbsoluteStateAddress, value: readonly unknown[]): void {\r\n lastListValueByAbsoluteStateAddress.set(address, value);\r\n}\r\n\r\nexport function clearLastListValueByAbsoluteStateAddress(address: IAbsoluteStateAddress): void {\r\n lastListValueByAbsoluteStateAddress.delete(address);\r\n}\r\n\r\nexport function hasLastListValueByAbsoluteStateAddress(address: IAbsoluteStateAddress): boolean {\r\n return lastListValueByAbsoluteStateAddress.has(address);\r\n}\r\n","import { IStateElement } from \"../components/types\";\r\nimport { IAbsolutePathInfo, IPathInfo } from \"./types\";\r\n\r\nconst _cache: WeakMap<IStateElement, WeakMap<IPathInfo, IAbsolutePathInfo>> = new WeakMap();\r\n\r\nexport function getAbsolutePathInfo(stateElement: IStateElement, pathInfo: IPathInfo): IAbsolutePathInfo {\r\n if (_cache.has(stateElement)) {\r\n const pathMap = _cache.get(stateElement)!;\r\n if (pathMap.has(pathInfo)) {\r\n return pathMap.get(pathInfo)!;\r\n }\r\n } else {\r\n _cache.set(stateElement, new WeakMap());\r\n }\r\n const absolutePathInfo = Object.freeze(new AbsolutePathInfo(stateElement, pathInfo));\r\n _cache.get(stateElement)!.set(pathInfo, absolutePathInfo);\r\n return absolutePathInfo;\r\n}\r\n\r\nclass AbsolutePathInfo implements IAbsolutePathInfo {\r\n readonly pathInfo: IPathInfo;\r\n readonly stateName: string;\r\n readonly stateElement: IStateElement;\r\n readonly parentAbsolutePathInfo: IAbsolutePathInfo | null;\r\n constructor(stateElement: IStateElement, pathInfo: IPathInfo) {\r\n this.pathInfo = pathInfo;\r\n this.stateName = stateElement.name;\r\n this.stateElement = stateElement;\r\n if (pathInfo.parentPathInfo === null) {\r\n this.parentAbsolutePathInfo = null;\r\n } else {\r\n this.parentAbsolutePathInfo = getAbsolutePathInfo(stateElement, pathInfo.parentPathInfo);\r\n }\r\n }\r\n}","import { WILDCARD } from \"../define\";\r\nimport { IListIndex } from \"../list/types\";\r\nimport { IAbsolutePathInfo, IAbsoluteStateAddress } from \"./types\";\r\n\r\nconst _cache: WeakMap<IListIndex, WeakMap<IAbsolutePathInfo, IAbsoluteStateAddress>> = new WeakMap();\r\nconst _cacheNullListIndex: WeakMap<IAbsolutePathInfo, IAbsoluteStateAddress> = new WeakMap();\r\n\r\nclass AbsoluteStateAddress implements IAbsoluteStateAddress {\r\n readonly absolutePathInfo: IAbsolutePathInfo;\r\n readonly listIndex: IListIndex | null;\r\n private _parentAbsoluteAddress: IAbsoluteStateAddress | null | undefined;\r\n\r\n constructor(absolutePathInfo: IAbsolutePathInfo, listIndex: IListIndex | null) {\r\n this.absolutePathInfo = absolutePathInfo;\r\n this.listIndex = listIndex;\r\n }\r\n\r\n get parentAbsoluteAddress(): IAbsoluteStateAddress | null {\r\n if (typeof this._parentAbsoluteAddress !== 'undefined') {\r\n return this._parentAbsoluteAddress;\r\n }\r\n const parentAbsolutePathInfo = this.absolutePathInfo.parentAbsolutePathInfo;\r\n if (parentAbsolutePathInfo === null) {\r\n return null;\r\n }\r\n const lastSegment = this.absolutePathInfo.pathInfo.segments[this.absolutePathInfo.pathInfo.segments.length - 1];\r\n let parentListIndex: IListIndex | null = null;\r\n if (lastSegment === WILDCARD) {\r\n parentListIndex = this.listIndex?.parentListIndex ?? null;\r\n } else {\r\n parentListIndex = this.listIndex;\r\n }\r\n return this._parentAbsoluteAddress = createAbsoluteStateAddress(\r\n parentAbsolutePathInfo,\r\n parentListIndex\r\n );\r\n }\r\n}\r\n\r\nexport function createAbsoluteStateAddress(absolutePathInfo: IAbsolutePathInfo, listIndex: IListIndex | null): IAbsoluteStateAddress {\r\n if (listIndex === null) {\r\n let cached = _cacheNullListIndex.get(absolutePathInfo);\r\n if (typeof cached !== \"undefined\") {\r\n return cached;\r\n }\r\n cached = new AbsoluteStateAddress(absolutePathInfo, null);\r\n _cacheNullListIndex.set(absolutePathInfo, cached);\r\n return cached;\r\n } else {\r\n let cacheByAbsolutePathInfo = _cache.get(listIndex);\r\n if (typeof cacheByAbsolutePathInfo === \"undefined\") {\r\n cacheByAbsolutePathInfo = new WeakMap<IAbsolutePathInfo, IAbsoluteStateAddress>();\r\n _cache.set(listIndex, cacheByAbsolutePathInfo);\r\n }\r\n let cached = cacheByAbsolutePathInfo.get(absolutePathInfo);\r\n if (typeof cached !== \"undefined\") {\r\n return cached;\r\n }\r\n cached = new AbsoluteStateAddress(absolutePathInfo, listIndex);\r\n cacheByAbsolutePathInfo.set(absolutePathInfo, cached);\r\n return cached;\r\n }\r\n}\r\n","\r\nconst rootNodeByFragment: WeakMap<DocumentFragment, Node> = new WeakMap();\r\n\r\nexport function setRootNodeByFragment(fragment: DocumentFragment, rootNode: Node | null): void {\r\n if (rootNode === null) {\r\n rootNodeByFragment.delete(fragment);\r\n } else {\r\n rootNodeByFragment.set(fragment, rootNode);\r\n }\r\n}\r\n\r\nexport function getRootNodeByFragment(fragment: DocumentFragment): Node | null {\r\n return rootNodeByFragment.get(fragment) || null;\r\n}\r\n","import { IPathInfo } from \"./types.js\";\r\n\r\nconst cacheCalcWildcardLen: Map<string, number> = new Map(); \r\n\r\nexport function calcWildcardLen(pathInfo: IPathInfo, targetPathInfo: IPathInfo): number {\r\n let path1: IPathInfo;\r\n let path2: IPathInfo;\r\n if (pathInfo.wildcardCount === 0 || targetPathInfo.wildcardCount === 0) {\r\n return 0;\r\n }\r\n if (pathInfo.wildcardCount === 1 \r\n && targetPathInfo.wildcardCount > 0 \r\n && targetPathInfo.wildcardPathSet.has(pathInfo.path)) {\r\n return 1;\r\n }\r\n if (pathInfo.id < targetPathInfo.id) {\r\n path1 = pathInfo;\r\n path2 = targetPathInfo;\r\n } else {\r\n path1 = targetPathInfo;\r\n path2 = pathInfo;\r\n }\r\n const key = `${path1.path}\\t${path2.path}`;\r\n let len = cacheCalcWildcardLen.get(key);\r\n if (typeof len !== \"undefined\") {\r\n return len;\r\n }\r\n const matchPath = path1.wildcardPathSet.intersection(path2.wildcardPathSet);\r\n len = matchPath.size;\r\n cacheCalcWildcardLen.set(key, len);\r\n return len;\r\n}\r\n\r\n","import { calcWildcardLen } from \"../address/calcWildcardLen\";\r\nimport { IBindingInfo } from \"../types\";\r\nimport { getLoopContextByNode } from \"./loopContextByNode\";\r\nimport { IListIndex, ILoopContext } from \"./types\";\r\n\r\nconst listIndexByBindingInfoByLoopContext: WeakMap<ILoopContext, WeakMap<IBindingInfo, IListIndex | null>> = new WeakMap();\r\n\r\nexport function getListIndexByBindingInfo(bindingInfo: IBindingInfo): IListIndex | null {\r\n const loopContext = getLoopContextByNode(bindingInfo.node);\r\n if (loopContext === null) {\r\n return null;\r\n }\r\n let listIndexByBindingInfo = listIndexByBindingInfoByLoopContext.get(loopContext);\r\n if (typeof listIndexByBindingInfo === \"undefined\") {\r\n listIndexByBindingInfo = new WeakMap<IBindingInfo, IListIndex | null>();\r\n listIndexByBindingInfoByLoopContext.set(loopContext, listIndexByBindingInfo);\r\n } else {\r\n const listIndex = listIndexByBindingInfo.get(bindingInfo);\r\n if (typeof listIndex !== \"undefined\") {\r\n return listIndex;\r\n }\r\n }\r\n\r\n let listIndex: IListIndex | null = null;\r\n try {\r\n const wildcardLen = calcWildcardLen(loopContext.pathInfo, bindingInfo.statePathInfo);\r\n if (wildcardLen > 0) {\r\n listIndex = loopContext.listIndex.at(wildcardLen - 1);\r\n }\r\n return listIndex;\r\n } finally {\r\n listIndexByBindingInfo.set(bindingInfo, listIndex);\r\n }\r\n\r\n}\r\n","import { getAbsolutePathInfo } from \"../address/AbsolutePathInfo\";\r\nimport { createAbsoluteStateAddress } from \"../address/AbsoluteStateAddress\";\r\nimport { IAbsoluteStateAddress } from \"../address/types\";\r\nimport { getRootNodeByFragment } from \"../apply/rootNodeByFragment\";\r\nimport { getListIndexByBindingInfo } from \"../list/getListIndexByBindingInfo\";\r\nimport { raiseError } from \"../raiseError\";\r\nimport { getStateElementByName } from \"../stateElementByName\";\r\nimport { IBindingInfo } from \"./types\";\r\n\r\nconst absoluteStateAddressByBinding: WeakMap<IBindingInfo, IAbsoluteStateAddress> = new WeakMap();\r\n\r\nexport function getAbsoluteStateAddressByBinding(binding: IBindingInfo): IAbsoluteStateAddress {\r\n // 切断されていても、キャッシュされていれば絶対状態アドレスを返す。\r\n let absoluteStateAddress: IAbsoluteStateAddress | null = null;\r\n absoluteStateAddress = absoluteStateAddressByBinding.get(binding) || null;\r\n if (absoluteStateAddress !== null) {\r\n return absoluteStateAddress;\r\n }\r\n\r\n let rootNode: Node | null = binding.replaceNode.getRootNode() as Node;\r\n // binding.replaceNodeはisConnected=trueになっていることが前提、切断されている場合はraiseErrorを返す\r\n if (binding.replaceNode.isConnected === false) {\r\n // DocumentFragmentでバッファリングされている場合は、ルートノードをDocumentFragmentから実際のルートノードに切り替える\r\n const rootNodeByFragment = getRootNodeByFragment(rootNode as DocumentFragment);\r\n if (rootNodeByFragment === null) {\r\n raiseError(`Cannot get absolute state address for disconnected binding: ${binding.bindingType} ${binding.statePathName} on ${binding.node.nodeName}`);\r\n } else {\r\n rootNode = rootNodeByFragment;\r\n }\r\n }\r\n\r\n const listIndex = getListIndexByBindingInfo(binding);\r\n const stateElement = getStateElementByName(rootNode, binding.stateName);\r\n if (stateElement === null) {\r\n raiseError(`State element with name \"${binding.stateName}\" not found for binding.`);\r\n }\r\n const absolutePathInfo = getAbsolutePathInfo(stateElement, binding.statePathInfo);\r\n absoluteStateAddress = \r\n createAbsoluteStateAddress(absolutePathInfo, listIndex);\r\n absoluteStateAddressByBinding.set(binding, absoluteStateAddress);\r\n return absoluteStateAddress;\r\n}\r\n\r\nexport function clearAbsoluteStateAddressByBinding(binding: IBindingInfo) {\r\n absoluteStateAddressByBinding.delete(binding);\r\n}","import { IStateElement } from \"../components/types\";\r\n\r\nconst completeByStateElementByWebComponent = new WeakMap<Element, WeakMap<IStateElement, boolean>>();\r\n\r\nexport function markWebComponentAsComplete(webComponent: Element, stateElement: IStateElement): void {\r\n let completeByStateElement = completeByStateElementByWebComponent.get(webComponent);\r\n if (!completeByStateElement) {\r\n completeByStateElement = new WeakMap<IStateElement, boolean>();\r\n completeByStateElementByWebComponent.set(webComponent, completeByStateElement);\r\n }\r\n completeByStateElement.set(stateElement, true);\r\n}\r\n\r\nexport function isWebComponentComplete(webComponent: Element, stateElement: IStateElement): boolean {\r\n const completeByStateElement = completeByStateElementByWebComponent.get(webComponent);\r\n if (!completeByStateElement) {\r\n return false;\r\n }\r\n return completeByStateElement.get(stateElement) === true;\r\n}\r\n","import { IFilterInfo } from \"../binding/types.js\";\r\n\r\nexport function getFilteredValue(value: any, filters: IFilterInfo[]) {\r\n let filteredValue = value;\r\n for(const filter of filters) {\r\n filteredValue = filter.filterFn(filteredValue);\r\n }\r\n return filteredValue;\r\n}\r\n","import { createEmptyArray } from \"../createEmptyArray\";\r\nimport { IBindingInfo } from \"../types\";\r\nimport { getFilteredValue } from \"./getFilteredValue\";\r\nimport { IApplyContext } from \"./types\";\r\n\r\nconst EMPTY_ARRAY = createEmptyArray<unknown>();\r\n\r\nexport function applyChangeToCheckbox(binding: IBindingInfo, _context: IApplyContext, newValue: unknown): void {\r\n const element = binding.node as HTMLInputElement;\r\n const elementValue = element.value;\r\n const elementFilteredValue = getFilteredValue(elementValue, binding.inFilters);\r\n const normalizedNewValue = Array.isArray(newValue) ? newValue : EMPTY_ARRAY;\r\n element.checked = normalizedNewValue.includes(elementFilteredValue);\r\n}\r\n","\r\nexport function createEmptyArray<T>(): Readonly<Array<T>> {\r\n return Object.freeze<Array<T>>([]);\r\n}\r\n","import { WILDCARD } from \"../define\";\r\nimport { IListIndex } from \"../list/types\";\r\nimport { IPathInfo, IStateAddress } from \"./types\";\r\n\r\nconst _cache: WeakMap<IListIndex, WeakMap<IPathInfo, IStateAddress>> = new WeakMap();\r\nconst _cacheNullListIndex: WeakMap<IPathInfo, IStateAddress> = new WeakMap();\r\n\r\nclass StateAddress implements IStateAddress {\r\n readonly pathInfo: IPathInfo;\r\n readonly listIndex: IListIndex | null;\r\n private _parentAddress: IStateAddress | null | undefined;\r\n\r\n constructor(pathInfo: IPathInfo, listIndex: IListIndex | null) {\r\n this.pathInfo = pathInfo;\r\n this.listIndex = listIndex;\r\n }\r\n\r\n get parentAddress(): IStateAddress | null {\r\n if (typeof this._parentAddress !== 'undefined') {\r\n return this._parentAddress;\r\n }\r\n const parentPathInfo = this.pathInfo.parentPathInfo;\r\n if (parentPathInfo === null) {\r\n return null;\r\n }\r\n const lastSegment = this.pathInfo.segments[this.pathInfo.segments.length - 1];\r\n let parentListIndex: IListIndex | null = null;\r\n if (lastSegment === WILDCARD) {\r\n parentListIndex = this.listIndex?.parentListIndex ?? null;\r\n } else {\r\n parentListIndex = this.listIndex;\r\n }\r\n return this._parentAddress = createStateAddress(parentPathInfo, parentListIndex);\r\n }\r\n}\r\n\r\nexport function createStateAddress(pathInfo: IPathInfo, listIndex: IListIndex | null): IStateAddress {\r\n if (listIndex === null) {\r\n let cached = _cacheNullListIndex.get(pathInfo);\r\n if (typeof cached !== \"undefined\") {\r\n return cached;\r\n }\r\n cached = new StateAddress(pathInfo, null);\r\n _cacheNullListIndex.set(pathInfo, cached);\r\n return cached;\r\n } else {\r\n let cacheByPathInfo = _cache.get(listIndex);\r\n if (typeof cacheByPathInfo === \"undefined\") {\r\n cacheByPathInfo = new WeakMap<IPathInfo, IStateAddress>();\r\n _cache.set(listIndex, cacheByPathInfo);\r\n }\r\n let cached = cacheByPathInfo.get(pathInfo);\r\n if (typeof cached !== \"undefined\") {\r\n return cached;\r\n }\r\n cached = new StateAddress(pathInfo, listIndex);\r\n cacheByPathInfo.set(pathInfo, cached);\r\n return cached;\r\n }\r\n}","import { IContent } from \"../structural/types\";\r\nimport { IBindingInfo } from \"../types\";\r\n\r\nconst indexBindingsByContent: WeakMap<IContent, IBindingInfo[]> = new WeakMap();\r\n\r\nexport function getIndexBindingsByContent(content: IContent): IBindingInfo[] {\r\n return indexBindingsByContent.get(content) ?? [];\r\n}\r\n\r\nexport function setIndexBindingsByContent(content: IContent, bindings: IBindingInfo[]): void {\r\n indexBindingsByContent.set(content, bindings);\r\n}\r\n","/* v8 ignore file */\r\nexport {};\r\n\r\ndeclare global {\r\n interface Set<T> {\r\n difference(other: Set<T>): Set<T>;\r\n intersection(other: Set<T>): Set<T>;\r\n }\r\n}\r\n\r\nif (!Set.prototype.difference) {\r\n Set.prototype.difference = function <T>(this: Set<T>, other: Set<T>): Set<T> {\r\n const result = new Set(this);\r\n for (const elem of other) {\r\n result.delete(elem);\r\n }\r\n return result;\r\n };\r\n}\r\n\r\nif (!Set.prototype.intersection) {\r\n Set.prototype.intersection = function <T>(this: Set<T>, other: Set<T>): Set<T> {\r\n const result = new Set<T>();\r\n for (const elem of other) {\r\n if (this.has(elem)) {\r\n result.add(elem);\r\n }\r\n }\r\n return result;\r\n };\r\n}\r\n","\r\nlet count = 0;\r\nexport function getUUID(): string {\r\n return `u${(count++).toString(36)}`;\r\n}\r\n","import { getUUID } from \"../getUUID\";\r\nimport { IListIndex } from \"./types\";\r\n\r\nlet version = 0;\r\n\r\nclass ListIndex implements IListIndex {\r\n readonly uuid = getUUID();\r\n readonly parentListIndex: IListIndex | null;\r\n readonly position: number;\r\n readonly length: number;\r\n\r\n private _index: number;\r\n private _version: number;\r\n private _indexes: number[] | undefined;\r\n private _listIndexes: WeakRef<IListIndex>[] | undefined;\r\n\r\n /**\r\n * Creates a new ListIndex instance.\r\n * \r\n * @param parentListIndex - Parent list index for nested loops, or null for top-level\r\n * @param index - Current index value in the loop\r\n */\r\n constructor(parentListIndex: IListIndex | null, index: number) {\r\n this.parentListIndex = parentListIndex;\r\n this.position = parentListIndex ? parentListIndex.position + 1 : 0;\r\n this.length = this.position + 1;\r\n this._index = index;\r\n this._version = version;\r\n }\r\n\r\n /**\r\n * Gets current index value.\r\n * \r\n * @returns Current index number\r\n */\r\n get index() {\r\n return this._index;\r\n }\r\n \r\n /**\r\n * Sets index value and updates version.\r\n * \r\n * @param value - New index value\r\n */\r\n set index(value: number) {\r\n this._index = value;\r\n this._version = ++version;\r\n this.indexes[this.position] = value;\r\n }\r\n\r\n /**\r\n * Gets current version number for change detection.\r\n * \r\n * @returns Version number\r\n */\r\n get version(): number {\r\n return this._version;\r\n }\r\n\r\n /**\r\n * Checks if parent indexes have changed since last access.\r\n * \r\n * @returns true if parent has newer version, false otherwise\r\n */\r\n get dirty(): boolean {\r\n if (this.parentListIndex === null) {\r\n return false;\r\n } else {\r\n return this.parentListIndex.dirty || this.parentListIndex.version > this._version;\r\n }\r\n }\r\n\r\n /**\r\n * Gets array of all index values from root to current level.\r\n * Rebuilds array if parent indexes have changed (dirty).\r\n * \r\n * @returns Array of index values\r\n */\r\n get indexes(): number[] {\r\n if (this.parentListIndex === null) {\r\n if (typeof this._indexes === \"undefined\") {\r\n this._indexes = [this._index];\r\n }\r\n } else {\r\n if (typeof this._indexes === \"undefined\" || this.dirty) {\r\n this._indexes = [...this.parentListIndex.indexes, this._index];\r\n this._version = version;\r\n }\r\n }\r\n return this._indexes;\r\n }\r\n\r\n /**\r\n * Gets array of WeakRef to all ListIndex instances from root to current level.\r\n * \r\n * @returns Array of WeakRef<IListIndex>\r\n */\r\n get listIndexes(): WeakRef<IListIndex>[] {\r\n if (this.parentListIndex === null) {\r\n if (typeof this._listIndexes === \"undefined\") {\r\n this._listIndexes = [new WeakRef(this)];\r\n }\r\n } else {\r\n if (typeof this._listIndexes === \"undefined\") {\r\n this._listIndexes = [...this.parentListIndex.listIndexes, new WeakRef(this)];\r\n }\r\n }\r\n return this._listIndexes;\r\n }\r\n\r\n /**\r\n * Gets variable name for this loop index ($1, $2, etc.).\r\n * \r\n * @returns Variable name string\r\n */\r\n get varName(): string {\r\n return `$${this.position + 1}`;\r\n }\r\n\r\n /**\r\n * Gets ListIndex at specified position in hierarchy.\r\n * Supports negative indexing from end.\r\n * \r\n * @param pos - Position index (0-based, negative for from end)\r\n * @returns ListIndex at position or null if not found/garbage collected\r\n */\r\n at(pos: number): IListIndex | null {\r\n if (pos >= 0) {\r\n return this.listIndexes[pos]?.deref() || null;\r\n } else {\r\n return this.listIndexes[this.listIndexes.length + pos]?.deref() || null;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Factory function to create ListIndex instance.\r\n * \r\n * @param parentListIndex - Parent list index for nested loops, or null for top-level\r\n * @param index - Current index value in the loop\r\n * @returns New IListIndex instance\r\n */\r\nexport function createListIndex(parentListIndex: IListIndex | null, index: number): IListIndex {\r\n return new ListIndex(parentListIndex, index);\r\n}\r\n","import { IListIndex } from \"./types\";\r\n\r\nconst listIndexesByList = new WeakMap<readonly unknown[], IListIndex[]>();\r\n\r\nexport function getListIndexesByList(list: readonly unknown[]): IListIndex[] | null {\r\n return listIndexesByList.get(list) || null;\r\n}\r\n\r\nexport function setListIndexesByList(list: readonly unknown[], listIndexes: IListIndex[] | null): void {\r\n if (listIndexes === null) {\r\n listIndexesByList.delete(list);\r\n return;\r\n }\r\n listIndexesByList.set(list, listIndexes);\r\n}","import \"../polyfills\";\r\nimport { createListIndex } from \"./createListIndex\";\r\nimport { getListIndexesByList, setListIndexesByList } from \"./listIndexesByList\";\r\nimport { IListDiff, IListIndex } from \"./types\";\r\n\r\nconst listDiffByOldListByNewList = new WeakMap<readonly unknown[], WeakMap<readonly unknown[], IListDiff>>();\r\n\r\nconst EMPTY_LIST = Object.freeze([]);\r\nconst EMPTY_SET = new Set<IListIndex>();\r\n\r\nfunction getListDiff(rawOldList: readonly unknown[], rawNewList: readonly unknown[]): IListDiff | null {\r\n const oldList = (Array.isArray(rawOldList) && rawOldList.length > 0) ? rawOldList : EMPTY_LIST;\r\n const newList = (Array.isArray(rawNewList) && rawNewList.length > 0) ? rawNewList : EMPTY_LIST;\r\n let diffByNewList = listDiffByOldListByNewList.get(oldList);\r\n if (!diffByNewList) {\r\n return null;\r\n }\r\n return diffByNewList.get(newList) || null;\r\n}\r\n\r\nfunction setListDiff(oldList: readonly unknown[], newList: readonly unknown[], diff: IListDiff): void {\r\n let diffByNewList = listDiffByOldListByNewList.get(oldList);\r\n if (!diffByNewList) {\r\n diffByNewList = new WeakMap<readonly unknown[], IListDiff>();\r\n listDiffByOldListByNewList.set(oldList, diffByNewList);\r\n }\r\n diffByNewList.set(newList, diff);\r\n}\r\n/**\r\n * Checks if two lists are identical by comparing length and each element.\r\n * @param oldList - Previous list to compare\r\n * @param newList - New list to compare\r\n * @returns True if lists are identical, false otherwise\r\n */\r\nfunction isSameList(oldList: readonly unknown[], newList: readonly unknown[]): boolean {\r\n if (oldList.length !== newList.length) {\r\n return false;\r\n }\r\n\r\n for (let i = 0; i < oldList.length; i++) {\r\n if (oldList[i] !== newList[i]) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n\r\n/**\r\n * Creates or updates list indexes by comparing old and new lists.\r\n * Optimizes by reusing existing list indexes when values match.\r\n * @param parentListIndex - Parent list index for nested lists, or null for top-level\r\n * @param oldList - Previous list (will be normalized to array)\r\n * @param newList - New list (will be normalized to array)\r\n * @param oldIndexes - Array of existing list indexes to potentially reuse\r\n * @returns Array of list indexes for the new list\r\n */\r\nexport function createListDiff(\r\n parentListIndex: IListIndex | null,\r\n rawOldList: unknown,\r\n rawNewList: unknown,\r\n): IListDiff {\r\n // Normalize inputs to arrays (handles null/undefined)\r\n const oldList: readonly unknown[] = (Array.isArray(rawOldList) && rawOldList.length > 0) ? rawOldList : EMPTY_LIST;\r\n const newList: readonly unknown[] = (Array.isArray(rawNewList) && rawNewList.length > 0) ? rawNewList : EMPTY_LIST;\r\n const cachedDiff = getListDiff(oldList, newList);\r\n if (cachedDiff) {\r\n return cachedDiff;\r\n }\r\n const oldIndexes = getListIndexesByList(oldList) || [];\r\n let retValue: IListDiff | undefined;\r\n try {\r\n // Early return for empty list\r\n if (newList.length === 0) {\r\n return retValue = {\r\n oldIndexes: oldIndexes,\r\n newIndexes: [] as IListIndex[],\r\n changeIndexSet: EMPTY_SET,\r\n deleteIndexSet: new Set<IListIndex>(oldIndexes),\r\n addIndexSet: EMPTY_SET,\r\n };\r\n }\r\n // If old list was empty, create all new indexes\r\n let newIndexes: IListIndex[] | null = getListIndexesByList(newList);\r\n if (oldList.length === 0) {\r\n if (newIndexes === null) {\r\n newIndexes = [];\r\n for(let i = 0; i < newList.length; i++) {\r\n const newListIndex = createListIndex(parentListIndex, i);\r\n newIndexes.push(newListIndex);\r\n }\r\n }\r\n return retValue = {\r\n oldIndexes: oldIndexes,\r\n newIndexes: newIndexes,\r\n changeIndexSet: EMPTY_SET,\r\n deleteIndexSet: EMPTY_SET,\r\n addIndexSet: new Set<IListIndex>(newIndexes),\r\n };\r\n }\r\n // If lists are identical, return existing indexes unchanged (optimization)\r\n if (isSameList(oldList, newList)) {\r\n return retValue = {\r\n oldIndexes: oldIndexes,\r\n newIndexes: oldIndexes,\r\n changeIndexSet: EMPTY_SET,\r\n deleteIndexSet: EMPTY_SET,\r\n addIndexSet: EMPTY_SET,\r\n };\r\n }\r\n // Use index-based map for efficiency\r\n // Supports duplicate values by storing array of indexes\r\n const indexByValue = new Map<unknown, number[]>();\r\n for(let i = 0; i < oldList.length; i++) {\r\n const val = oldList[i];\r\n let indexes = indexByValue.get(val);\r\n if (!indexes) {\r\n indexes = [];\r\n indexByValue.set(val, indexes);\r\n }\r\n indexes.push(i);\r\n }\r\n if (newIndexes !== null) {\r\n return calcDiffIndexes(oldList, newList, oldIndexes, newIndexes, indexByValue);\r\n }\r\n newIndexes = [];\r\n\r\n // Build new indexes array by matching values with old list\r\n const changeIndexSet: Set<IListIndex> = new Set();\r\n const addIndexSet: Set<IListIndex> = new Set();\r\n for(let i = 0; i < newList.length; i++) {\r\n const newValue = newList[i];\r\n const existingIndexes = indexByValue.get(newValue);\r\n const oldIndex = existingIndexes && existingIndexes.length > 0 ? existingIndexes.shift() : undefined;\r\n \r\n if (typeof oldIndex === \"undefined\") {\r\n // New element\r\n const newListIndex = createListIndex(parentListIndex, i);\r\n newIndexes.push(newListIndex);\r\n addIndexSet.add(newListIndex);\r\n } else {\r\n // Reuse existing element\r\n const existingListIndex = oldIndexes[oldIndex];\r\n // Update index if position changed\r\n if (existingListIndex.index !== i) {\r\n existingListIndex.index = i;\r\n changeIndexSet.add(existingListIndex);\r\n }\r\n newIndexes.push(existingListIndex);\r\n }\r\n }\r\n \r\n const deleteIndexSet: Set<IListIndex> = (new Set(oldIndexes)).difference(new Set(newIndexes));\r\n return retValue = {\r\n oldIndexes: oldIndexes,\r\n newIndexes: newIndexes,\r\n changeIndexSet: changeIndexSet,\r\n deleteIndexSet: deleteIndexSet,\r\n addIndexSet: addIndexSet,\r\n };\r\n } finally {\r\n if (typeof retValue !== \"undefined\") {\r\n setListDiff(oldList, newList, retValue);\r\n setListIndexesByList(newList, retValue.newIndexes);\r\n }\r\n }\r\n}\r\n\r\nfunction calcDiffIndexes(\r\n oldList: readonly unknown[],\r\n newList: readonly unknown[],\r\n oldIndexes: IListIndex[],\r\n newIndexes: IListIndex[],\r\n indexByValue: Map<unknown, number[]>\r\n): IListDiff {\r\n const newIndexSet: Set<IListIndex> = new Set(newIndexes);\r\n const oldIndexSet: Set<IListIndex> = new Set(oldIndexes);\r\n const changeIndexSet: Set<IListIndex> = new Set();\r\n const addIndexSet: Set<IListIndex> = newIndexSet.difference(oldIndexSet);\r\n const deleteIndexSet: Set<IListIndex> = oldIndexSet.difference(newIndexSet);\r\n for(let i = 0; i < newList.length; i++) {\r\n const newValue = newList[i];\r\n const existingIndexes = indexByValue.get(newValue);\r\n const oldIndex = existingIndexes && existingIndexes.length > 0 ? existingIndexes.shift() : undefined;\r\n if (typeof oldIndex !== \"undefined\") {\r\n const existingListIndex = oldIndexes[oldIndex];\r\n if (existingListIndex.index !== i) {\r\n // 位置が違うことだけを記録 \r\n changeIndexSet.add(existingListIndex);\r\n }\r\n }\r\n }\r\n return {\r\n oldIndexes: oldIndexes,\r\n newIndexes: newIndexes,\r\n changeIndexSet: changeIndexSet,\r\n deleteIndexSet: deleteIndexSet,\r\n addIndexSet: addIndexSet,\r\n };\r\n}","import { IAbsoluteStateAddress } from \"../address/types\";\r\nimport { IBindingInfo } from \"./types\";\r\n\r\nconst bindingSetByAbsoluteStateAddress: WeakMap<IAbsoluteStateAddress, Set<IBindingInfo>> = new WeakMap();\r\n\r\nexport function getBindingSetByAbsoluteStateAddress(absoluteStateAddress: IAbsoluteStateAddress): Set<IBindingInfo> {\r\n let bindingSet: Set<IBindingInfo> | null = null;\r\n bindingSet = bindingSetByAbsoluteStateAddress.get(absoluteStateAddress) || null;\r\n if (bindingSet === null) {\r\n bindingSet = new Set();\r\n bindingSetByAbsoluteStateAddress.set(absoluteStateAddress, bindingSet);\r\n }\r\n return bindingSet;\r\n}\r\n\r\nexport function addBindingByAbsoluteStateAddress(absoluteStateAddress: IAbsoluteStateAddress, binding: IBindingInfo): void {\r\n const bindingSet = getBindingSetByAbsoluteStateAddress(absoluteStateAddress);\r\n bindingSet.add(binding);\r\n}\r\n\r\nexport function clearBindingSetByAbsoluteStateAddress(absoluteStateAddress: IAbsoluteStateAddress): void {\r\n bindingSetByAbsoluteStateAddress.delete(absoluteStateAddress);\r\n}\r\n\r\nexport function removeBindingByAbsoluteStateAddress(absoluteStateAddress: IAbsoluteStateAddress, binding: IBindingInfo): void {\r\n const bindingSet = getBindingSetByAbsoluteStateAddress(absoluteStateAddress);\r\n bindingSet.delete(binding);\r\n}","import { createStateAddress } from \"../address/StateAddress\";\r\nimport { IStateAddress } from \"../address/types\";\r\nimport { getListIndexByBindingInfo } from \"../list/getListIndexByBindingInfo\";\r\nimport { raiseError } from \"../raiseError\";\r\nimport { IBindingInfo } from \"../types\";\r\n\r\nconst stateAddressByBindingInfo: WeakMap<IBindingInfo, IStateAddress> = new WeakMap();\r\n\r\nexport function getStateAddressByBindingInfo(bindingInfo: IBindingInfo) {\r\n let stateAddress: IStateAddress | null = null;\r\n stateAddress = stateAddressByBindingInfo.get(bindingInfo) || null;\r\n if (stateAddress !== null) {\r\n return stateAddress;\r\n }\r\n if (bindingInfo.statePathInfo.wildcardCount > 0) {\r\n const listIndex = getListIndexByBindingInfo(bindingInfo);\r\n if (listIndex === null) {\r\n raiseError(`Cannot resolve state address for binding with wildcard statePathName \"${bindingInfo.statePathName}\" because list index is null.`);\r\n }\r\n stateAddress = createStateAddress(bindingInfo.statePathInfo, listIndex);\r\n } else {\r\n stateAddress = createStateAddress(bindingInfo.statePathInfo, null);\r\n }\r\n stateAddressByBindingInfo.set(bindingInfo, stateAddress);\r\n return stateAddress;\r\n}\r\n\r\n// call for change loopContext\r\nexport function clearStateAddressByBindingInfo(bindingInfo: IBindingInfo) {\r\n stateAddressByBindingInfo.delete(bindingInfo);\r\n}","import { IContent } from \"../structural/types\";\r\nimport { IBindingInfo } from \"../types\";\r\n\r\nconst bindingsByContent: WeakMap<IContent, IBindingInfo[]> = new WeakMap();\r\n\r\nexport function getBindingsByContent(content: IContent): IBindingInfo[] {\r\n return bindingsByContent.get(content) ?? [];\r\n}\r\n\r\nexport function setBindingsByContent(content: IContent, bindings: IBindingInfo[]): void {\r\n bindingsByContent.set(content, bindings);\r\n}\r\n","import { IContent } from \"../structural/types\";\r\n\r\nconst nodesByContent: WeakMap<IContent, Node[]> = new WeakMap();\r\n\r\nexport function getNodesByContent(content: IContent): Node[] {\r\n return nodesByContent.get(content) ?? [];\r\n}\r\n\r\nexport function setNodesByContent(content: IContent, nodes: Node[]): void {\r\n nodesByContent.set(content, nodes);\r\n}\r\n","import { setLoopContextByNode } from \"../list/loopContextByNode\";\r\nimport { ILoopContext } from \"../list/types\";\r\nimport { IContent } from \"../structural/types\";\r\nimport { getNodesByContent } from \"./nodesByContent\";\r\n\r\nexport function bindLoopContextToContent(content: IContent, loopContext: ILoopContext | null): void {\r\n const nodes = getNodesByContent(content);\r\n for(const node of nodes) {\r\n setLoopContextByNode(node, loopContext);\r\n }\r\n}\r\n\r\nexport function unbindLoopContextToContent(content: IContent): void {\r\n const nodes = getNodesByContent(content);\r\n for(const node of nodes) {\r\n setLoopContextByNode(node, null);\r\n }\r\n}\r\n","import { applyChange } from \"../apply/applyChange\";\r\nimport { IApplyContext } from \"../apply/types\";\r\nimport { clearAbsoluteStateAddressByBinding, getAbsoluteStateAddressByBinding } from \"../binding/getAbsoluteStateAddressByBinding\";\r\nimport { addBindingByAbsoluteStateAddress, removeBindingByAbsoluteStateAddress } from \"../binding/getBindingSetByAbsoluteStateAddress\";\r\nimport { clearStateAddressByBindingInfo } from \"../binding/getStateAddressByBindingInfo\";\r\nimport { getBindingsByContent } from \"../bindings/bindingsByContent\";\r\nimport { bindLoopContextToContent, unbindLoopContextToContent } from \"../bindings/bindLoopContextToContent\";\r\nimport { ILoopContext } from \"../list/types\";\r\nimport { IContent } from \"./types\";\r\n\r\nexport function activateContent(\r\n content: IContent, \r\n loopContext: ILoopContext | null,\r\n context: IApplyContext,\r\n): void {\r\n bindLoopContextToContent(content, loopContext);\r\n const bindings = getBindingsByContent(content);\r\n for(const binding of bindings) {\r\n const absoluteStateAddress = getAbsoluteStateAddressByBinding(binding);\r\n addBindingByAbsoluteStateAddress(absoluteStateAddress, binding);\r\n applyChange(binding, context);\r\n }\r\n}\r\n\r\nexport function deactivateContent(\r\n content: IContent\r\n): void {\r\n if (!content.mounted) {\r\n return;\r\n }\r\n const bindings = getBindingsByContent(content);\r\n for(const binding of bindings) {\r\n const absoluteStateAddress = getAbsoluteStateAddressByBinding(binding);\r\n removeBindingByAbsoluteStateAddress(absoluteStateAddress, binding);\r\n clearAbsoluteStateAddressByBinding(binding);\r\n clearStateAddressByBindingInfo(binding);\r\n }\r\n unbindLoopContextToContent(content);\r\n}\r\n\r\n","import { createEmptySet } from \"../createEmptySet\";\r\nimport { IContent } from \"./types\";\r\n\r\nconst contentSetByNode = new WeakMap<Node, Set<IContent>>();\r\n\r\nconst EMPTY_SET = createEmptySet<IContent>();\r\n\r\nexport function setContentByNode(node: Node, content: IContent): void {\r\n const contents = contentSetByNode.get(node);\r\n if (contents) {\r\n contents.add(content);\r\n } else {\r\n contentSetByNode.set(node, new Set([content]));\r\n }\r\n}\r\n\r\nexport function getContentSetByNode(node: Node): Readonly<Set<IContent>> {\r\n const contents = contentSetByNode.get(node);\r\n if (typeof contents !== \"undefined\") {\r\n return contents;\r\n }\r\n return EMPTY_SET;\r\n}\r\n\r\nexport function deleteContentByNode(node: Node, content: IContent): void {\r\n const contents = contentSetByNode.get(node);\r\n if (contents) {\r\n contents.delete(content);\r\n if (contents.size === 0) {\r\n contentSetByNode.delete(node);\r\n }\r\n }\r\n}","\r\nexport function createEmptySet<T>(): Readonly<Set<T>> {\r\n return Object.freeze(new Set<T>());\r\n}\r\n","import { clearAbsoluteStateAddressByBinding } from \"../binding/getAbsoluteStateAddressByBinding.js\";\r\nimport { clearStateAddressByBindingInfo } from \"../binding/getStateAddressByBindingInfo.js\";\r\nimport { getBindingsByContent, setBindingsByContent } from \"../bindings/bindingsByContent.js\";\r\nimport { setIndexBindingsByContent } from \"../bindings/indexBindingsByContent.js\";\r\nimport { initializeBindingsByFragment } from \"../bindings/initializeBindings.js\";\r\nimport { setNodesByContent } from \"../bindings/nodesByContent.js\";\r\nimport { INDEX_BY_INDEX_NAME } from \"../define.js\";\r\nimport { raiseError } from \"../raiseError.js\";\r\nimport { IBindingInfo } from \"../types.js\";\r\nimport { getContentSetByNode, setContentByNode } from \"./contentsByNode.js\";\r\nimport { getFragmentInfoByUUID } from \"./fragmentInfoByUUID.js\";\r\nimport { IContent } from \"./types.js\";\r\n\r\nconst recursiveBindingTypes = new Set(['if', 'elseif', 'else', 'for']);\r\n\r\nclass Content implements IContent {\r\n private _content: DocumentFragment;\r\n private _childNodeArray: Node[] = [];\r\n private _firstNode: Node | null = null;\r\n private _lastNode: Node | null = null;\r\n private _mounted: boolean = false;\r\n constructor(content: DocumentFragment) {\r\n this._content = content;\r\n this._childNodeArray = Array.from(this._content.childNodes);\r\n this._firstNode = this._childNodeArray.length > 0 ? this._childNodeArray[0] : null;\r\n this._lastNode = this._childNodeArray.length > 0 ? this._childNodeArray[this._childNodeArray.length - 1] : null;\r\n }\r\n\r\n get firstNode(): Node | null {\r\n return this._firstNode;\r\n }\r\n\r\n get lastNode(): Node | null {\r\n return this._lastNode;\r\n }\r\n\r\n get mounted(): boolean {\r\n return this._mounted;\r\n }\r\n\r\n appendTo(targetNode: Node): void {\r\n for(const node of this._childNodeArray) {\r\n targetNode.appendChild(node);\r\n }\r\n this._mounted = true;\r\n }\r\n\r\n mountAfter(targetNode: Node): void {\r\n const parentNode = targetNode.parentNode;\r\n const nextSibling = targetNode.nextSibling;\r\n if (parentNode) {\r\n for(const node of this._childNodeArray) {\r\n parentNode.insertBefore(node, nextSibling);\r\n }\r\n }\r\n this._mounted = true;\r\n }\r\n\r\n unmount(): void {\r\n for(const node of this._childNodeArray) {\r\n if (node.parentNode !== null) {\r\n node.parentNode.removeChild(node);\r\n }\r\n }\r\n const bindings = getBindingsByContent(this);\r\n for(const binding of bindings) {\r\n if (recursiveBindingTypes.has(binding.bindingType)) {\r\n const contents = getContentSetByNode(binding.node);\r\n for (const content of contents) {\r\n content.unmount();\r\n }\r\n }\r\n clearStateAddressByBindingInfo(binding);\r\n clearAbsoluteStateAddressByBinding(binding);\r\n }\r\n this._mounted = false;\r\n }\r\n}\r\n\r\n/**\r\n * SSR ハイドレーション用: 既存の DOM ノード配列から Content を生成する。\r\n * テンプレートからの clone ではなく、SSR で描画済みのノードをそのまま使う。\r\n */\r\nexport function createContentFromNodes(\r\n nodes: Node[],\r\n): IContent {\r\n const fragment = document.createDocumentFragment();\r\n // ノードを fragment に移動せず、参照だけ持つ Content を作る\r\n const content = new Content(fragment);\r\n // Content の内部状態を直接設定\r\n (content as any)._childNodeArray = nodes;\r\n (content as any)._firstNode = nodes.length > 0 ? nodes[0] : null;\r\n (content as any)._lastNode = nodes.length > 0 ? nodes[nodes.length - 1] : null;\r\n (content as any)._mounted = true; // SSR で既にマウント済み\r\n return content;\r\n}\r\n\r\nexport function createContent(\r\n bindingInfo: IBindingInfo, \r\n): IContent {\r\n if (typeof bindingInfo.uuid === 'undefined' || bindingInfo.uuid === null) {\r\n raiseError(`BindingInfo.uuid is null.`);\r\n }\r\n const fragmentInfo = getFragmentInfoByUUID(bindingInfo.uuid);\r\n if (!fragmentInfo) {\r\n raiseError(`Fragment with UUID \"${bindingInfo.uuid}\" not found.`);\r\n }\r\n const cloneFragment = document.importNode(fragmentInfo.fragment, true);\r\n const initialInfo = initializeBindingsByFragment(cloneFragment, fragmentInfo.nodeInfos);\r\n const content = new Content(cloneFragment);\r\n setBindingsByContent(content, initialInfo.bindingInfos);\r\n const indexBindings: IBindingInfo[] = [];\r\n for(const binding of initialInfo.bindingInfos) {\r\n if (binding.statePathName in INDEX_BY_INDEX_NAME) {\r\n indexBindings.push(binding);\r\n }\r\n }\r\n setIndexBindingsByContent(content, indexBindings);\r\n setNodesByContent(content, initialInfo.nodes);\r\n setContentByNode(bindingInfo.node, content);\r\n return content;\r\n}\r\n","import { ILoopContext } from \"../list/types\";\r\nimport { IBindingInfo } from \"../types\";\r\nimport { getStateElementByName } from \"../stateElementByName\";\r\nimport { raiseError } from \"../raiseError\";\r\nimport { replaceToReplaceNode } from \"./replaceToReplaceNode\";\r\nimport { collectNodesAndBindingInfos, collectNodesAndBindingInfosByFragment } from \"./collectNodesAndBindingInfos\";\r\nimport { IFragmentNodeInfo } from \"../structural/types\";\r\nimport { attachEventHandler } from \"../event/handler\";\r\nimport { attachTwowayEventHandler } from \"../event/twowayHandler\";\r\nimport { setLoopContextByNode } from \"../list/loopContextByNode\";\r\nimport { applyChangeFromBindings } from \"../apply/applyChangeFromBindings\";\r\nimport { IInitialBindingInfo } from \"./types\";\r\nimport { getAbsoluteStateAddressByBinding } from \"../binding/getAbsoluteStateAddressByBinding\";\r\nimport { addBindingByAbsoluteStateAddress } from \"../binding/getBindingSetByAbsoluteStateAddress\";\r\nimport { attachRadioEventHandler } from \"../event/radioHandler\";\r\nimport { attachCheckboxEventHandler } from \"../event/checkboxHandler\";\r\n\r\nfunction _initializeBindings(\r\n allBindings: IBindingInfo[],\r\n): void {\r\n for(const binding of allBindings) {\r\n\r\n // replace node\r\n replaceToReplaceNode(binding);\r\n\r\n // event\r\n if (attachEventHandler(binding)) {\r\n continue;\r\n }\r\n\r\n // two-way binding\r\n attachTwowayEventHandler(binding);\r\n // radio binding\r\n attachRadioEventHandler(binding);\r\n // checkbox binding\r\n attachCheckboxEventHandler(binding);\r\n\r\n }\r\n}\r\n\r\nexport function initializeBindings(\r\n root: Document | DocumentFragment |Element, parentLoopContext: ILoopContext | null\r\n): void {\r\n const [subscriberNodes, allBindings] = collectNodesAndBindingInfos(root);\r\n for(const node of subscriberNodes) {\r\n setLoopContextByNode(node, parentLoopContext);\r\n }\r\n _initializeBindings(allBindings);\r\n // create absolute state address and register binding infos\r\n for(const binding of allBindings) {\r\n const absoluteStateAddress = getAbsoluteStateAddressByBinding(binding);\r\n addBindingByAbsoluteStateAddress(absoluteStateAddress, binding);\r\n const rootNode = binding.replaceNode.getRootNode() as Node;\r\n const stateElement = getStateElementByName(rootNode, binding.stateName);\r\n if (stateElement === null) {\r\n raiseError(`State element with name \"${binding.stateName}\" not found for binding.`);\r\n }\r\n if (binding.bindingType !== 'event') {\r\n stateElement.setPathInfo(binding.statePathName, binding.bindingType);\r\n }\r\n }\r\n // apply all at once\r\n applyChangeFromBindings(allBindings);\r\n}\r\n\r\nexport function initializeBindingsByFragment(\r\n root: DocumentFragment,\r\n nodeInfos: IFragmentNodeInfo[], \r\n): IInitialBindingInfo {\r\n const [subscriberNodes, allBindings] = collectNodesAndBindingInfosByFragment(root, nodeInfos);\r\n _initializeBindings(allBindings);\r\n return {\r\n nodes: subscriberNodes,\r\n bindingInfos: allBindings,\r\n };\r\n}\r\n","import { getPathInfo } from \"../address/PathInfo\";\r\nimport { createStateAddress } from \"../address/StateAddress\";\r\nimport { getAbsoluteStateAddressByBinding } from \"../binding/getAbsoluteStateAddressByBinding\";\r\nimport { getIndexBindingsByContent } from \"../bindings/indexBindingsByContent\";\r\nimport { config, inSsr } from \"../config\";\r\nimport { WILDCARD } from \"../define\";\r\nimport { createListDiff } from \"../list/createListDiff\";\r\nimport { getListIndexByBindingInfo } from \"../list/getListIndexByBindingInfo\";\r\nimport { getLastListValueByAbsoluteStateAddress } from \"../list/lastListValueByAbsoluteStateAddress\";\r\nimport { IListIndex } from \"../list/types\";\r\nimport { raiseError } from \"../raiseError\";\r\nimport { activateContent, deactivateContent } from \"../structural/activateContent\";\r\nimport { createContent } from \"../structural/createContent\";\r\nimport { IContent } from \"../structural/types\";\r\nimport { IBindingInfo } from \"../types\";\r\nimport { applyChange } from \"./applyChange\";\r\nimport { setRootNodeByFragment } from \"./rootNodeByFragment\";\r\nimport { IApplyContext } from \"./types\";\r\n\r\nconst lastNodeByNode: WeakMap<Node, Node> = new WeakMap();\r\nconst contentByListIndexByNode: WeakMap<Node, WeakMap<IListIndex, IContent>> = new WeakMap();\r\nconst pooledContentsByNode: WeakMap<Node, IContent[]> = new WeakMap();\r\nconst isOnlyNodeInParentContentByNode: WeakMap<Node, boolean> = new WeakMap();\r\n\r\n// テスト用ヘルパー(内部状態の操作)\r\nexport function __test_setContentByListIndex(node: Node, index: IListIndex, content: IContent | null): void {\r\n setContent(node, index, content);\r\n}\r\n\r\nexport function __test_deleteLastNodeByNode(node: Node): void {\r\n lastNodeByNode.delete(node);\r\n}\r\n\r\n// SSR ハイドレーション用: Content を ListIndex に登録する\r\nexport function hydrateSetContent(node: Node, index: IListIndex, content: IContent): void {\r\n setContent(node, index, content);\r\n}\r\n\r\nexport function hydrateSetLastNode(node: Node, lastNode: Node): void {\r\n lastNodeByNode.set(node, lastNode);\r\n}\r\n\r\nexport function __test_deleteContentByNode(node: Node): void {\r\n contentByListIndexByNode.delete(node);\r\n}\r\n\r\nfunction getPooledContents(bindingInfo: IBindingInfo): IContent[] {\r\n return pooledContentsByNode.get(bindingInfo.node) || [];\r\n}\r\n\r\nfunction setPooledContent(bindingInfo: IBindingInfo, content: IContent): void {\r\n const contents = pooledContentsByNode.get(bindingInfo.node);\r\n if (typeof contents === 'undefined') {\r\n pooledContentsByNode.set(bindingInfo.node, [content]);\r\n } else {\r\n contents.push(content);\r\n }\r\n}\r\n\r\nfunction isOnlyNodeInParentContent(firstNode: Node, lastNode: Node): boolean {\r\n let prevCheckNode = firstNode.previousSibling;\r\n let nextCheckNode = lastNode.nextSibling;\r\n let onlyNode = true;\r\n while(prevCheckNode !== null) {\r\n if (prevCheckNode.nodeType === Node.ELEMENT_NODE \r\n || (prevCheckNode.nodeType === Node.TEXT_NODE && (prevCheckNode.textContent?.trim() ?? '') !== '')) {\r\n onlyNode = false;\r\n break;\r\n }\r\n prevCheckNode = prevCheckNode.previousSibling;\r\n }\r\n while(nextCheckNode !== null) {\r\n if (nextCheckNode.nodeType === Node.ELEMENT_NODE \r\n || (nextCheckNode.nodeType === Node.TEXT_NODE && (nextCheckNode.textContent?.trim() ?? '') !== '')) {\r\n onlyNode = false;\r\n break;\r\n }\r\n nextCheckNode = nextCheckNode.nextSibling;\r\n }\r\n return onlyNode;\r\n}\r\n\r\nfunction getContent(node: Node, listIndex: IListIndex): IContent | null {\r\n let contentByListIndex = contentByListIndexByNode.get(node);\r\n if (typeof contentByListIndex === 'undefined') {\r\n return null;\r\n }\r\n const content = contentByListIndex.get(listIndex);\r\n return typeof content === 'undefined' ? null : content;\r\n}\r\n\r\nfunction setContent(node: Node, listIndex: IListIndex, content: IContent | null): void {\r\n let contentByListIndex = contentByListIndexByNode.get(node);\r\n if (typeof contentByListIndex === 'undefined') {\r\n if (content === null) {\r\n return;\r\n }\r\n contentByListIndex = new WeakMap<IListIndex, IContent>();\r\n contentByListIndexByNode.set(node, contentByListIndex);\r\n }\r\n if (content === null) {\r\n contentByListIndex.delete(listIndex);\r\n } else {\r\n contentByListIndex.set(listIndex, content);\r\n }\r\n}\r\n\r\nexport function applyChangeToFor(\r\n bindingInfo: IBindingInfo, \r\n context: IApplyContext,\r\n newValue: unknown, \r\n): void {\r\n const listPathInfo = bindingInfo.statePathInfo;\r\n const listIndex = getListIndexByBindingInfo(bindingInfo);\r\n const absAddress = getAbsoluteStateAddressByBinding(bindingInfo);\r\n const lastValue = getLastListValueByAbsoluteStateAddress(absAddress);\r\n const diff = createListDiff(listIndex, lastValue, newValue);\r\n context.newListValueByAbsAddress.set(absAddress, Array.isArray(newValue) ? newValue : []);\r\n\r\n if (Array.isArray(lastValue) \r\n && lastValue.length === diff.deleteIndexSet.size \r\n && diff.deleteIndexSet.size > 0\r\n && bindingInfo.node.parentNode !== null\r\n ) {\r\n let isOnlyNode = isOnlyNodeInParentContentByNode.get(bindingInfo.node);\r\n if (typeof isOnlyNode === 'undefined') {\r\n const lastNode = lastNodeByNode.get(bindingInfo.node) || bindingInfo.node;\r\n isOnlyNode = isOnlyNodeInParentContent(bindingInfo.node, lastNode);\r\n isOnlyNodeInParentContentByNode.set(bindingInfo.node, isOnlyNode);\r\n }\r\n if (isOnlyNode) {\r\n const parentNode = bindingInfo.node.parentNode;\r\n parentNode.textContent = '';\r\n parentNode.appendChild(bindingInfo.node);\r\n }\r\n }\r\n for(const deleteIndex of diff.deleteIndexSet) {\r\n const content = getContent(bindingInfo.node, deleteIndex);\r\n if (content !== null) {\r\n deactivateContent(content);\r\n content.unmount();\r\n setPooledContent(bindingInfo, content);\r\n setContent(bindingInfo.node, deleteIndex, null);\r\n }\r\n }\r\n\r\n let lastNode = bindingInfo.node;\r\n const elementPathInfo = getPathInfo(listPathInfo.path + '.' + WILDCARD);\r\n const loopContextStack = context.stateElement.loopContextStack;\r\n let fragment: DocumentFragment | null = null;\r\n if (diff.newIndexes.length == diff.addIndexSet.size \r\n && diff.newIndexes.length > 0\r\n && lastNode.isConnected\r\n ) {\r\n // 全部追加の場合はまとめて処理\r\n fragment = document.createDocumentFragment();\r\n setRootNodeByFragment(fragment, context.rootNode);\r\n }\r\n const ssrMode = inSsr();\r\n const uuid = bindingInfo.uuid ?? '';\r\n for(const index of diff.newIndexes) {\r\n let content: IContent | undefined;\r\n // add\r\n if (diff.addIndexSet.has(index)) {\r\n const stateAddress = createStateAddress(elementPathInfo, index);\r\n loopContextStack.createLoopContext(stateAddress, (loopContext) => {\r\n const pooledContents = getPooledContents(bindingInfo);\r\n content = pooledContents.pop();\r\n if (typeof content === 'undefined') {\r\n content = createContent(bindingInfo);\r\n }\r\n // コンテント活性化の前にDOMツリーに追加しておく必要がある\r\n if (fragment !== null) {\r\n if (ssrMode) {\r\n fragment.appendChild(document.createComment(`@@wcs-for-start:${uuid}:${listPathInfo.path}:${index.index}`));\r\n }\r\n content.appendTo(fragment);\r\n if (ssrMode) {\r\n fragment.appendChild(document.createComment(`@@wcs-for-end:${uuid}:${listPathInfo.path}:${index.index}`));\r\n }\r\n } else {\r\n // Update lastNode for next iteration to ensure correct order\r\n // Ensure content is in correct position (e.g. if previous siblings were deleted/moved)\r\n if (lastNode.nextSibling !== content.firstNode) {\r\n if (ssrMode) {\r\n const startComment = document.createComment(`@@wcs-for-start:${uuid}:${listPathInfo.path}:${index.index}`);\r\n lastNode.parentNode!.insertBefore(startComment, lastNode.nextSibling);\r\n lastNode = startComment;\r\n }\r\n content.mountAfter(lastNode);\r\n }\r\n if (ssrMode) {\r\n const endComment = document.createComment(`@@wcs-for-end:${uuid}:${listPathInfo.path}:${index.index}`);\r\n const afterNode = content.lastNode ?? lastNode;\r\n afterNode.parentNode!.insertBefore(endComment, afterNode.nextSibling);\r\n }\r\n }\r\n // コンテントを活性化\r\n activateContent(content, loopContext, context);\r\n });\r\n if (typeof content === 'undefined') {\r\n raiseError(`Content not found for ListIndex: ${index.index} at path \"${listPathInfo.path}\"`);\r\n }\r\n } else {\r\n content = getContent(bindingInfo.node, index)!;\r\n if (diff.changeIndexSet.has(index)) {\r\n // change\r\n const indexBindings = getIndexBindingsByContent(content);\r\n for(const indexBinding of indexBindings) {\r\n applyChange(indexBinding, context);\r\n }\r\n }\r\n // Update lastNode for next iteration to ensure correct order\r\n // Ensure content is in correct position (e.g. if previous siblings were deleted/moved)\r\n if (content === null) {\r\n raiseError(`Content not found for ListIndex: ${index.index} at path \"${listPathInfo.path}\"`);\r\n }\r\n if (lastNode.nextSibling !== content.firstNode) {\r\n content.mountAfter(lastNode);\r\n }\r\n }\r\n lastNode = content.lastNode || lastNode;\r\n setContent(bindingInfo.node, index, content);\r\n }\r\n lastNodeByNode.set(bindingInfo.node, lastNode);\r\n if (fragment !== null) {\r\n // Mount all at once\r\n bindingInfo.node.parentNode!.insertBefore(fragment, bindingInfo.node.nextSibling);\r\n setRootNodeByFragment(fragment, null);\r\n }\r\n}\r\n","import { config, inSsr } from \"../config\";\r\nimport { getLoopContextByNode } from \"../list/loopContextByNode\";\r\nimport { activateContent, deactivateContent } from \"../structural/activateContent\";\r\nimport { getContentSetByNode } from \"../structural/contentsByNode\";\r\nimport { createContent } from \"../structural/createContent\";\r\nimport { IContent } from \"../structural/types\";\r\nimport { IBindingInfo } from \"../types\";\r\nimport { IApplyContext } from \"./types\";\r\n\r\nconst lastConnectedByNode: WeakMap<Node, boolean> = new WeakMap();\r\n\r\nfunction bindingInfoText(bindingInfo: IBindingInfo): string {\r\n return `${bindingInfo.bindingType} ${bindingInfo.statePathName} ${bindingInfo.outFilters.map(f => f.filterName).join('|')} ${bindingInfo.node.isConnected ? '(connected)' : '(disconnected)'}`;\r\n}\r\n\r\nexport function applyChangeToIf(\r\n bindingInfo: IBindingInfo,\r\n context: IApplyContext,\r\n rawNewValue: unknown,\r\n): void {\r\n const currentConnected = bindingInfo.node.isConnected;\r\n const newValue = Boolean(rawNewValue);\r\n let content: IContent | undefined;\r\n const contents = getContentSetByNode(bindingInfo.node);\r\n if (contents.size === 0) {\r\n content = createContent(bindingInfo);\r\n } else {\r\n content = contents.values().next().value!;\r\n }\r\n const ssrMode = inSsr();\r\n const uuid = bindingInfo.uuid ?? '';\r\n const keyword = bindingInfo.bindingType; // if, elseif, else\r\n try {\r\n if (!newValue) {\r\n if (config.debug) {\r\n console.log(`unmount if content : ${bindingInfoText(bindingInfo)}`);\r\n }\r\n deactivateContent(content);\r\n content.unmount();\r\n }\r\n if (newValue) {\r\n if (config.debug) {\r\n console.log(`mount if content : ${bindingInfoText(bindingInfo)}`);\r\n }\r\n if (ssrMode) {\r\n const startComment = document.createComment(`@@wcs-${keyword}-start:${uuid}:${bindingInfo.statePathName}`);\r\n bindingInfo.node.parentNode!.insertBefore(startComment, bindingInfo.node.nextSibling);\r\n content.mountAfter(startComment);\r\n const endComment = document.createComment(`@@wcs-${keyword}-end:${uuid}:${bindingInfo.statePathName}`);\r\n const afterNode = content.lastNode ?? startComment;\r\n afterNode.parentNode!.insertBefore(endComment, afterNode.nextSibling);\r\n } else {\r\n content.mountAfter(bindingInfo.node);\r\n }\r\n const loopContext = getLoopContextByNode(bindingInfo.node);\r\n activateContent(content, loopContext, context);\r\n }\r\n } finally {\r\n lastConnectedByNode.set(bindingInfo.node, currentConnected);\r\n }\r\n}\r\n\r\n","/**\r\n * SSR 時に HTML 属性で表現できないプロパティバインディングを蓄積するストア。\r\n * ハイドレーション時にクライアント側で復元する。\r\n */\r\n\r\nexport interface ISsrPropertyEntry {\r\n propName: string;\r\n value: unknown;\r\n}\r\n\r\n// node → プロパティエントリのリスト\r\nconst store: WeakMap<Node, ISsrPropertyEntry[]> = new WeakMap();\r\n\r\nexport function addSsrProperty(node: Node, propName: string, value: unknown): void {\r\n let entries = store.get(node);\r\n if (!entries) {\r\n entries = [];\r\n store.set(node, entries);\r\n }\r\n // 同じプロパティの既存エントリは上書き\r\n const existing = entries.find(e => e.propName === propName);\r\n if (existing) {\r\n existing.value = value;\r\n } else {\r\n entries.push({ propName, value });\r\n }\r\n}\r\n\r\nexport function getSsrProperties(node: Node): ISsrPropertyEntry[] {\r\n return store.get(node) ?? [];\r\n}\r\n\r\nexport function getAllSsrPropertyNodes(): Node[] {\r\n // WeakMap は列挙不可なので、別途トラッキングが必要\r\n return Array.from(trackedNodes);\r\n}\r\n\r\nconst trackedNodes: Set<Node> = new Set();\r\n\r\nexport function trackSsrPropertyNode(node: Node): void {\r\n trackedNodes.add(node);\r\n}\r\n\r\nexport function clearSsrPropertyStore(): void {\r\n trackedNodes.clear();\r\n}\r\n","import { config, inSsr } from \"../config\";\r\nimport { IBindingInfo } from \"../types\";\r\nimport { IApplyContext } from \"./types\";\r\nimport { addSsrProperty, trackSsrPropertyNode } from \"./ssrPropertyStore\";\r\n\r\n// SSR 時に HTML 属性で代替可能なプロパティ\r\n// これら以外のプロパティは ssrPropertyStore に蓄積してハイドレーション時に復元\r\nconst SSR_ATTR_PROPS: Record<string, (element: Element, value: unknown) => void> = {\r\n value(element, value) {\r\n if (element.tagName === 'TEXTAREA') {\r\n element.textContent = String(value ?? '');\r\n } else {\r\n element.setAttribute('value', String(value ?? ''));\r\n }\r\n },\r\n checked(element, value) {\r\n if (value) element.setAttribute('checked', '');\r\n else element.removeAttribute('checked');\r\n },\r\n selected(element, value) {\r\n if (value) element.setAttribute('selected', '');\r\n else element.removeAttribute('selected');\r\n },\r\n disabled(element, value) {\r\n if (value) element.setAttribute('disabled', '');\r\n else element.removeAttribute('disabled');\r\n },\r\n selectedIndex(element, value) {\r\n const options = element.querySelectorAll('option');\r\n const idx = Number(value);\r\n for (let i = 0; i < options.length; i++) {\r\n if (i === idx) options[i].setAttribute('selected', '');\r\n else options[i].removeAttribute('selected');\r\n }\r\n },\r\n};\r\n\r\nexport function applyChangeToProperty(binding: IBindingInfo, _context: IApplyContext, newValue: unknown): void {\r\n const element = binding.node as Element;\r\n const propSegments = binding.propSegments;\r\n if (propSegments.length === 1) {\r\n const firstSegment = propSegments[0];\r\n if ((element as any)[firstSegment] !== newValue) {\r\n try {\r\n (element as any)[firstSegment] = newValue;\r\n } catch (error) {\r\n if (config.debug) {\r\n console.warn(`Failed to set property '${firstSegment}' on element.`, {\r\n element,\r\n newValue,\r\n error\r\n });\r\n }\r\n }\r\n }\r\n if (inSsr()) {\r\n const attrHandler = SSR_ATTR_PROPS[firstSegment];\r\n if (attrHandler) {\r\n // 属性で代替可能 → HTML 属性に反映\r\n attrHandler(element, newValue);\r\n } else {\r\n // 属性で代替不可 → ハイドレーション用ストアに蓄積\r\n addSsrProperty(element, firstSegment, newValue);\r\n trackSsrPropertyNode(element);\r\n }\r\n }\r\n return;\r\n }\r\n const firstSegment = propSegments[0];\r\n let subObject = (element as any)[firstSegment];\r\n for (let i = 1; i < propSegments.length - 1; i++) {\r\n const segment = propSegments[i];\r\n if (subObject == null) {\r\n return;\r\n }\r\n subObject = subObject[segment];\r\n }\r\n const oldValue = subObject[propSegments[propSegments.length - 1]];\r\n if (oldValue !== newValue) {\r\n if (Object.isFrozen(subObject)) {\r\n if (config.debug) {\r\n console.warn(`Attempting to set property on frozen object.`, {\r\n element,\r\n propSegments,\r\n oldValue,\r\n newValue\r\n });\r\n }\r\n return;\r\n }\r\n try {\r\n subObject[propSegments[propSegments.length - 1]] = newValue;\r\n } catch (error) {\r\n if (config.debug) {\r\n console.warn(`Failed to set property on sub-object.`, {\r\n element,\r\n propSegments,\r\n oldValue,\r\n newValue,\r\n error\r\n });\r\n }\r\n }\r\n }\r\n // サブオブジェクトプロパティ (e.g. style.xxx) は属性に反映済みなのでストア不要\r\n}\r\n","import { inSsr } from \"../config\";\r\nimport { IBindingInfo } from \"../binding/types\";\r\nimport { IApplyContext } from \"./types\";\r\n\r\nconst ssrWrappedNodes: WeakSet<Node> = new WeakSet();\r\n\r\nexport function applyChangeToText(binding: IBindingInfo, _context: IApplyContext, newValue: unknown): void {\r\n if (binding.replaceNode.nodeValue !== newValue) {\r\n binding.replaceNode.nodeValue = newValue as string;\r\n }\r\n // SSR モード時: テキストノードの前後にコメントを挿入して境界を明示\r\n if (inSsr() && !ssrWrappedNodes.has(binding.replaceNode)) {\r\n ssrWrappedNodes.add(binding.replaceNode);\r\n const parentNode = binding.replaceNode.parentNode;\r\n if (parentNode) {\r\n const path = binding.statePathName;\r\n const startComment = document.createComment(`@@wcs-text-start:${path}`);\r\n const endComment = document.createComment(`@@wcs-text-end:${path}`);\r\n parentNode.insertBefore(startComment, binding.replaceNode);\r\n parentNode.insertBefore(endComment, binding.replaceNode.nextSibling);\r\n }\r\n }\r\n}\r\n","import { raiseError } from \"../raiseError\";\r\nimport { IBindingInfo } from \"../types\";\r\nimport { IApplyContext } from \"./types\";\r\n\r\nexport function applyChangeToWebComponent(binding: IBindingInfo, _context: IApplyContext, newValue: unknown): void {\r\n const element = binding.node as Element;\r\n const propSegments = binding.propSegments;\r\n if (propSegments.length <= 1) {\r\n raiseError(`Invalid propSegments for web component binding: ${propSegments.join(\".\")}`);\r\n }\r\n const [ firstSegment, ...restSegments ] = propSegments;\r\n const subObject = (element as any)[firstSegment] as Record<string, unknown> | undefined;\r\n if (typeof subObject === \"undefined\") {\r\n raiseError(`Property \"${firstSegment}\" not found on web component.`);\r\n }\r\n subObject[restSegments.join(\".\")] = newValue;\r\n}\r\n","import { getStateAddressByBindingInfo } from \"../binding/getStateAddressByBindingInfo\";\r\nimport { IBindingInfo } from \"../binding/types\";\r\nimport { INDEX_BY_INDEX_NAME } from \"../define\";\r\nimport { getIndexValueByLoopContext } from \"../list/getIndexValueByLoopContext\";\r\nimport { getLoopContextByNode } from \"../list/loopContextByNode\";\r\nimport { getByAddressSymbol } from \"../proxy/symbols\";\r\nimport { IStateProxy } from \"../proxy/types\";\r\nimport { raiseError } from \"../raiseError\";\r\n\r\nexport function getValue(state: IStateProxy, binding: IBindingInfo): any {\r\n const stateAddress = getStateAddressByBindingInfo(binding);\r\n if (stateAddress.pathInfo.path in INDEX_BY_INDEX_NAME) {\r\n const loopContext = getLoopContextByNode(binding.node);\r\n if (loopContext === null) {\r\n raiseError(`ListIndex not found for binding: ${binding.statePathName}`);\r\n }\r\n return getIndexValueByLoopContext(loopContext, stateAddress.pathInfo.path);\r\n } else {\r\n return state[getByAddressSymbol](stateAddress);\r\n }\r\n}\r\n","import { INDEX_BY_INDEX_NAME } from \"../define\";\r\nimport { raiseError } from \"../raiseError\";\r\nimport { ILoopContext } from \"./types\";\r\n\r\n// indexName ... $1, $2, ...\r\nexport function getIndexValueByLoopContext(loopContext: ILoopContext, indexName: string): number | null {\r\n if (loopContext.listIndex === null) {\r\n raiseError(`ListIndex not found for loopContext:`);\r\n }\r\n const indexPos = INDEX_BY_INDEX_NAME[indexName];\r\n if (typeof indexPos === \"undefined\") {\r\n raiseError(`Invalid index name: ${indexName}`);\r\n }\r\n const listIndex = loopContext.listIndex.at(indexPos);\r\n if (listIndex === null) {\r\n raiseError(`Index not found at position ${indexPos} for loopContext:`);\r\n }\r\n return listIndex.index;\r\n}","import { getAbsoluteStateAddressByBinding } from \"../binding/getAbsoluteStateAddressByBinding.js\";\r\nimport { getCustomElement } from \"../getCustomElement.js\";\r\nimport { raiseError } from \"../raiseError.js\";\r\nimport { getStateElementByName } from \"../stateElementByName.js\";\r\nimport { IBindingInfo } from \"../types.js\";\r\nimport { isWebComponentComplete } from \"../webComponent/completeWebComponent.js\";\r\nimport { applyChangeToAttribute } from \"./applyChangeToAttribute.js\";\r\nimport { applyChangeToCheckbox } from \"./applyChangeToCheckbox.js\";\r\nimport { applyChangeToClass } from \"./applyChangeToClass.js\";\r\nimport { applyChangeToFor } from \"./applyChangeToFor.js\";\r\nimport { applyChangeToIf } from \"./applyChangeToIf.js\";\r\nimport { applyChangeToProperty } from \"./applyChangeToProperty.js\";\r\nimport { applyChangeToRadio } from \"./applyChangeToRadio.js\";\r\nimport { applyChangeToStyle } from \"./applyChangeToStyle.js\";\r\nimport { applyChangeToText } from \"./applyChangeToText.js\";\r\nimport { applyChangeToWebComponent } from \"./applyChangeToWebComponent.js\";\r\nimport { getFilteredValue } from \"./getFilteredValue.js\";\r\nimport { getValue } from \"./getValue.js\";\r\nimport { getRootNodeByFragment } from \"./rootNodeByFragment.js\";\r\nimport { ApplyChangeFn, IApplyContext } from \"./types.js\";\r\n\r\nconst applyChangeByFirstSegment: { [key: string]: ApplyChangeFn } = {\r\n \"class\": applyChangeToClass,\r\n \"attr\": applyChangeToAttribute,\r\n \"style\": applyChangeToStyle,\r\n};\r\n\r\nconst applyChangeByBindingType: { [key: string]: ApplyChangeFn } = {\r\n \"text\": applyChangeToText,\r\n \"for\": applyChangeToFor,\r\n \"if\": applyChangeToIf,\r\n \"else\": applyChangeToIf,\r\n \"elseif\": applyChangeToIf,\r\n \"radio\": applyChangeToRadio,\r\n \"checkbox\": applyChangeToCheckbox,\r\n};\r\n\r\nconst fnByBinding: WeakMap<IBindingInfo, ApplyChangeFn> = new WeakMap();\r\nconst deferredSelectBindingByBinding: WeakMap<IBindingInfo, boolean> = new WeakMap();\r\n\r\nfunction _applyChange(binding: IBindingInfo, context: IApplyContext): void {\r\n const value = getValue(context.state, binding);\r\n const filteredValue = getFilteredValue(value, binding.outFilters);\r\n\r\n if (deferredSelectBindingByBinding.get(binding) === true) {\r\n context.deferredSelectBindings.push({ binding, value: filteredValue });\r\n return;\r\n }\r\n let fn = fnByBinding.get(binding);\r\n if (typeof fn !== 'undefined') {\r\n fn(binding, context, filteredValue);\r\n return;\r\n }\r\n if (fnByBinding.has(binding)) {\r\n if (isWebComponentComplete(binding.replaceNode as Element, context.stateElement)) {\r\n fn = applyChangeToWebComponent;\r\n fnByBinding.set(binding, fn); // 確定したのでキャッシュ\r\n } else {\r\n fn = applyChangeToProperty;\r\n }\r\n fn(binding, context, filteredValue);\r\n return;\r\n }\r\n\r\n fn = applyChangeByBindingType[binding.bindingType];\r\n if (typeof fn === 'undefined') {\r\n const firstSegment = binding.propSegments[0];\r\n fn = applyChangeByFirstSegment[firstSegment];\r\n fnByBinding.set(binding, fn);\r\n if (typeof fn === 'undefined') {\r\n const customTag = getCustomElement(binding.replaceNode);\r\n if (customTag) {\r\n if (isWebComponentComplete(binding.replaceNode as Element, context.stateElement)) {\r\n fn = applyChangeToWebComponent;\r\n fnByBinding.set(binding, fn); // 確定したのでキャッシュ\r\n } else {\r\n fn = applyChangeToProperty;\r\n }\r\n } else {\r\n fn = applyChangeToProperty;\r\n fnByBinding.set(binding, fn);\r\n }\r\n }\r\n }\r\n if (fn === applyChangeToProperty) {\r\n const element = binding.node as Element;\r\n if (element.tagName === 'SELECT') {\r\n const propName = binding.propSegments[0];\r\n if (propName === 'value' || propName === 'selectedIndex') {\r\n context.deferredSelectBindings.push({ binding, value: filteredValue });\r\n deferredSelectBindingByBinding.set(binding, true);\r\n return;\r\n }\r\n }\r\n }\r\n fn(binding, context, filteredValue);\r\n}\r\n\r\nexport function applyChange(binding: IBindingInfo, context: IApplyContext): void {\r\n if (context.appliedBindingSet.has(binding)) {\r\n return;\r\n }\r\n context.appliedBindingSet.add(binding);\r\n const absAddress = getAbsoluteStateAddressByBinding(binding);\r\n if (context.updatedAbsAddressSetByStateElement.has(context.stateElement)) {\r\n const addressSet = context.updatedAbsAddressSetByStateElement.get(context.stateElement)!;\r\n addressSet.add(absAddress);\r\n } else {\r\n context.updatedAbsAddressSetByStateElement.set(context.stateElement, new Set([\r\n absAddress\r\n ]));\r\n }\r\n if (binding.bindingType === \"event\") {\r\n return;\r\n }\r\n const customTag = getCustomElement(binding.replaceNode);\r\n if (customTag) {\r\n if (customElements.get(customTag) === undefined) {\r\n // cutomElement側の初期化を期待\r\n return;\r\n }\r\n }\r\n let rootNode: Node | null = binding.replaceNode.getRootNode() as Node;\r\n if (rootNode instanceof DocumentFragment && !(rootNode instanceof ShadowRoot)) {\r\n rootNode = getRootNodeByFragment(rootNode);\r\n if (rootNode === null) {\r\n raiseError(`Root node for fragment not found for binding.`);\r\n }\r\n }\r\n if (binding.stateName !== context.stateName || rootNode !== context.rootNode) {\r\n const stateElement = getStateElementByName(rootNode, binding.stateName);\r\n if (stateElement === null) {\r\n raiseError(`State element with name \"${binding.stateName}\" not found for binding.`);\r\n }\r\n stateElement.createState(\"readonly\", (targetState) => {\r\n const newContext = {\r\n stateName: binding.stateName,\r\n rootNode: rootNode,\r\n stateElement: stateElement,\r\n state: targetState,\r\n appliedBindingSet: context.appliedBindingSet,\r\n newListValueByAbsAddress: context.newListValueByAbsAddress,\r\n updatedAbsAddressSetByStateElement: context.updatedAbsAddressSetByStateElement,\r\n deferredSelectBindings: context.deferredSelectBindings,\r\n }\r\n _applyChange(binding, newContext);\r\n });\r\n } else {\r\n _applyChange(binding, context);\r\n }\r\n}\r\n","import { raiseError } from \"../raiseError\";\r\nimport { IBindingInfo } from \"../types\";\r\nimport { IApplyContext } from \"./types\";\r\n\r\nexport function applyChangeToClass(binding: IBindingInfo, _context: IApplyContext, newValue: unknown): void {\r\n const element = binding.node as Element;\r\n const className = binding.propSegments[1];\r\n if (typeof newValue !== 'boolean') {\r\n raiseError(`Invalid value for class application: expected boolean, got ${typeof newValue}`);\r\n }\r\n element.classList.toggle(className, newValue as boolean);\r\n}","import { IBindingInfo } from \"../types\";\r\nimport { IApplyContext } from \"./types\";\r\n\r\nexport function applyChangeToAttribute(binding: IBindingInfo, _context: IApplyContext, newValue: unknown): void {\r\n const element = binding.node as Element;\r\n const attrName = binding.propSegments[1];\r\n if (element.getAttribute(attrName) !== newValue) {\r\n element.setAttribute(attrName, newValue as string);\r\n }\r\n}\r\n","import { IBindingInfo } from \"../types\";\r\nimport { IApplyContext } from \"./types\";\r\n\r\nexport function applyChangeToStyle(binding: IBindingInfo, _context: IApplyContext, newValue: unknown): void {\r\n const styleName = binding.propSegments[1];\r\n const style = (binding.node as HTMLElement).style;\r\n const currentValue = (style as any)[styleName];\r\n if (currentValue !== newValue) {\r\n (style as any)[styleName] = newValue;\r\n }\r\n}\r\n","import { IBindingInfo } from \"../types\";\r\nimport { getFilteredValue } from \"./getFilteredValue\";\r\nimport { IApplyContext } from \"./types\";\r\n\r\nexport function applyChangeToRadio(binding: IBindingInfo, _context: IApplyContext, newValue: unknown): void {\r\n const element = binding.node as HTMLInputElement;\r\n const elementValue = element.value;\r\n const elementFilteredValue = getFilteredValue(elementValue, binding.inFilters);\r\n element.checked = newValue === elementFilteredValue;\r\n}\r\n","import { IAbsoluteStateAddress } from \"../address/types\";\r\nimport { IStateElement } from \"../components/types\";\r\nimport { config } from \"../config\";\r\nimport { setLastListValueByAbsoluteStateAddress } from \"../list/lastListValueByAbsoluteStateAddress\";\r\nimport { updatedCallbackSymbol } from \"../proxy/symbols\";\r\nimport { raiseError } from \"../raiseError\";\r\nimport { getStateElementByName } from \"../stateElementByName\";\r\nimport { IBindingInfo } from \"../types\";\r\nimport { applyChange } from \"./applyChange\";\r\nimport { applyChangeToProperty } from \"./applyChangeToProperty\";\r\nimport { getRootNodeByFragment } from \"./rootNodeByFragment\";\r\nimport { IApplyContext, IDeferredSelectBinding } from \"./types\";\r\n\r\n/**\r\n * バインディング情報の配列を処理し、各バインディングに対して状態の変更を適用する。\r\n *\r\n * 2フェーズで処理:\r\n * Phase 1: 構造的更新(for/if) + 値更新(select以外) — select.value/selectedIndex は遅延収集\r\n * Phase 2: 遅延されたselect.value/selectedIndex を適用(option要素の生成後)\r\n *\r\n * 最適化のため、以下のグループ化を行う:\r\n * 同じ stateNameとrootNode を持つバインディングをグループ化 → createState の呼び出しを削減\r\n */\r\nexport function applyChangeFromBindings(bindings: IBindingInfo[]): void {\r\n let bindingIndex = 0;\r\n const appliedBindingSet: Set<IBindingInfo> = new Set();\r\n const newListValueByAbsAddress: Map<IAbsoluteStateAddress, readonly unknown[]> = new Map();\r\n const updatedAbsAddressSetByStateElement: Map<IStateElement, Set<IAbsoluteStateAddress>> = new Map();\r\n const deferredSelectBindings: IDeferredSelectBinding[] = [];\r\n\r\n // Phase 1: 構造的更新 + 値更新(select.value/selectedIndex は遅延)\r\n while(bindingIndex < bindings.length) {\r\n let binding = bindings[bindingIndex];\r\n const stateName = binding.stateName;\r\n if (binding.replaceNode.isConnected === false) {\r\n // 切断されているバインディングは無視、本来は事前に除去されているはず\r\n if (config.debug) {\r\n console.log(`applyChangeFromBindings: skip disconnected binding: ${binding.bindingType} ${binding.statePathName} on ${binding.node.nodeName}`, binding);\r\n }\r\n bindingIndex++;\r\n continue;\r\n }\r\n let rootNode: Node | null = binding.replaceNode.getRootNode() as Node;\r\n if (rootNode instanceof DocumentFragment && !(rootNode instanceof ShadowRoot)) {\r\n rootNode = getRootNodeByFragment(rootNode);\r\n if (rootNode === null) {\r\n raiseError(`Root node for fragment not found for binding.`);\r\n }\r\n }\r\n const stateElement = getStateElementByName(rootNode, stateName);\r\n if (stateElement === null) {\r\n raiseError(`State element with name \"${stateName}\" not found for binding.`);\r\n }\r\n\r\n stateElement.createState(\"readonly\", (state) => {\r\n const context: IApplyContext = {\r\n rootNode: rootNode,\r\n stateName: stateName,\r\n stateElement: stateElement,\r\n state: state,\r\n appliedBindingSet: appliedBindingSet,\r\n newListValueByAbsAddress: newListValueByAbsAddress,\r\n updatedAbsAddressSetByStateElement: updatedAbsAddressSetByStateElement,\r\n deferredSelectBindings: deferredSelectBindings,\r\n };\r\n\r\n do {\r\n applyChange(binding, context);\r\n bindingIndex++;\r\n\r\n const nextBindingInfo: IBindingInfo | undefined = bindings[bindingIndex];\r\n if (!nextBindingInfo) break; // 終端に到達\r\n const nextRootNode = nextBindingInfo.replaceNode.getRootNode() as Node;\r\n if (nextBindingInfo.stateName !== stateName || nextRootNode !== context.rootNode) break; // stateName が変わった\r\n binding = nextBindingInfo;\r\n } while(true); // eslint-disable-line no-constant-condition\r\n });\r\n }\r\n // Phase 2: 遅延されたselect.value/selectedIndex を適用\r\n // applyChangeToProperty は context を参照しないため null を渡す\r\n for (const { binding, value } of deferredSelectBindings) {\r\n applyChangeToProperty(binding, null as unknown as IApplyContext, value);\r\n }\r\n\r\n for(const [ absAddress, newListValue ] of newListValueByAbsAddress.entries()) {\r\n setLastListValueByAbsoluteStateAddress(absAddress, newListValue);\r\n }\r\n for(const [ stateElement, absAddressSet ] of updatedAbsAddressSetByStateElement.entries()) {\r\n stateElement.createState(\"writable\", (state) => {\r\n state[updatedCallbackSymbol](Array.from(absAddressSet));\r\n });\r\n }\r\n}\r\n","import { getLoopContextByNode } from \"../list/loopContextByNode\";\r\nimport { raiseError } from \"../raiseError\";\r\nimport { getStateElementByName } from \"../stateElementByName\";\r\nimport { IBindingInfo, IFilterInfo } from \"../types\";\r\nimport { setLoopContextSymbol } from \"../proxy/symbols\";\r\n\r\nconst handlerByHandlerKey: Map<string, (event: Event) => any> = new Map();\r\nconst bindingSetByHandlerKey: Map<string, Set<IBindingInfo>> = new Map();\r\n\r\nfunction getHandlerKey(binding: IBindingInfo, eventName: string): string {\r\n const filterKey = binding.inFilters.map(f => f.filterName + '(' + f.args.join(',') + ')').join('|');\r\n return `${binding.stateName}::${binding.statePathName}::${eventName}::${filterKey}`;\r\n}\r\n\r\nfunction getEventName(binding: IBindingInfo): string {\r\n let eventName = 'input';\r\n for(const modifier of binding.propModifiers) {\r\n if (modifier.startsWith('on')) {\r\n eventName = modifier.slice(2);\r\n }\r\n }\r\n return eventName;\r\n}\r\n\r\nconst radioEventHandlerFunction = (\r\n stateName: string,\r\n statePathName: string,\r\n inFilters: IFilterInfo[],\r\n) => (event: Event): any => {\r\n const node = event.target as HTMLInputElement;\r\n if (node === null) {\r\n console.warn(`[@wcstack/state] event.target is null.`);\r\n return;\r\n }\r\n if (node.type !== 'radio') {\r\n console.warn(`[@wcstack/state] event.target is not a radio input element.`);\r\n return;\r\n }\r\n if (node.checked === false) {\r\n return;\r\n }\r\n const newValue = node.value;\r\n let filteredNewValue: unknown = newValue;\r\n for(const filter of inFilters) {\r\n filteredNewValue = filter.filterFn(filteredNewValue);\r\n }\r\n\r\n const rootNode = node.getRootNode() as Node;\r\n const stateElement = getStateElementByName(rootNode, stateName);\r\n if (stateElement === null) {\r\n raiseError(`State element with name \"${stateName}\" not found for two-way binding.`);\r\n }\r\n\r\n const loopContext = getLoopContextByNode(node);\r\n stateElement.createState(\"writable\", (state) => {\r\n state[setLoopContextSymbol](loopContext, () => {\r\n state[statePathName] = filteredNewValue;\r\n });\r\n });\r\n}\r\n\r\nexport function attachRadioEventHandler(binding: IBindingInfo): boolean {\r\n if (binding.bindingType === \"radio\" && binding.propModifiers.indexOf('ro') === -1) {\r\n const eventName = getEventName(binding);\r\n const key = getHandlerKey(binding, eventName);\r\n let radioEventHandler = handlerByHandlerKey.get(key);\r\n if (typeof radioEventHandler === \"undefined\") {\r\n radioEventHandler = radioEventHandlerFunction(\r\n binding.stateName,\r\n binding.statePathName,\r\n binding.inFilters\r\n );\r\n handlerByHandlerKey.set(key, radioEventHandler);\r\n }\r\n (binding.node as Element).addEventListener(eventName, radioEventHandler);\r\n let bindingSet = bindingSetByHandlerKey.get(key);\r\n if (typeof bindingSet === \"undefined\") {\r\n bindingSet = new Set<IBindingInfo>([binding]);\r\n bindingSetByHandlerKey.set(key, bindingSet);\r\n } else {\r\n bindingSet.add(binding);\r\n }\r\n return true;\r\n }\r\n return false;\r\n}\r\n\r\nexport function detachRadioEventHandler(binding: IBindingInfo): boolean {\r\n if (binding.bindingType === \"radio\" && binding.propModifiers.indexOf('ro') === -1) {\r\n const eventName = getEventName(binding);\r\n const key = getHandlerKey(binding, eventName);\r\n const radioEventHandler = handlerByHandlerKey.get(key);\r\n if (typeof radioEventHandler === \"undefined\") {\r\n return false;\r\n }\r\n (binding.node as Element).removeEventListener(eventName, radioEventHandler);\r\n\r\n const bindingSet = bindingSetByHandlerKey.get(key);\r\n if (typeof bindingSet === \"undefined\") {\r\n return false;\r\n }\r\n bindingSet.delete(binding);\r\n if (bindingSet.size === 0) {\r\n handlerByHandlerKey.delete(key);\r\n bindingSetByHandlerKey.delete(key);\r\n }\r\n return true;\r\n }\r\n return false;\r\n}\r\n\r\nexport const __private__ = {\r\n handlerByHandlerKey,\r\n bindingSetByHandlerKey,\r\n getHandlerKey,\r\n getEventName,\r\n radioEventHandlerFunction,\r\n};\r\n","import { getLoopContextByNode } from \"../list/loopContextByNode\";\r\nimport { raiseError } from \"../raiseError\";\r\nimport { getStateElementByName } from \"../stateElementByName\";\r\nimport { IBindingInfo, IFilterInfo } from \"../types\";\r\nimport { setLoopContextSymbol } from \"../proxy/symbols\";\r\n\r\nconst handlerByHandlerKey: Map<string, (event: Event) => any> = new Map();\r\nconst bindingSetByHandlerKey: Map<string, Set<IBindingInfo>> = new Map();\r\n\r\nfunction getHandlerKey(binding: IBindingInfo, eventName: string): string {\r\n const filterKey = binding.inFilters.map(f => f.filterName + '(' + f.args.join(',') + ')').join('|');\r\n return `${binding.stateName}::${binding.statePathName}::${eventName}::${filterKey}`;\r\n}\r\n\r\nfunction getEventName(binding: IBindingInfo): string {\r\n let eventName = 'input';\r\n for(const modifier of binding.propModifiers) {\r\n if (modifier.startsWith('on')) {\r\n eventName = modifier.slice(2);\r\n }\r\n }\r\n return eventName;\r\n}\r\n\r\nconst checkboxEventHandlerFunction = (\r\n stateName: string,\r\n statePathName: string,\r\n inFilters: IFilterInfo[],\r\n) => (event: Event): any => {\r\n const node = event.target as HTMLInputElement;\r\n if (node === null) {\r\n console.warn(`[@wcstack/state] event.target is null.`);\r\n return;\r\n }\r\n if (node.type !== 'checkbox') {\r\n console.warn(`[@wcstack/state] event.target is not a checkbox input element.`);\r\n return;\r\n }\r\n const checked = node.checked;\r\n const newValue = node.value;\r\n let filteredNewValue: unknown = newValue;\r\n for(const filter of inFilters) {\r\n filteredNewValue = filter.filterFn(filteredNewValue);\r\n }\r\n\r\n const rootNode = node.getRootNode() as Node;\r\n const stateElement = getStateElementByName(rootNode, stateName);\r\n if (stateElement === null) {\r\n raiseError(`State element with name \"${stateName}\" not found for two-way binding.`);\r\n }\r\n\r\n const loopContext = getLoopContextByNode(node);\r\n stateElement.createState(\"writable\", (state) => {\r\n state[setLoopContextSymbol](loopContext, () => {\r\n let currentValue = state[statePathName];\r\n if (Array.isArray(currentValue)) {\r\n if (checked) {\r\n if (currentValue.indexOf(filteredNewValue) === -1) {\r\n state[statePathName] = currentValue.concat(filteredNewValue);\r\n }\r\n } else {\r\n const index = currentValue.indexOf(filteredNewValue);\r\n if (index !== -1) {\r\n state[statePathName] = currentValue.toSpliced(index, 1);\r\n }\r\n }\r\n } else {\r\n if (checked) {\r\n state[statePathName] = [filteredNewValue];\r\n } else {\r\n state[statePathName] = [];\r\n }\r\n }\r\n });\r\n });\r\n}\r\n\r\nexport function attachCheckboxEventHandler(binding: IBindingInfo): boolean {\r\n if (binding.bindingType === \"checkbox\" && binding.propModifiers.indexOf('ro') === -1) {\r\n const eventName = getEventName(binding);\r\n const key = getHandlerKey(binding, eventName);\r\n let checkboxEventHandler = handlerByHandlerKey.get(key);\r\n if (typeof checkboxEventHandler === \"undefined\") {\r\n checkboxEventHandler = checkboxEventHandlerFunction(\r\n binding.stateName,\r\n binding.statePathName,\r\n binding.inFilters\r\n );\r\n handlerByHandlerKey.set(key, checkboxEventHandler);\r\n }\r\n (binding.node as Element).addEventListener(eventName, checkboxEventHandler);\r\n let bindingSet = bindingSetByHandlerKey.get(key);\r\n if (typeof bindingSet === \"undefined\") {\r\n bindingSet = new Set<IBindingInfo>([binding]);\r\n bindingSetByHandlerKey.set(key, bindingSet);\r\n } else {\r\n bindingSet.add(binding);\r\n }\r\n return true;\r\n }\r\n return false;\r\n}\r\n\r\nexport function detachCheckboxEventHandler(binding: IBindingInfo): boolean {\r\n if (binding.bindingType === \"checkbox\" && binding.propModifiers.indexOf('ro') === -1) {\r\n const eventName = getEventName(binding);\r\n const key = getHandlerKey(binding, eventName);\r\n const checkboxEventHandler = handlerByHandlerKey.get(key);\r\n if (typeof checkboxEventHandler === \"undefined\") {\r\n return false;\r\n }\r\n (binding.node as Element).removeEventListener(eventName, checkboxEventHandler);\r\n\r\n const bindingSet = bindingSetByHandlerKey.get(key);\r\n if (typeof bindingSet === \"undefined\") {\r\n return false;\r\n }\r\n bindingSet.delete(binding);\r\n if (bindingSet.size === 0) {\r\n handlerByHandlerKey.delete(key);\r\n bindingSetByHandlerKey.delete(key);\r\n }\r\n return true;\r\n }\r\n return false;\r\n}\r\n\r\nexport const __private__ = {\r\n handlerByHandlerKey,\r\n bindingSetByHandlerKey,\r\n getHandlerKey,\r\n getEventName,\r\n checkboxEventHandlerFunction,\r\n};\r\n","import { config } from \"../config.js\";\r\nimport { SVG_NAMESPACE } from \"../define.js\";\r\n\r\nconst MUSTACHE_REGEX = /\\{\\{\\s*(.+?)\\s*\\}\\}/g;\r\nconst SKIP_TAGS = new Set([\"SCRIPT\", \"STYLE\"]);\r\n\r\nexport function convertMustacheToComments(root: Document | Element | DocumentFragment): void {\r\n if (!config.enableMustache) {\r\n return;\r\n }\r\n\r\n convertTextNodes(root);\r\n\r\n const templates = Array.from(root.querySelectorAll(\"template\"));\r\n\r\n for (const template of templates) {\r\n if (template.namespaceURI === SVG_NAMESPACE) {\r\n const newTemplate = document.createElement(\"template\");\r\n const childNodes = Array.from(template.childNodes);\r\n for(let i = 0; i < childNodes.length; i++) {\r\n const childNode = childNodes[i];\r\n newTemplate.content.appendChild(childNode);\r\n }\r\n for(const attr of template.attributes) {\r\n newTemplate.setAttribute(attr.name, attr.value);\r\n }\r\n template.replaceWith(newTemplate);\r\n convertMustacheToComments(newTemplate.content);\r\n } else {\r\n convertMustacheToComments(template.content);\r\n }\r\n }\r\n}\r\n\r\nfunction convertTextNodes(root: Document | Element | DocumentFragment): void {\r\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT);\r\n const textNodes: Text[] = [];\r\n\r\n while (walker.nextNode()) {\r\n textNodes.push(walker.currentNode as Text);\r\n }\r\n\r\n for (const textNode of textNodes) {\r\n if (textNode.parentElement && SKIP_TAGS.has(textNode.parentElement.tagName)) {\r\n continue;\r\n }\r\n replaceTextNode(textNode);\r\n }\r\n}\r\n\r\nfunction replaceTextNode(textNode: Text): void {\r\n const text = textNode.data;\r\n MUSTACHE_REGEX.lastIndex = 0;\r\n\r\n if (!MUSTACHE_REGEX.test(text)) {\r\n return;\r\n }\r\n\r\n MUSTACHE_REGEX.lastIndex = 0;\r\n const fragment = document.createDocumentFragment();\r\n let lastIndex = 0;\r\n let match: RegExpExecArray | null;\r\n\r\n while ((match = MUSTACHE_REGEX.exec(text)) !== null) {\r\n if (match.index > lastIndex) {\r\n fragment.appendChild(document.createTextNode(text.slice(lastIndex, match.index)));\r\n }\r\n\r\n const bindText = match[1];\r\n fragment.appendChild(document.createComment(`@@: ${bindText}`));\r\n\r\n lastIndex = match.index + match[0].length;\r\n }\r\n\r\n if (lastIndex < text.length) {\r\n fragment.appendChild(document.createTextNode(text.slice(lastIndex)));\r\n }\r\n\r\n textNode.parentNode!.replaceChild(fragment, textNode);\r\n}\r\n","import { builtinFilterFn, outputBuiltinFilters } from \"../filters/builtinFilters\";\r\nimport { IFilterInfo } from \"../types\";\r\n\r\nlet _notFilterInfo: IFilterInfo | undefined = undefined;\r\n\r\nexport function createNotFilter(): IFilterInfo {\r\n if (_notFilterInfo) {\r\n return _notFilterInfo;\r\n }\r\n const filterName = \"not\"\r\n const args: string[] = [];\r\n const filterFn = builtinFilterFn(filterName, args)(outputBuiltinFilters);\r\n _notFilterInfo = {\r\n filterName,\r\n args,\r\n filterFn,\r\n }\r\n return _notFilterInfo;\r\n}\r\n","import { config } from \"../config.js\";\r\nimport { DELIMITER, WILDCARD } from \"../define.js\";\r\n\r\nconst COMMENT_REGEX = /^(\\s*@@\\s*(?:.*?)\\s*:\\s*)(.+?)(\\s*)$/;\r\n\r\nfunction expandShorthandInStatePart(statePart: string, forPath: string): string {\r\n const prefix = forPath + DELIMITER + WILDCARD;\r\n const pipeIndex = statePart.indexOf('|');\r\n const atIndex = statePart.indexOf('@');\r\n let pathPart: string;\r\n let suffix: string;\r\n if (pipeIndex !== -1) {\r\n pathPart = statePart.slice(0, pipeIndex).trim();\r\n suffix = statePart.slice(pipeIndex);\r\n } else if (atIndex !== -1) {\r\n pathPart = statePart.slice(0, atIndex).trim();\r\n suffix = statePart.slice(atIndex);\r\n } else {\r\n pathPart = statePart.trim();\r\n suffix = '';\r\n }\r\n if (pathPart === '.') {\r\n pathPart = prefix;\r\n } else if (pathPart.startsWith('.')) {\r\n pathPart = prefix + DELIMITER + pathPart.slice(1);\r\n } else {\r\n return statePart;\r\n }\r\n if (suffix.length > 0) {\r\n return pathPart + suffix;\r\n }\r\n return pathPart;\r\n}\r\n\r\nfunction expandCommentData(data: string, forPath: string): string {\r\n const match = COMMENT_REGEX.exec(data);\r\n if (match === null) {\r\n return data;\r\n }\r\n const commentPrefix = match[1];\r\n const bindText = match[2];\r\n const commentSuffix = match[3];\r\n const expanded = expandShorthandInStatePart(bindText, forPath);\r\n return commentPrefix + expanded + commentSuffix;\r\n}\r\n\r\nfunction expandBindAttribute(attrValue: string, forPath: string): string {\r\n const parts = attrValue.split(';');\r\n let changed = false;\r\n const result = parts.map(part => {\r\n const trimmed = part.trim();\r\n if (trimmed.length === 0) return part;\r\n const colonIndex = trimmed.indexOf(':');\r\n if (colonIndex === -1) return part;\r\n const propPart = trimmed.slice(0, colonIndex).trim();\r\n const statePart = trimmed.slice(colonIndex + 1).trim();\r\n const expanded = expandShorthandInStatePart(statePart, forPath);\r\n if (expanded !== statePart) {\r\n changed = true;\r\n return `${propPart}: ${expanded}`;\r\n }\r\n return part;\r\n });\r\n if (!changed) return attrValue;\r\n return result.join(';');\r\n}\r\n\r\nexport function expandShorthandInBindAttribute(attrValue: string, forPath: string): string {\r\n return expandBindAttribute(attrValue, forPath);\r\n}\r\n\r\nexport function expandShorthandPaths(root: DocumentFragment, forPath: string): void {\r\n const bindAttr = config.bindAttributeName;\r\n const walker = document.createTreeWalker(\r\n root,\r\n NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_ELEMENT,\r\n );\r\n\r\n while (walker.nextNode()) {\r\n const node = walker.currentNode;\r\n if (node.nodeType === Node.COMMENT_NODE) {\r\n const comment = node as Comment;\r\n comment.data = expandCommentData(comment.data, forPath);\r\n continue;\r\n }\r\n const element = node as Element;\r\n if (element instanceof HTMLTemplateElement) {\r\n continue;\r\n }\r\n const attr = element.getAttribute(bindAttr);\r\n if (attr !== null) {\r\n const expanded = expandBindAttribute(attr, forPath);\r\n if (expanded !== attr) {\r\n element.setAttribute(bindAttr, expanded);\r\n }\r\n }\r\n }\r\n}\r\n","\r\nexport function getNodePath(node: Node): number[] {\r\n let currentNode: Node | null = node;\r\n const path: number[] = [];\r\n while(currentNode.parentNode !== null) {\r\n const nodes: Node[] = Array.from(currentNode.parentNode.childNodes);\r\n const index = nodes.indexOf(currentNode);\r\n path.unshift(index);\r\n currentNode = currentNode.parentNode;\r\n }\r\n return path;\r\n}\r\n","import { getParseBindTextResults } from \"../bindings/getParseBindTextResults\";\r\nimport { getSubscriberNodes } from \"../bindings/getSubscriberNodes\";\r\nimport { getNodePath } from \"./getNodePath\";\r\nimport { IFragmentNodeInfo } from \"./types\";\r\n\r\nexport function getFragmentNodeInfos(fragment: DocumentFragment): IFragmentNodeInfo[] {\r\n const fragmnentNodeInfos: IFragmentNodeInfo[] = [];\r\n const subscriberNodes = getSubscriberNodes(fragment);\r\n for(const subscriberNode of subscriberNodes) {\r\n const parseBindingTextResults = getParseBindTextResults(subscriberNode);\r\n fragmnentNodeInfos.push({\r\n nodePath: getNodePath(subscriberNode),\r\n parseBindTextResults: parseBindingTextResults,\r\n });\r\n }\r\n return fragmnentNodeInfos;\r\n}","\r\nexport function optimizeFragment(fragment: DocumentFragment): void {\r\n const childNodes = Array.from(fragment.childNodes);\r\n for(const childNode of childNodes) {\r\n if (childNode.nodeType === Node.TEXT_NODE) {\r\n const textContent = childNode.textContent || '';\r\n if (textContent.trim() === '') {\r\n // Remove empty text nodes\r\n fragment.removeChild(childNode);\r\n }\r\n }\r\n }\r\n}\r\n","import { getParseBindTextResults } from \"../bindings/getParseBindTextResults\";\r\nimport { parseBindTextsForElement } from \"../bindTextParser/parseBindTextsForElement\";\r\nimport { ParseBindTextResult } from \"../bindTextParser/types\";\r\nimport { config } from \"../config\";\r\nimport { getUUID } from \"../getUUID\";\r\nimport { raiseError } from \"../raiseError\";\r\nimport { BindingType } from \"../types\";\r\nimport { createNotFilter } from \"./createNotFilter\";\r\nimport { expandShorthandInBindAttribute, expandShorthandPaths } from \"./expandShorthandPaths\";\r\nimport { setFragmentInfoByUUID } from \"./fragmentInfoByUUID\";\r\nimport { getFragmentNodeInfos } from \"./getFragmentNodeInfos\";\r\nimport { getNodePath } from \"./getNodePath\";\r\nimport { optimizeFragment } from \"./optimizeFragment\";\r\nimport { IFragmentInfo } from \"./types\";\r\n\r\nconst keywordByBindingType: Map<BindingType, string> = new Map<BindingType, string>([\r\n [\"for\", config.commentForPrefix],\r\n [\"if\", config.commentIfPrefix],\r\n [\"elseif\", config.commentElseIfPrefix],\r\n [\"else\", config.commentElsePrefix],\r\n]);\r\n\r\nconst notFilter = createNotFilter();\r\n\r\nfunction cloneNotParseBindTextResult(\r\n bindingType: BindingType,\r\n parseBindTextResult: ParseBindTextResult\r\n): ParseBindTextResult {\r\n const filters = parseBindTextResult.outFilters;\r\n return {\r\n ...parseBindTextResult,\r\n outFilters: [...filters, notFilter],\r\n bindingType: bindingType,\r\n };\r\n}\r\n\r\nfunction _getFragmentInfo(\r\n rootNode: Node,\r\n fragment: DocumentFragment,\r\n parseBindingTextResult: ParseBindTextResult,\r\n forPath?: string\r\n): IFragmentInfo {\r\n optimizeFragment(fragment);\r\n if (typeof forPath === \"string\") {\r\n expandShorthandPaths(fragment, forPath);\r\n }\r\n collectStructuralFragments(rootNode, fragment, forPath);\r\n // after replacing and collect node infos on child fragment\r\n const fragmentInfo = {\r\n fragment: fragment,\r\n parseBindTextResult: parseBindingTextResult,\r\n nodeInfos: getFragmentNodeInfos(fragment),\r\n }\r\n return fragmentInfo;\r\n}\r\n\r\n\r\nexport function collectStructuralFragments(rootNode: Node, walkRoot: Document | Element | DocumentFragment, forPath?: string): void {\r\n const elseKeyword = config.commentElsePrefix;\r\n const walker = document.createTreeWalker(\r\n walkRoot, \r\n NodeFilter.SHOW_ELEMENT, \r\n {\r\n acceptNode(node: Node) {\r\n const element = node as Element;\r\n if (element.tagName.toLowerCase() === 'template') {\r\n const bindText = element.getAttribute(config.bindAttributeName) || '';\r\n if (bindText.length > 0) {\r\n return NodeFilter.FILTER_ACCEPT;\r\n }\r\n }\r\n return NodeFilter.FILTER_SKIP;\r\n }\r\n }\r\n );\r\n let lastIfFragmentInfo: IFragmentInfo | null = null; // for elseif chaining\r\n const elseFragmentInfos: IFragmentInfo[] = []; // for elseif chaining\r\n const templates: HTMLTemplateElement[] = [];\r\n while (walker.nextNode()) {\r\n const template = walker.currentNode as HTMLTemplateElement;\r\n templates.push(template);\r\n }\r\n\r\n for(const template of templates) {\r\n let bindText = template.getAttribute(config.bindAttributeName) || '';\r\n if (typeof forPath === \"string\") {\r\n bindText = expandShorthandInBindAttribute(bindText, forPath);\r\n }\r\n const parseBindTextResults = parseBindTextsForElement(bindText);\r\n let parseBindTextResult = parseBindTextResults[0];\r\n const keyword = keywordByBindingType.get(parseBindTextResult.bindingType);\r\n if (typeof keyword === 'undefined') {\r\n continue;\r\n }\r\n\r\n const bindingType = parseBindTextResult.bindingType;\r\n const fragment = template.content;\r\n const uuid = getUUID();\r\n let fragmentInfo: IFragmentInfo | null = null;\r\n\r\n // Determine childForPath for shorthand expansion\r\n const childForPath = bindingType === \"for\"\r\n ? parseBindTextResult.statePathName\r\n : forPath;\r\n\r\n if (bindingType === \"else\") {\r\n // check last 'if' or 'elseif' fragment info\r\n if (lastIfFragmentInfo === null) {\r\n raiseError(`'else' binding found without preceding 'if' or 'elseif' binding.`);\r\n }\r\n // else condition\r\n parseBindTextResult = cloneNotParseBindTextResult(\"else\", lastIfFragmentInfo.parseBindTextResult);\r\n fragmentInfo = _getFragmentInfo(rootNode, fragment, parseBindTextResult, childForPath);\r\n setFragmentInfoByUUID(uuid, rootNode, fragmentInfo);\r\n\r\n const lastElseFragmentInfo = elseFragmentInfos.at(-1);\r\n const placeHolder = document.createComment(`@@${keyword}:${uuid}`);\r\n if (typeof lastElseFragmentInfo !== \"undefined\") {\r\n template.remove();\r\n lastElseFragmentInfo.fragment.appendChild(placeHolder);\r\n lastElseFragmentInfo.nodeInfos.push({\r\n nodePath: getNodePath(placeHolder),\r\n parseBindTextResults: getParseBindTextResults(placeHolder),\r\n });\r\n } else {\r\n template.replaceWith(placeHolder);\r\n }\r\n } else if (bindingType === \"elseif\") {\r\n // check last 'if' or 'elseif' fragment info\r\n if (lastIfFragmentInfo === null) {\r\n raiseError(`'elseif' binding found without preceding 'if' or 'elseif' binding.`);\r\n }\r\n\r\n fragmentInfo = _getFragmentInfo(rootNode, fragment, parseBindTextResult, childForPath);\r\n setFragmentInfoByUUID(uuid, rootNode, fragmentInfo);\r\n const placeHolder = document.createComment(`@@${keyword}:${uuid}`);\r\n\r\n // create else fragment\r\n const elseUUID = getUUID();\r\n const elseFragmentInfo: IFragmentInfo = {\r\n fragment: document.createDocumentFragment(),\r\n parseBindTextResult: cloneNotParseBindTextResult(\"else\", lastIfFragmentInfo.parseBindTextResult),\r\n nodeInfos: [],\r\n };\r\n elseFragmentInfo.fragment.appendChild(placeHolder);\r\n elseFragmentInfo.nodeInfos.push({\r\n nodePath: getNodePath(placeHolder),\r\n parseBindTextResults: getParseBindTextResults(placeHolder),\r\n });\r\n setFragmentInfoByUUID(elseUUID, rootNode, elseFragmentInfo);\r\n const lastElseFragmentInfo = elseFragmentInfos.at(-1);\r\n elseFragmentInfos.push(elseFragmentInfo);\r\n const elsePlaceHolder = document.createComment(`@@${elseKeyword}:${elseUUID}`);\r\n\r\n if (typeof lastElseFragmentInfo !== \"undefined\") {\r\n template.remove();\r\n lastElseFragmentInfo.fragment.appendChild(elsePlaceHolder);\r\n lastElseFragmentInfo.nodeInfos.push({\r\n nodePath: getNodePath(elsePlaceHolder),\r\n parseBindTextResults: getParseBindTextResults(elsePlaceHolder),\r\n });\r\n } else {\r\n template.replaceWith(elsePlaceHolder);\r\n }\r\n\r\n } else {\r\n fragmentInfo = _getFragmentInfo(rootNode, fragment, parseBindTextResult, childForPath);\r\n setFragmentInfoByUUID(uuid, rootNode, fragmentInfo);\r\n const placeHolder = document.createComment(`@@${keyword}:${uuid}`);\r\n template.replaceWith(placeHolder);\r\n }\r\n\r\n // Update lastIfFragmentInfo for if/elseif/else chaining\r\n if (bindingType === \"if\") {\r\n elseFragmentInfos.length = 0; // start new if chain\r\n lastIfFragmentInfo = fragmentInfo;\r\n } else if (bindingType === \"elseif\") {\r\n lastIfFragmentInfo = fragmentInfo;\r\n } else if (bindingType === \"else\") {\r\n lastIfFragmentInfo = null;\r\n elseFragmentInfos.length = 0; // end if chain\r\n }\r\n }\r\n}\r\n","import { State } from \"./components/State\";\r\nimport { IStateElement } from \"./components/types\";\r\nimport { config } from \"./config\";\r\n\r\nexport async function waitForStateInitialize(root: Document | Element | DocumentFragment): Promise<void> {\r\n const elements = root.querySelectorAll(config.tagNames.state);\r\n const promises: Promise<void>[] = [];\r\n await customElements.whenDefined(config.tagNames.state);\r\n for(const element of elements) {\r\n const stateElement = element as State as IStateElement;\r\n promises.push(stateElement.initializePromise);\r\n }\r\n await Promise.all(promises);\r\n}\r\n","import { waitInitializeBinding } from \"./bindings/initializeBindingPromiseByNode\";\r\nimport { initializeBindings } from \"./bindings/initializeBindings\";\r\nimport { config } from \"./config\";\r\nimport { convertMustacheToComments } from \"./mustache/convertMustacheToComments\";\r\nimport { collectStructuralFragments } from \"./structural/collectStructuralFragments\";\r\nimport { waitForStateInitialize } from \"./waitForStateInitialize\";\r\n\r\nexport async function buildBindings(root: Document | ShadowRoot): Promise<void> {\r\n if (root === document) {\r\n // document配下のwcs-stateの初期化(connectedCallbackの完了)を待機する\r\n await waitForStateInitialize(document);\r\n // baindingを取得して、初期値をセットする\r\n convertMustacheToComments(document);\r\n collectStructuralFragments(document, document);\r\n initializeBindings(document.body, null);\r\n } else {\r\n const shadowRoot = root as ShadowRoot;\r\n if (shadowRoot.host.hasAttribute(config.bindAttributeName)) {\r\n // data-wcsを持つWebComponentは、WebComponentのbindingが完了するまで待機する。\r\n await waitInitializeBinding(shadowRoot.host);\r\n }\r\n // shadowRoot配下のwcs-stateの初期化(connectedCallbackの完了)を待機する\r\n await waitForStateInitialize(shadowRoot);\r\n // baindingを取得して、初期値をセットする\r\n convertMustacheToComments(shadowRoot);\r\n collectStructuralFragments(shadowRoot, shadowRoot);\r\n initializeBindings(shadowRoot, null);\r\n }\r\n}\r\n","import { getAbsoluteStateAddressByBinding } from \"./binding/getAbsoluteStateAddressByBinding\";\r\nimport { addBindingByAbsoluteStateAddress } from \"./binding/getBindingSetByAbsoluteStateAddress\";\r\nimport { setLastListValueByAbsoluteStateAddress } from \"./list/lastListValueByAbsoluteStateAddress\";\r\nimport { parseBindTextsForElement } from \"./bindTextParser/parseBindTextsForElement\";\r\nimport { ParseBindTextResult } from \"./bindTextParser/types\";\r\nimport { collectNodesAndBindingInfos } from \"./bindings/collectNodesAndBindingInfos\";\r\nimport { setBindingsByContent } from \"./bindings/bindingsByContent\";\r\nimport { setIndexBindingsByContent } from \"./bindings/indexBindingsByContent\";\r\nimport { setNodesByContent } from \"./bindings/nodesByContent\";\r\nimport { bindLoopContextToContent } from \"./bindings/bindLoopContextToContent\";\r\nimport { config } from \"./config\";\r\nimport { WILDCARD, INDEX_BY_INDEX_NAME } from \"./define\";\r\nimport { Ssr, SSR_BLOCK_START } from \"./components/Ssr\";\r\nimport { getStateElementByName } from \"./stateElementByName\";\r\nimport { raiseError } from \"./raiseError\";\r\nimport { setLoopContextByNode } from \"./list/loopContextByNode\";\r\nimport { replaceToReplaceNode } from \"./bindings/replaceToReplaceNode\";\r\nimport { attachEventHandler } from \"./event/handler\";\r\nimport { attachTwowayEventHandler } from \"./event/twowayHandler\";\r\nimport { attachRadioEventHandler } from \"./event/radioHandler\";\r\nimport { attachCheckboxEventHandler } from \"./event/checkboxHandler\";\r\nimport { applyChangeFromBindings } from \"./apply/applyChangeFromBindings\";\r\nimport { hydrateSetContent, hydrateSetLastNode } from \"./apply/applyChangeToFor\";\r\nimport { waitForStateInitialize } from \"./waitForStateInitialize\";\r\nimport { setFragmentInfoByUUID, getFragmentInfoByUUID } from \"./structural/fragmentInfoByUUID\";\r\nimport { setContentByNode } from \"./structural/contentsByNode\";\r\nimport { createContentFromNodes } from \"./structural/createContent\";\r\nimport { collectStructuralFragments } from \"./structural/collectStructuralFragments\";\r\nimport { createNotFilter } from \"./structural/createNotFilter\";\r\nimport { getFragmentNodeInfos } from \"./structural/getFragmentNodeInfos\";\r\nimport { optimizeFragment } from \"./structural/optimizeFragment\";\r\nimport { expandShorthandPaths } from \"./structural/expandShorthandPaths\";\r\nimport { createListIndex } from \"./list/createListIndex\";\r\nimport { IListIndex } from \"./list/types\";\r\nimport { setListIndexesByList } from \"./list/listIndexesByList\";\r\nimport { getPathInfo } from \"./address/PathInfo\";\r\nimport { createStateAddress } from \"./address/StateAddress\";\r\nimport { IBindingInfo } from \"./types\";\r\nimport { VERSION } from \"./version\";\r\n\r\n// ハイドレーション時にスキップするバインディングタイプ\r\nconst STRUCTURAL_TYPES = new Set(['for', 'if', 'elseif', 'else']);\r\n\r\n\r\ninterface ISsrBlock {\r\n type: string; // for, if, elseif, else\r\n uuid: string;\r\n path: string;\r\n index: number | null; // for のみ\r\n nodes: Node[]; // start〜end 間のノード\r\n}\r\n\r\n/**\r\n * SSR ブロック境界コメントを走査して、start〜end 間のノードを収集する\r\n */\r\nfunction collectSsrBlocks(root: Node): ISsrBlock[] {\r\n const blocks: ISsrBlock[] = [];\r\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_COMMENT);\r\n const startComments: Comment[] = [];\r\n\r\n // まず全コメントを収集\r\n while (walker.nextNode()) {\r\n startComments.push(walker.currentNode as Comment);\r\n }\r\n\r\n for (const comment of startComments) {\r\n const startMatch = SSR_BLOCK_START.exec(comment.data);\r\n if (!startMatch) continue;\r\n\r\n const type = startMatch[1];\r\n const info = startMatch[2]; // \"uuid:path:index\" or \"uuid:path\"\r\n const parts = info.split(':');\r\n\r\n let uuid: string;\r\n let path: string;\r\n let index: number | null = null;\r\n\r\n if (type === 'for') {\r\n // uuid:path:index\r\n uuid = parts[0];\r\n path = parts[1];\r\n index = parseInt(parts[2], 10);\r\n } else {\r\n // uuid:path\r\n uuid = parts[0];\r\n path = parts.slice(1).join(':');\r\n }\r\n\r\n // start と end の間のノードを収集\r\n const nodes: Node[] = [];\r\n let sibling = comment.nextSibling;\r\n const endPattern = `@@wcs-${type}-end:${info}`;\r\n while (sibling) {\r\n if (sibling.nodeType === Node.COMMENT_NODE && (sibling as Comment).data === endPattern) {\r\n break;\r\n }\r\n nodes.push(sibling);\r\n sibling = sibling.nextSibling;\r\n }\r\n\r\n blocks.push({ type, uuid, path, index, nodes });\r\n }\r\n\r\n return blocks;\r\n}\r\n\r\n/**\r\n * live DOM ノード群からバインディングを収集する。\r\n * ノードを一時的に DocumentFragment に移動して collectNodesAndBindingInfos を実行し、\r\n * 元の位置に戻す。\r\n */\r\nfunction collectBindingsFromLiveNodes(\r\n nodes: Node[],\r\n): { bindingInfos: IBindingInfo[], subscriberNodes: Node[] } {\r\n if (nodes.length === 0) return { bindingInfos: [], subscriberNodes: [] };\r\n\r\n // ノードの元の位置を記録\r\n const parent = nodes[0].parentNode;\r\n const nextSibling = nodes[nodes.length - 1].nextSibling;\r\n\r\n // 一時的に wrapper 要素に移動(collectNodesAndBindingInfos は Element を受け付ける)\r\n const wrapper = document.createElement('div');\r\n for (const node of nodes) {\r\n wrapper.appendChild(node);\r\n }\r\n\r\n // バインディング収集\r\n const [subscriberNodes, allBindings] = collectNodesAndBindingInfos(wrapper);\r\n\r\n // _initializeBindings 相当の処理\r\n for (const binding of allBindings) {\r\n replaceToReplaceNode(binding);\r\n if (attachEventHandler(binding)) continue;\r\n attachTwowayEventHandler(binding);\r\n attachRadioEventHandler(binding);\r\n attachCheckboxEventHandler(binding);\r\n }\r\n\r\n // 元の位置に戻す\r\n if (parent) {\r\n while (wrapper.firstChild) {\r\n parent.insertBefore(wrapper.firstChild, nextSibling);\r\n }\r\n }\r\n\r\n return {\r\n bindingInfos: allBindings,\r\n subscriberNodes,\r\n };\r\n}\r\n\r\n/**\r\n * SSR ブロックの DOM ノードを Content 化し、バインディングを登録する。\r\n */\r\nfunction hydrateBlocks(root: Node, blocks: ISsrBlock[]): void {\r\n // for ブロックの listIndex を UUID ごとに収集\r\n const listIndexesByUuid: Map<string, IListIndex[]> = new Map();\r\n\r\n for (const block of blocks) {\r\n if (block.nodes.length === 0) continue;\r\n\r\n const content = createContentFromNodes(block.nodes);\r\n\r\n // Content のバインディングを収集\r\n const { bindingInfos, subscriberNodes } = collectBindingsFromLiveNodes(block.nodes);\r\n\r\n // Content 内のノードに data-wcs-completed を付与\r\n // (メインの collectNodesAndBindingInfos で重複登録されないようにする)\r\n for (const node of subscriberNodes) {\r\n if (node.nodeType === Node.ELEMENT_NODE) {\r\n (node as Element).setAttribute('data-wcs-completed', '');\r\n }\r\n }\r\n setBindingsByContent(content, bindingInfos);\r\n setNodesByContent(content, subscriberNodes);\r\n\r\n const indexBindings: IBindingInfo[] = [];\r\n for (const binding of bindingInfos) {\r\n if (binding.statePathName in INDEX_BY_INDEX_NAME) {\r\n indexBindings.push(binding);\r\n }\r\n }\r\n setIndexBindingsByContent(content, indexBindings);\r\n\r\n if (block.type === 'for' && block.index !== null) {\r\n const placeholderComment = findPlaceholderComment(root, 'for', block.uuid);\r\n if (placeholderComment) {\r\n const listIndex = createListIndex(null, block.index);\r\n hydrateSetContent(placeholderComment, listIndex, content);\r\n const lastNode = block.nodes[block.nodes.length - 1];\r\n hydrateSetLastNode(placeholderComment, lastNode);\r\n setContentByNode(placeholderComment, content);\r\n\r\n // ループコンテキストをバインドし、バインディングをアドレスに登録\r\n const pathInfo = getPathInfo(block.path + '.' + WILDCARD);\r\n const stateAddress = createStateAddress(pathInfo, listIndex);\r\n // ILoopContext は IStateAddress + listIndex なので、stateAddress をそのまま使う\r\n bindLoopContextToContent(content, stateAddress as any);\r\n\r\n for (const binding of bindingInfos) {\r\n const absAddr = getAbsoluteStateAddressByBinding(binding);\r\n addBindingByAbsoluteStateAddress(absAddr, binding);\r\n }\r\n\r\n // listIndex を UUID ごとに収集(後で setListIndexesByList に渡す)\r\n let indexes = listIndexesByUuid.get(block.uuid);\r\n if (!indexes) {\r\n indexes = [];\r\n listIndexesByUuid.set(block.uuid, indexes);\r\n }\r\n indexes.push(listIndex);\r\n }\r\n } else {\r\n const placeholderComment = findPlaceholderComment(root, block.type, block.uuid);\r\n if (placeholderComment) {\r\n setContentByNode(placeholderComment, content);\r\n\r\n // バインディングをアドレスに登録\r\n for (const binding of bindingInfos) {\r\n const absAddr = getAbsoluteStateAddressByBinding(binding);\r\n addBindingByAbsoluteStateAddress(absAddr, binding);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // for ブロックの listIndex を state のリスト値に紐づける\r\n for (const [uuid, indexes] of listIndexesByUuid) {\r\n const placeholderComment = findPlaceholderComment(root, 'for', uuid);\r\n if (!placeholderComment) continue;\r\n // state から現在のリスト値を取得して listIndexes を設定\r\n const rootNode = placeholderComment.getRootNode() as Node;\r\n // structuralBindings はまだ登録前なので、getParseBindTextResults を直接使う\r\n const fragmentInfo = getFragmentInfoByUUID(uuid);\r\n if (!fragmentInfo) continue;\r\n const stateName = fragmentInfo.parseBindTextResult.stateName;\r\n const statePathName = fragmentInfo.parseBindTextResult.statePathName;\r\n const stateElement = getStateElementByName(rootNode, stateName);\r\n if (!stateElement) continue;\r\n stateElement.createState(\"readonly\", (state) => {\r\n const list = state[statePathName];\r\n if (Array.isArray(list)) {\r\n setListIndexesByList(list, indexes);\r\n }\r\n });\r\n }\r\n}\r\n\r\nfunction findPlaceholderComment(root: Node, type: string, uuid: string): Comment | null {\r\n const prefix = config as any;\r\n const keywordMap: Record<string, string> = {\r\n 'for': config.commentForPrefix,\r\n 'if': config.commentIfPrefix,\r\n 'elseif': config.commentElseIfPrefix,\r\n 'else': config.commentElsePrefix,\r\n };\r\n const keyword = keywordMap[type];\r\n if (!keyword) return null;\r\n\r\n const pattern = `@@${keyword}:${uuid}`;\r\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_COMMENT);\r\n while (walker.nextNode()) {\r\n const comment = walker.currentNode as Comment;\r\n if (comment.data === pattern) {\r\n return comment;\r\n }\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * <wcs-ssr> 内のテンプレートを fragmentInfoByUUID に復帰させる。\r\n */\r\nfunction restoreFragments(root: Document, ssrEl: Ssr): void {\r\n const rootNode = root as Node;\r\n let lastIfParseResult: ParseBindTextResult | null = null;\r\n\r\n for (const [uuid, tpl] of ssrEl.templates) {\r\n const bindText = tpl.getAttribute(config.bindAttributeName) || '';\r\n const parseBindTextResults = parseBindTextsForElement(bindText);\r\n let parseBindTextResult = parseBindTextResults[0];\r\n const bindingType = parseBindTextResult.bindingType;\r\n\r\n // else: 直前の if 条件の not → 条件反転\r\n // elseif: 独自条件を持つが stateName は if から引き継ぐ\r\n if (bindingType === 'else' && lastIfParseResult) {\r\n parseBindTextResult = {\r\n ...lastIfParseResult,\r\n outFilters: [...lastIfParseResult.outFilters, createNotFilter()],\r\n bindingType: 'else',\r\n };\r\n } else if (bindingType === 'elseif' && lastIfParseResult) {\r\n parseBindTextResult = {\r\n ...parseBindTextResult,\r\n stateName: lastIfParseResult.stateName,\r\n };\r\n }\r\n\r\n // if chain の追跡\r\n if (bindingType === 'if') {\r\n lastIfParseResult = parseBindTextResult;\r\n } else if (bindingType === 'elseif') {\r\n lastIfParseResult = parseBindTextResult;\r\n } else if (bindingType === 'else') {\r\n lastIfParseResult = null;\r\n }\r\n\r\n const fragment = document.importNode(tpl.content, true);\r\n const forPath = bindingType === \"for\" ? parseBindTextResult.statePathName : undefined;\r\n optimizeFragment(fragment);\r\n if (typeof forPath === \"string\") {\r\n expandShorthandPaths(fragment, forPath);\r\n }\r\n collectStructuralFragments(rootNode, fragment, forPath);\r\n\r\n const fragmentInfo = {\r\n fragment,\r\n parseBindTextResult,\r\n nodeInfos: getFragmentNodeInfos(fragment),\r\n };\r\n setFragmentInfoByUUID(uuid, rootNode, fragmentInfo);\r\n }\r\n}\r\n\r\n/**\r\n * SSR ハイドレーション用バインディング初期化。\r\n * バージョン不一致時は DOM をクリーンアップして false を返す\r\n * (呼び出し元で buildBindings にフォールバック)。\r\n */\r\nexport async function hydrateBindings(root: Document): Promise<boolean> {\r\n await waitForStateInitialize(root);\r\n\r\n // バージョン検証\r\n const ssrElements = root.querySelectorAll(config.tagNames.ssr);\r\n for (const ssrNode of ssrElements) {\r\n const ssrEl = ssrNode as Ssr;\r\n if (!ssrEl.verifyVersion()) {\r\n console.warn(\r\n `[@wcstack/state] SSR version mismatch: server=\"${ssrEl.version}\", client=\"${VERSION}\". Falling back to full render.`\r\n );\r\n Ssr.cleanupDom(root);\r\n return false;\r\n }\r\n }\r\n\r\n // <wcs-ssr> からテンプレートを fragmentInfoByUUID に復帰\r\n for (const ssrNode of ssrElements) {\r\n restoreFragments(root, ssrNode as Ssr);\r\n }\r\n\r\n // SSR ブロック境界コメントから既存 DOM を Content 化\r\n const blocks = collectSsrBlocks(document.body);\r\n hydrateBlocks(document.body, blocks);\r\n\r\n // ブロック境界コメント (start/end) を除去\r\n Ssr.removeBlockBoundaryComments(document.body);\r\n\r\n // <wcs-ssr> を一時除去(バインディング走査に含めない)\r\n const ssrParents: { el: Element, parent: Node, next: Node | null }[] = [];\r\n for (const el of ssrElements) {\r\n if (el.parentNode) {\r\n ssrParents.push({ el, parent: el.parentNode, next: el.nextSibling });\r\n el.remove();\r\n }\r\n }\r\n\r\n // 構造プレースホルダーコメント (@@wcs-for:uuid 等) は残す\r\n // → バインディング走査で拾われ、状態変化時の再レンダリングに使われる\r\n\r\n // SSR テキストバインディングを @@: 形式に復元\r\n Ssr.restoreTextBindings(document.body);\r\n\r\n // ノードとバインディングを収集\r\n const [subscriberNodes, allBindings] = collectNodesAndBindingInfos(document.body);\r\n\r\n // 収集完了したノードに data-wcs-completed 属性を付与\r\n // for ブロック内ノード(hydrateBlocks で登録済み)にはループコンテキストをリセットしない\r\n for (const node of subscriberNodes) {\r\n if (node.nodeType === Node.ELEMENT_NODE) {\r\n const el = node as Element;\r\n if (!el.hasAttribute('data-wcs-completed')) {\r\n setLoopContextByNode(node, null);\r\n el.setAttribute('data-wcs-completed', '');\r\n }\r\n } else {\r\n // コメントノード等\r\n setLoopContextByNode(node, null);\r\n }\r\n }\r\n\r\n // バインディングを構造系とそれ以外に分離\r\n const normalBindings: IBindingInfo[] = [];\r\n const structuralBindings: IBindingInfo[] = [];\r\n\r\n for (const binding of allBindings) {\r\n replaceToReplaceNode(binding);\r\n if (attachEventHandler(binding)) {\r\n continue;\r\n }\r\n attachTwowayEventHandler(binding);\r\n attachRadioEventHandler(binding);\r\n attachCheckboxEventHandler(binding);\r\n\r\n if (STRUCTURAL_TYPES.has(binding.bindingType)) {\r\n structuralBindings.push(binding);\r\n } else if (binding.statePathName.includes(WILDCARD)) {\r\n // for ブロック内のバインディング → Content のバインディングとして登録済み\r\n continue;\r\n } else {\r\n normalBindings.push(binding);\r\n }\r\n }\r\n\r\n // 全バインディング(通常 + 構造)をアドレスに登録\r\n for (const binding of [...normalBindings, ...structuralBindings]) {\r\n const absoluteStateAddress = getAbsoluteStateAddressByBinding(binding);\r\n addBindingByAbsoluteStateAddress(absoluteStateAddress, binding);\r\n const rootNode = binding.replaceNode.getRootNode() as Node;\r\n const stateElement = getStateElementByName(rootNode, binding.stateName);\r\n if (stateElement === null) {\r\n raiseError(`State element with name \"${binding.stateName}\" not found for binding.`);\r\n }\r\n if (binding.bindingType !== 'event') {\r\n stateElement.setPathInfo(binding.statePathName, binding.bindingType);\r\n }\r\n }\r\n\r\n // for バインディングの lastListValue を初期値として設定\r\n // (次回の状態変化時に差分計算の基準になる)\r\n for (const binding of structuralBindings) {\r\n if (binding.bindingType === 'for') {\r\n const absAddr = getAbsoluteStateAddressByBinding(binding);\r\n const rootNode = binding.replaceNode.getRootNode() as Node;\r\n const stateElement = getStateElementByName(rootNode, binding.stateName);\r\n if (stateElement) {\r\n stateElement.createState(\"readonly\", (state) => {\r\n const value = state[binding.statePathName];\r\n if (Array.isArray(value)) {\r\n setLastListValueByAbsoluteStateAddress(absAddr, value);\r\n }\r\n });\r\n }\r\n }\r\n }\r\n\r\n // 通常バインディングのみ初回値適用(構造バインディングはSSR描画済み)\r\n applyChangeFromBindings(normalBindings);\r\n\r\n // <wcs-ssr> を元に戻す\r\n for (const { el, parent, next } of ssrParents) {\r\n parent.insertBefore(el, next);\r\n }\r\n\r\n // hydrateProps 復元\r\n const restoredSsrElements = root.querySelectorAll(config.tagNames.ssr);\r\n for (const ssrNode of restoredSsrElements) {\r\n const ssrEl = ssrNode as Ssr;\r\n const props = ssrEl.hydrateProps;\r\n for (const [id, propMap] of Object.entries(props)) {\r\n const target = root.querySelector(`[data-wcs-ssr-id=\"${id}\"]`);\r\n if (!target) continue;\r\n for (const [propName, value] of Object.entries(propMap)) {\r\n (target as any)[propName] = value;\r\n }\r\n }\r\n }\r\n\r\n // ハイドレーション中の重複登録防止用属性を除去\r\n const completedEls = root.querySelectorAll('[data-wcs-completed]');\r\n for (const el of completedEls) {\r\n el.removeAttribute('data-wcs-completed');\r\n }\r\n\r\n return true;\r\n}\r\n\r\n/** @internal テスト用 */\r\nexport const __test = {\r\n collectSsrBlocks,\r\n collectBindingsFromLiveNodes,\r\n hydrateBlocks,\r\n findPlaceholderComment,\r\n restoreFragments,\r\n};\r\n","import { buildBindings } from \"./buildBindings\";\r\nimport { hydrateBindings } from \"./hydrateBindings\";\r\nimport { IStateElement } from \"./components/types\";\r\nimport { config, inSsr } from \"./config\";\r\nimport { raiseError } from \"./raiseError\";\r\n\r\nconst stateElementByNameByNode: WeakMap<Node, Map<string, IStateElement>> = new WeakMap();\r\nconst bindingsReadyByNode: WeakMap<Node, Promise<void>> = new WeakMap();\r\n\r\nexport function getStateElementByName(rootNode:Node, name: string): IStateElement | null {\r\n let stateElementByName = stateElementByNameByNode.get(rootNode);\r\n if (!stateElementByName) {\r\n return null;\r\n }\r\n return stateElementByName.get(name) || null;\r\n}\r\n\r\n/**\r\n * 指定された rootNode のバインディング初期化が完了するまで待機する Promise を返す。\r\n */\r\nexport function getBindingsReady(rootNode: Node): Promise<void> {\r\n return bindingsReadyByNode.get(rootNode) ?? Promise.resolve();\r\n}\r\n\r\nexport function setStateElementByName(rootNode:Node, name: string, element: IStateElement | null): void {\r\n\r\n let stateElementByName = stateElementByNameByNode.get(rootNode);\r\n\r\n if (element === null) {\r\n // 削除の場合、Mapが存在しない場合は何もしない\r\n if (!stateElementByName) {\r\n return;\r\n }\r\n stateElementByName.delete(name);\r\n if (stateElementByName.size === 0) {\r\n stateElementByNameByNode.delete(rootNode);\r\n }\r\n if (config.debug) {\r\n console.debug(`State element unregistered: name=\"${name}\"`);\r\n }\r\n } else {\r\n // 登録の場合\r\n if (!stateElementByName) {\r\n stateElementByName = new Map<string, IStateElement>();\r\n stateElementByNameByNode.set(rootNode, stateElementByName);\r\n // 初めてルートノードに登録する場合\r\n // enable-ssr 属性があり、サーバーサイドでない場合はハイドレーション\r\n const enableSsr = !inSsr() && (element as unknown as Element).hasAttribute?.('enable-ssr');\r\n if (rootNode.constructor.name === 'HTMLDocument' || rootNode.constructor.name === 'Document') {\r\n const ready = new Promise<void>((resolve) => {\r\n queueMicrotask(async () => {\r\n if (enableSsr) {\r\n const success = await hydrateBindings(rootNode as Document);\r\n if (!success) {\r\n await buildBindings(rootNode as Document);\r\n }\r\n } else {\r\n await buildBindings(rootNode as Document);\r\n }\r\n resolve();\r\n });\r\n });\r\n bindingsReadyByNode.set(rootNode, ready);\r\n } else if (rootNode.constructor.name === 'ShadowRoot') {\r\n const ready = new Promise<void>((resolve) => {\r\n queueMicrotask(async () => {\r\n await buildBindings(rootNode as ShadowRoot);\r\n resolve();\r\n });\r\n });\r\n bindingsReadyByNode.set(rootNode, ready);\r\n }\r\n }\r\n if (stateElementByName.has(name)) {\r\n raiseError(`State element with name \"${name}\" is already registered.`);\r\n }\r\n stateElementByName.set(name, element);\r\n if (config.debug) {\r\n console.debug(`State element registered: name=\"${name}\"`, element);\r\n }\r\n }\r\n}\r\n","import { raiseError } from \"../raiseError\";\r\nimport { getStateElementByName } from \"../stateElementByName\";\r\nimport { IFragmentInfo } from \"./types\";\r\n\r\nconst fragmentInfoByUUID = new Map<string, IFragmentInfo>();\r\n\r\nexport function setFragmentInfoByUUID(uuid: string, rootNode: Node, fragmentInfo: IFragmentInfo | null): void {\r\n if (fragmentInfo === null) {\r\n fragmentInfoByUUID.delete(uuid);\r\n } else {\r\n fragmentInfoByUUID.set(uuid, fragmentInfo);\r\n const bindingPartial = fragmentInfo.parseBindTextResult;\r\n const stateElement = getStateElementByName(rootNode, bindingPartial.stateName);\r\n if (stateElement === null) {\r\n raiseError(`State element with name \"${bindingPartial.stateName}\" not found for fragment info.`);\r\n }\r\n stateElement.setPathInfo(bindingPartial.statePathName, bindingPartial.bindingType);\r\n for(const nodeInfo of fragmentInfo.nodeInfos) {\r\n for(const nodeBindingPartial of nodeInfo.parseBindTextResults) {\r\n const nodeStateElement = getStateElementByName(rootNode, nodeBindingPartial.stateName);\r\n if (nodeStateElement === null) {\r\n raiseError(`State element with name \"${nodeBindingPartial.stateName}\" not found for fragment info node.`);\r\n }\r\n nodeStateElement.setPathInfo(nodeBindingPartial.statePathName, nodeBindingPartial.bindingType);\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport function getFragmentInfoByUUID(uuid: string): IFragmentInfo | null {\r\n return fragmentInfoByUUID.get(uuid) || null;\r\n}\r\n\r\nexport function getAllFragmentUUIDs(): string[] {\r\n return Array.from(fragmentInfoByUUID.keys());\r\n}","import { config } from \"../config\";\r\nimport { IState } from \"../types\";\r\nimport { VERSION } from \"../version\";\r\nimport { getAllFragmentUUIDs, getFragmentInfoByUUID } from \"../structural/fragmentInfoByUUID\";\r\nimport { getAllSsrPropertyNodes, getSsrProperties, clearSsrPropertyStore } from \"../apply/ssrPropertyStore\";\r\n\r\nexport interface ISsrElement {\r\n readonly name: string;\r\n readonly version: string;\r\n readonly stateData: IState;\r\n readonly templates: Map<string, HTMLTemplateElement>;\r\n readonly hydrateProps: Record<string, Record<string, unknown>>;\r\n getTemplate(uuid: string): HTMLTemplateElement | null;\r\n verifyVersion(): boolean;\r\n}\r\n\r\n// SSR コメントパターン\r\nconst SSR_PLACEHOLDER_COMMENT = /^@@wcs-(?:for|if|elseif|else):[^-]/;\r\nconst SSR_BLOCK_START = /^@@wcs-(for|if|elseif|else)-start:(.+)$/;\r\nconst SSR_BLOCK_END = /^@@wcs-(for|if|elseif|else)-end:(.+)$/;\r\nconst SSR_TEXT_START = /^@@wcs-text-start:(.+)$/;\r\n\r\nexport {\r\n SSR_PLACEHOLDER_COMMENT,\r\n SSR_BLOCK_START,\r\n SSR_BLOCK_END,\r\n SSR_TEXT_START,\r\n};\r\n\r\nexport class Ssr extends HTMLElement implements ISsrElement {\r\n private _stateData: IState | null = null;\r\n private _templates: Map<string, HTMLTemplateElement> | null = null;\r\n private _hydrateProps: Record<string, Record<string, unknown>> | null = null;\r\n\r\n get name(): string {\r\n return this.getAttribute('name') || 'default';\r\n }\r\n\r\n get version(): string {\r\n return this.getAttribute('version') || '';\r\n }\r\n\r\n get stateData(): IState {\r\n if (this._stateData === null) {\r\n this._stateData = this._loadStateData();\r\n }\r\n return this._stateData;\r\n }\r\n\r\n get templates(): Map<string, HTMLTemplateElement> {\r\n if (this._templates === null) {\r\n this._templates = this._loadTemplates();\r\n }\r\n return this._templates;\r\n }\r\n\r\n get hydrateProps(): Record<string, Record<string, unknown>> {\r\n if (this._hydrateProps === null) {\r\n this._hydrateProps = this._loadHydrateProps();\r\n }\r\n return this._hydrateProps;\r\n }\r\n\r\n getTemplate(uuid: string): HTMLTemplateElement | null {\r\n return this.templates.get(uuid) ?? null;\r\n }\r\n\r\n /**\r\n * サーバーの SSR バージョンとクライアントの state バージョンを検証する。\r\n * メジャー・マイナーバージョンが一致すればtrue。\r\n * version 属性がない場合は検証スキップ(true)。\r\n */\r\n verifyVersion(): boolean {\r\n const serverVersion = this.version;\r\n if (!serverVersion) return true;\r\n const serverParts = serverVersion.split('.');\r\n const clientParts = VERSION.split('.');\r\n // メジャー・マイナーが一致すれば互換\r\n return serverParts[0] === clientParts[0] && serverParts[1] === clientParts[1];\r\n }\r\n\r\n setStateData(data: IState): void {\r\n this._stateData = data;\r\n }\r\n\r\n setHydrateProps(props: Record<string, Record<string, unknown>>): void {\r\n this._hydrateProps = props;\r\n }\r\n\r\n private _loadStateData(): IState {\r\n const script = this.querySelector(\r\n `script[type=\"application/json\"]:not([data-wcs-ssr-props])`\r\n );\r\n if (!script) return {};\r\n try {\r\n return JSON.parse(script.textContent || '{}');\r\n } catch {\r\n return {};\r\n }\r\n }\r\n\r\n private _loadTemplates(): Map<string, HTMLTemplateElement> {\r\n const map = new Map<string, HTMLTemplateElement>();\r\n const templates = this.querySelectorAll<HTMLTemplateElement>('template[id]');\r\n for (const tpl of templates) {\r\n const id = tpl.getAttribute('id');\r\n if (id) {\r\n map.set(id, tpl);\r\n }\r\n }\r\n return map;\r\n }\r\n\r\n private _loadHydrateProps(): Record<string, Record<string, unknown>> {\r\n const script = this.querySelector('script[data-wcs-ssr-props]');\r\n if (!script) return {};\r\n try {\r\n return JSON.parse(script.textContent || '{}');\r\n } catch {\r\n return {};\r\n }\r\n }\r\n\r\n static findByName(root: Node, name: string): ISsrElement | null {\r\n const tagName = config.tagNames.ssr;\r\n const parentEl = root instanceof Element\r\n ? root\r\n : root instanceof Document\r\n ? root.documentElement\r\n : null;\r\n if (!parentEl) return null;\r\n const el = parentEl.querySelector(`${tagName}[name=\"${name}\"]`);\r\n return el as ISsrElement | null;\r\n }\r\n\r\n /**\r\n * stateData と構造テンプレート・プロパティから <wcs-ssr> の中身を構築する。\r\n * server パッケージの renderToString から呼ばれる。\r\n */\r\n /**\r\n * wcs-state 要素から $ プレフィックスや関数を除いたデータを抽出する。\r\n */\r\n static extractStateData(stateEl: Element): Record<string, any> {\r\n const raw = (stateEl as any).__state;\r\n if (!raw || typeof raw !== 'object') return {};\r\n const data: Record<string, any> = {};\r\n for (const [key, value] of Object.entries(raw)) {\r\n if (!key.startsWith('$') && typeof value !== 'function') {\r\n data[key] = value;\r\n }\r\n }\r\n return data;\r\n }\r\n\r\n static buildContent(ssrEl: Element, stateData: Record<string, any>): void {\r\n // 初期データ JSON\r\n const jsonScript = document.createElement('script');\r\n jsonScript.setAttribute('type', 'application/json');\r\n jsonScript.textContent = JSON.stringify(stateData);\r\n ssrEl.appendChild(jsonScript);\r\n\r\n // UUID で管理されているテンプレートを復元して格納\r\n const uuids = getAllFragmentUUIDs();\r\n for (const uuid of uuids) {\r\n const fragmentInfo = getFragmentInfoByUUID(uuid);\r\n if (!fragmentInfo) continue;\r\n\r\n const tpl = document.createElement('template');\r\n tpl.setAttribute('id', uuid);\r\n\r\n const bindResult = fragmentInfo.parseBindTextResult;\r\n const bindText = bindResult.bindingType === 'else'\r\n ? 'else:'\r\n : `${bindResult.bindingType}: ${bindResult.statePathName}`;\r\n tpl.setAttribute(config.bindAttributeName, bindText);\r\n\r\n const content = fragmentInfo.fragment.cloneNode(true) as DocumentFragment;\r\n tpl.content.appendChild(content);\r\n\r\n ssrEl.appendChild(tpl);\r\n }\r\n\r\n // 属性で代替不可なプロパティをハイドレーション用に格納\r\n const ssrNodes = getAllSsrPropertyNodes();\r\n if (ssrNodes.length > 0) {\r\n const propsData: Record<string, Record<string, unknown>> = {};\r\n for (let i = 0; i < ssrNodes.length; i++) {\r\n const node = ssrNodes[i];\r\n const entries = getSsrProperties(node);\r\n if (entries.length === 0) continue;\r\n const id = `wcs-ssr-${i}`;\r\n (node as Element).setAttribute('data-wcs-ssr-id', id);\r\n const props: Record<string, unknown> = {};\r\n for (const entry of entries) {\r\n props[entry.propName] = entry.value;\r\n }\r\n propsData[id] = props;\r\n }\r\n if (Object.keys(propsData).length > 0) {\r\n const propsScript = document.createElement('script');\r\n propsScript.setAttribute('type', 'application/json');\r\n propsScript.setAttribute('data-wcs-ssr-props', '');\r\n propsScript.textContent = JSON.stringify(propsData);\r\n ssrEl.appendChild(propsScript);\r\n }\r\n }\r\n\r\n clearSsrPropertyStore();\r\n }\r\n\r\n /**\r\n * SSR ブロック境界コメント (@@wcs-*-start/end) を除去する\r\n */\r\n static removeBlockBoundaryComments(root: Node): void {\r\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_COMMENT);\r\n const toRemove: Comment[] = [];\r\n while (walker.nextNode()) {\r\n const comment = walker.currentNode as Comment;\r\n if (SSR_BLOCK_START.test(comment.data) || SSR_BLOCK_END.test(comment.data)) {\r\n toRemove.push(comment);\r\n }\r\n }\r\n for (const comment of toRemove) {\r\n comment.remove();\r\n }\r\n }\r\n\r\n /**\r\n * SSR の構造プレースホルダーコメント (@@wcs-for:uuid 等) を除去する\r\n */\r\n static removeStructuralComments(root: Node): void {\r\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_COMMENT);\r\n const toRemove: Comment[] = [];\r\n while (walker.nextNode()) {\r\n const comment = walker.currentNode as Comment;\r\n if (SSR_PLACEHOLDER_COMMENT.test(comment.data)) {\r\n toRemove.push(comment);\r\n }\r\n }\r\n for (const comment of toRemove) {\r\n comment.remove();\r\n }\r\n }\r\n\r\n /**\r\n * SSR テキストバインディングコメントを復元する。\r\n * <!--@@wcs-text-start:path-->text<!--@@wcs-text-end:path-->\r\n * → <!--@@: path--> (バインディングシステムが認識する形式)\r\n */\r\n static restoreTextBindings(root: Node): void {\r\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_COMMENT);\r\n const startComments: { comment: Comment, path: string }[] = [];\r\n\r\n while (walker.nextNode()) {\r\n const comment = walker.currentNode as Comment;\r\n const match = SSR_TEXT_START.exec(comment.data);\r\n if (match) {\r\n startComments.push({ comment, path: match[1] });\r\n }\r\n }\r\n\r\n for (const { comment, path } of startComments) {\r\n const bindComment = document.createComment(`@@: ${path}`);\r\n comment.parentNode!.insertBefore(bindComment, comment);\r\n\r\n let sibling: Node | null = comment.nextSibling;\r\n comment.remove();\r\n\r\n const endPattern = `@@wcs-text-end:${path}`;\r\n while (sibling) {\r\n const next: Node | null = sibling.nextSibling;\r\n if (sibling.nodeType === Node.COMMENT_NODE && (sibling as Comment).data === endPattern) {\r\n sibling.parentNode!.removeChild(sibling);\r\n break;\r\n }\r\n sibling.parentNode!.removeChild(sibling);\r\n sibling = next;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * SSR DOM をクリーンアップし、buildBindings が動作できる状態に戻す。\r\n * バージョン不一致時のフォールバック用。\r\n *\r\n * 1. SSR ブロック境界コメント間のレンダリング済みノードを除去\r\n * 2. SSR テキストバインディングを @@: 形式に復元\r\n * 3. プレースホルダーコメントを <wcs-ssr> 内のテンプレートで差し替え\r\n * 4. data-wcs-ssr-id 属性を除去\r\n * 5. <wcs-ssr> を除去\r\n */\r\n static cleanupDom(root: Document): void {\r\n const body = document.body;\r\n\r\n // <wcs-ssr> からテンプレート UUID マップを構築(カスタム要素未定義でも動作するよう DOM 直接走査)\r\n const ssrElements = root.querySelectorAll(config.tagNames.ssr);\r\n const templateByUuid = new Map<string, HTMLTemplateElement>();\r\n for (const ssrNode of ssrElements) {\r\n const templates = ssrNode.querySelectorAll<HTMLTemplateElement>('template[id]');\r\n for (const tpl of templates) {\r\n const id = tpl.getAttribute('id');\r\n if (id) {\r\n templateByUuid.set(id, tpl);\r\n }\r\n }\r\n }\r\n\r\n // SSR ブロック境界コメント間のレンダリング済みノードと境界コメントを除去\r\n const walker1 = document.createTreeWalker(body, NodeFilter.SHOW_COMMENT);\r\n const startComments: Comment[] = [];\r\n while (walker1.nextNode()) {\r\n const comment = walker1.currentNode as Comment;\r\n if (SSR_BLOCK_START.test(comment.data)) {\r\n startComments.push(comment);\r\n }\r\n }\r\n for (const startComment of startComments) {\r\n const match = SSR_BLOCK_START.exec(startComment.data)!;\r\n const type = match[1];\r\n const info = match[2];\r\n const endPattern = `@@wcs-${type}-end:${info}`;\r\n let sibling = startComment.nextSibling;\r\n while (sibling) {\r\n const next = sibling.nextSibling;\r\n if (sibling.nodeType === Node.COMMENT_NODE && (sibling as Comment).data === endPattern) {\r\n sibling.remove();\r\n break;\r\n }\r\n sibling.remove();\r\n sibling = next;\r\n }\r\n startComment.remove();\r\n }\r\n\r\n // SSR テキストバインディングを @@: 形式に復元\r\n Ssr.restoreTextBindings(body);\r\n\r\n // プレースホルダーコメント (@@wcs-for:uuid 等) をテンプレートに差し替え\r\n const walker2 = document.createTreeWalker(body, NodeFilter.SHOW_COMMENT);\r\n const placeholders: { comment: Comment, uuid: string }[] = [];\r\n while (walker2.nextNode()) {\r\n const comment = walker2.currentNode as Comment;\r\n if (SSR_PLACEHOLDER_COMMENT.test(comment.data)) {\r\n const uuid = comment.data.split(':')[1];\r\n placeholders.push({ comment, uuid });\r\n }\r\n }\r\n for (const { comment, uuid } of placeholders) {\r\n const tpl = templateByUuid.get(uuid);\r\n if (tpl) {\r\n const restored = document.createElement('template') as HTMLTemplateElement;\r\n const bindAttr = tpl.getAttribute(config.bindAttributeName);\r\n if (bindAttr) restored.setAttribute(config.bindAttributeName, bindAttr);\r\n const imported = document.importNode(tpl.content, true);\r\n if (imported.childNodes.length > 0) {\r\n restored.content.appendChild(imported);\r\n } else {\r\n for (const child of Array.from(tpl.childNodes)) {\r\n restored.content.appendChild(document.importNode(child, true));\r\n }\r\n }\r\n comment.parentNode!.replaceChild(restored, comment);\r\n }\r\n }\r\n\r\n // data-wcs-ssr-id 属性を除去\r\n const ssrIdElements = root.querySelectorAll('[data-wcs-ssr-id]');\r\n for (const el of ssrIdElements) {\r\n el.removeAttribute('data-wcs-ssr-id');\r\n }\r\n\r\n // <wcs-ssr> を除去\r\n for (const el of ssrElements) {\r\n el.remove();\r\n }\r\n }\r\n}\r\n","import { IState } from \"../types\";\r\n\r\ntype ScriptModule = { default?: unknown };\r\n\r\nexport async function loadFromInnerScript(script: HTMLScriptElement, name: string): Promise<IState> {\r\n let scriptModule: ScriptModule | null = null;\r\n const uniq_comment = `\\n//# sourceURL=${name}\\n`;\r\n if (typeof URL.createObjectURL === 'function') {\r\n // Create a blob URL for the script and dynamically import it\r\n const blob = new Blob([script.text + uniq_comment], { type: \"application/javascript\" });\r\n const url = URL.createObjectURL(blob);\r\n try {\r\n scriptModule = await import(url) as ScriptModule;\r\n } finally {\r\n // Clean up blob URL to prevent memory leak\r\n URL.revokeObjectURL(url);\r\n }\r\n } else {\r\n // Fallback: Base64 encoding method (for test environment)\r\n // Convert script to Base64 and import via data: URL\r\n const b64 = btoa(String.fromCodePoint(...new TextEncoder().encode(script.text + uniq_comment)));\r\n scriptModule = await import(`data:application/javascript;base64,${b64}`) as ScriptModule;\r\n }\r\n return (scriptModule && typeof scriptModule.default === 'object') ? scriptModule.default as IState : {};\r\n}\r\n","import { raiseError } from \"../raiseError\";\r\nimport { IState } from \"../types\";\r\n\r\nexport async function loadFromScriptFile(url: string): Promise<IState> {\r\n try {\r\n const module = await import(/* @vite-ignore */ url);\r\n return module.default || {};\r\n } catch (e) {\r\n raiseError(`Failed to load script file: ${e}`);\r\n }\r\n}\r\n","import { IStateAddress } from \"../address/types\";\r\nimport { MAX_LOOP_DEPTH } from \"../define\";\r\nimport { raiseError } from \"../raiseError\";\r\nimport { ILoopContext, ILoopContextStack } from \"./types\";\r\n\r\ntype LoopContextCallback<T> = (loopContext: ILoopContext) => T | Promise<T>;\r\n\r\nclass LoopContextStack {\r\n private _loopContextStack: (ILoopContext | undefined)[] = Array(MAX_LOOP_DEPTH).fill(undefined);\r\n private _length: number = 0;\r\n\r\n createLoopContext(\r\n elementStateAddress: IStateAddress,\r\n callback: LoopContextCallback<void>\r\n ): void | Promise<void> {\r\n if (elementStateAddress.listIndex === null) {\r\n raiseError(`Cannot create loop context for a state address that does not have a list index.`);\r\n }\r\n const loopContext = elementStateAddress as ILoopContext;\r\n if (this._length >= MAX_LOOP_DEPTH) {\r\n raiseError(`Exceeded maximum loop context stack depth of ${MAX_LOOP_DEPTH}. Possible infinite loop.`);\r\n }\r\n const lastLoopContext = this._loopContextStack[this._length - 1];\r\n if (typeof lastLoopContext !== \"undefined\" ) {\r\n if (lastLoopContext.pathInfo.wildcardCount + 1 !== loopContext.pathInfo.wildcardCount) {\r\n raiseError(`Cannot push loop context for a list whose wildcard count is not exactly one more than the current active loop context.`);\r\n }\r\n // \r\n const prevWildcardPathInfo = loopContext.pathInfo.wildcardPathInfos[loopContext.pathInfo.wildcardPathInfos.length - 2];\r\n if (lastLoopContext.pathInfo !== prevWildcardPathInfo) {\r\n raiseError(`Cannot push loop context for a list whose parent wildcard path info does not match the current active loop context.`);\r\n }\r\n } else {\r\n if (loopContext.pathInfo.wildcardCount !== 1) {\r\n raiseError(`Cannot push loop context for a list with wildcard positions when there is no active loop context.`);\r\n }\r\n }\r\n this._loopContextStack[this._length] = loopContext;\r\n this._length++;\r\n let retValue : void | Promise<void> = void 0;\r\n try {\r\n retValue = callback(loopContext);\r\n } finally {\r\n if (retValue instanceof Promise) {\r\n retValue.finally(() => {\r\n this._length--;\r\n this._loopContextStack[this._length] = undefined;\r\n });\r\n } else {\r\n this._length--;\r\n this._loopContextStack[this._length] = undefined;\r\n }\r\n }\r\n return retValue;\r\n } \r\n}\r\n\r\nexport function createLoopContextStack(): ILoopContextStack {\r\n return new LoopContextStack();\r\n}\r\n\r\n","import { IStateElement } from \"../components/types\";\r\n\r\ninterface IDCCElement extends HTMLElement {\r\n readonly stateElement: IStateElement | null;\r\n}\r\n\r\nexport function getterFn(name: string) {\r\n return function (this: IDCCElement) {\r\n const stateEl = this.stateElement;\r\n if (!stateEl) return undefined;\r\n let value: any;\r\n try {\r\n stateEl.createState(\"readonly\", (state) => {\r\n value = state[name];\r\n });\r\n } catch {\r\n return undefined;\r\n }\r\n return value;\r\n };\r\n}\r\n\r\nexport function setterFn(name: string) {\r\n return function (this: IDCCElement, value: any) {\r\n const stateEl = this.stateElement;\r\n if (!stateEl) return;\r\n stateEl.initializePromise.then(() => {\r\n stateEl.createState(\"writable\", (state) => {\r\n state[name] = value;\r\n });\r\n });\r\n };\r\n}\r\n\r\nexport function callFn(name: string, isAsync: boolean) {\r\n if (isAsync) {\r\n return function (this: IDCCElement, ...args: any[]) {\r\n const stateEl = this.stateElement;\r\n if (!stateEl) return;\r\n return stateEl.initializePromise.then(() => {\r\n return stateEl.createStateAsync(\"writable\", async (state) => {\r\n await state[name](...args);\r\n });\r\n });\r\n };\r\n }\r\n return function (this: IDCCElement, ...args: any[]) {\r\n const stateEl = this.stateElement;\r\n if (!stateEl) return;\r\n stateEl.initializePromise.then(() => {\r\n stateEl.createState(\"writable\", (state) => {\r\n state[name](...args);\r\n });\r\n });\r\n };\r\n}\r\n\r\nexport function isInternalProperty(name: string): boolean {\r\n return name.startsWith(\"$\");\r\n}\r\n","/**\r\n * getResolvedPathInfo.ts\r\n *\r\n * Utility for parsing and generating detailed path information (IResolvedPathInfo)\r\n * from State property names (path strings), including wildcard and index information.\r\n *\r\n * Main responsibilities:\r\n * - Breaks down property names to determine presence and type of wildcards and indexes\r\n * - Automatically determines wildcard type: context/all/partial/none\r\n * - Caches by path for reusability and performance\r\n * - Retrieves structured path information via getStructuredPathInfo\r\n *\r\n * Design points:\r\n * - Caches using Map to handle reserved words like \"constructor\" and \"toString\"\r\n * - Flexibly determines wildcards (*) and numeric indexes, storing them in wildcardIndexes\r\n * - context type indicates unresolved indexes, all type indicates all resolved indexes, partial type indicates mixed\r\n * - ResolvedPathInfo class centralizes path parsing and information management\r\n */\r\nimport { IResolvedAddress, WildcardType } from './types';\r\nimport { getPathInfo } from './PathInfo';\r\n\r\n/**\r\n * Cache for resolved path information.\r\n * Uses Map to safely handle property names including reserved words like \"constructor\" and \"toString\".\r\n */\r\nconst _cache: Map<string, IResolvedAddress> = new Map();\r\n\r\n/**\r\n * Class that parses and stores resolved path information.\r\n * \r\n * Analyzes property path strings to extract:\r\n * - Path segments and their hierarchy\r\n * - Wildcard locations and types\r\n * - Numeric indexes vs unresolved wildcards\r\n * - Wildcard type classification (none/context/all/partial)\r\n */\r\nclass ResolvedAddress implements IResolvedAddress {\r\n readonly path;\r\n readonly segments;\r\n readonly paths;\r\n readonly wildcardCount;\r\n readonly wildcardType;\r\n readonly wildcardIndexes;\r\n readonly pathInfo;\r\n \r\n /**\r\n * Constructs resolved path information from a property path string.\r\n * \r\n * Parses the path to identify wildcards (*) and numeric indexes,\r\n * classifies the wildcard type, and generates structured path information.\r\n * \r\n * @param name - Property path string (e.g., \"items.*.name\" or \"data.0.value\")\r\n */\r\n constructor(path: string) {\r\n // Split path into individual segments\r\n const segments = path.split(\".\");\r\n const tmpPatternSegments = segments.slice();\r\n const paths = [];\r\n let incompleteCount = 0; // Count of unresolved wildcards (*)\r\n let completeCount = 0; // Count of resolved wildcards (numeric indexes)\r\n let lastPath = \"\";\r\n let wildcardCount = 0;\r\n let wildcardType: WildcardType = \"none\";\r\n const wildcardIndexes: (number | null)[] = [];\r\n \r\n // Process each segment to identify wildcards and indexes\r\n for(let i = 0; i < segments.length; i++) {\r\n const segment = segments[i];\r\n if (segment === \"*\") {\r\n // Unresolved wildcard\r\n tmpPatternSegments[i] = \"*\";\r\n wildcardIndexes.push(null);\r\n incompleteCount++;\r\n wildcardCount++;\r\n } else {\r\n const number = Number(segment);\r\n if (!Number.isNaN(number)) {\r\n // Numeric index - treat as resolved wildcard\r\n tmpPatternSegments[i] = \"*\";\r\n wildcardIndexes.push(number);\r\n completeCount++;\r\n wildcardCount++;\r\n }\r\n }\r\n // Build cumulative path array\r\n lastPath += segment;\r\n paths.push(lastPath);\r\n lastPath += (i < segment.length - 1 ? \".\" : \"\");\r\n }\r\n // Generate pattern string with wildcards normalized\r\n const structuredPath = tmpPatternSegments.join(\".\");\r\n const pathInfo = getPathInfo(structuredPath);\r\n \r\n // Classify wildcard type based on resolved vs unresolved counts\r\n if (incompleteCount > 0 || completeCount > 0) {\r\n if (incompleteCount === wildcardCount) {\r\n // All wildcards are unresolved - need context to resolve\r\n wildcardType = \"context\";\r\n } else if (completeCount === wildcardCount) {\r\n // All wildcards are resolved with numeric indexes\r\n wildcardType = \"all\";\r\n } else {\r\n // Mix of resolved and unresolved wildcards\r\n wildcardType = \"partial\";\r\n }\r\n }\r\n this.path = path;\r\n this.segments = segments;\r\n this.paths = paths;\r\n this.wildcardCount = wildcardCount;\r\n this.wildcardType = wildcardType;\r\n this.wildcardIndexes = wildcardIndexes;\r\n this.pathInfo = pathInfo;\r\n }\r\n}\r\n\r\n/**\r\n * Retrieves or creates resolved path information for a property path.\r\n * \r\n * This function caches resolved path information for performance.\r\n * On first access, it parses the path and creates a ResolvedPathInfo instance.\r\n * Subsequent accesses return the cached result.\r\n * \r\n * @param name - Property path string (e.g., \"items.*.name\", \"data.0.value\")\r\n * @returns Resolved path information containing segments, wildcards, and type classification\r\n */\r\nexport function getResolvedAddress(name:string):IResolvedAddress {\r\n let nameInfo: IResolvedAddress | undefined;\r\n // Return cached value or create, cache, and return new instance\r\n return _cache.get(name) ?? (_cache.set(name, nameInfo = new ResolvedAddress(name)), nameInfo);\r\n}","import { IAbsoluteStateAddress } from \"../address/types\";\r\nimport { ICacheEntry } from \"./types\";\r\n\r\nconst cacheEntryByAbsoluteStateAddress: WeakMap<IAbsoluteStateAddress, ICacheEntry> = new WeakMap();\r\n\r\nexport function getCacheEntryByAbsoluteStateAddress(\r\n address: IAbsoluteStateAddress\r\n): ICacheEntry | null {\r\n return cacheEntryByAbsoluteStateAddress.get(address) ?? null;\r\n}\r\n\r\nexport function setCacheEntryByAbsoluteStateAddress(\r\n address: IAbsoluteStateAddress,\r\n cacheEntry: ICacheEntry | null\r\n): void {\r\n if (cacheEntry === null) {\r\n cacheEntryByAbsoluteStateAddress.delete(address);\r\n } else {\r\n cacheEntryByAbsoluteStateAddress.set(address, cacheEntry);\r\n }\r\n}\r\n\r\nexport function dirtyCacheEntryByAbsoluteStateAddress(\r\n address: IAbsoluteStateAddress\r\n): void {\r\n const cacheEntry = cacheEntryByAbsoluteStateAddress.get(address);\r\n if (cacheEntry) {\r\n cacheEntry.dirty = true;\r\n }\r\n}","/**\r\n * getByAddress.ts\r\n *\r\n * StateClassの内部APIとして、構造化パス情報(IStructuredPathInfo)とリストインデックス(IListIndex)を指定して\r\n * 状態オブジェクト(target)から値を取得するための関数(getByAddress)の実装です。\r\n *\r\n * 主な役割:\r\n * - 指定されたパス・インデックスに対応するState値を取得(多重ループやワイルドカードにも対応)\r\n * - 依存関係の自動登録(checkDependencyで登録)\r\n * - キャッシュ機構(リストもキャッシュ対象)\r\n * - getter経由で値取得時はpushAddressでスコープを一時設定\r\n * - 存在しない場合は親pathAddressやlistIndexを辿って再帰的に値を取得\r\n *\r\n * 設計ポイント:\r\n * - checkDependencyで依存追跡を実行 \r\n * - キャッシュ有効時はstateAddressで値をキャッシュし、取得・再利用を最適化\r\n * - ワイルドカードや多重ループにも柔軟に対応し、再帰的な値取得を実現\r\n * - finallyでキャッシュへの格納を保証\r\n */\r\n\r\nimport { getAbsolutePathInfo } from \"../../address/AbsolutePathInfo\";\r\nimport { createAbsoluteStateAddress } from \"../../address/AbsoluteStateAddress\";\r\nimport { IStateAddress } from \"../../address/types\";\r\nimport { getCacheEntryByAbsoluteStateAddress, setCacheEntryByAbsoluteStateAddress } from \"../../cache/cacheEntryByAbsoluteStateAddress\";\r\nimport { IStateElement } from \"../../components/types\";\r\nimport { WILDCARD } from \"../../define\";\r\nimport { raiseError } from \"../../raiseError\";\r\nimport { IStateHandler } from \"../types\";\r\nimport { checkDependency } from \"./checkDependency\";\r\n\r\nfunction _getByAddress(\r\n target : object, \r\n address : IStateAddress,\r\n receiver : any,\r\n handler : IStateHandler,\r\n stateElement: IStateElement,\r\n): any {\r\n if (address.pathInfo.path in target) {\r\n // getterの中で参照の可能性があるので、addressをプッシュする\r\n if (stateElement.getterPaths.has(address.pathInfo.path)) {\r\n handler.pushAddress(address);\r\n try {\r\n return Reflect.get(target, address.pathInfo.path, receiver);\r\n } finally {\r\n handler.popAddress();\r\n }\r\n } else {\r\n return Reflect.get(target, address.pathInfo.path);\r\n }\r\n } else {\r\n const parentAddress = address.parentAddress ?? raiseError(`address.parentAddress is undefined path: ${address.pathInfo.path}`);\r\n const parentValue = getByAddress(target, parentAddress, receiver, handler);\r\n const lastSegment = address.pathInfo.segments[address.pathInfo.segments.length - 1];\r\n if (lastSegment === WILDCARD) {\r\n const index = address.listIndex?.index ?? raiseError(`address.listIndex?.index is undefined path: ${address.pathInfo.path}`);\r\n return Reflect.get(parentValue, index);\r\n } else {\r\n return Reflect.get(parentValue, lastSegment);\r\n }\r\n }\r\n}\r\n\r\nfunction _getByAddressWithCache(\r\n target : object, \r\n address : IStateAddress,\r\n receiver : any,\r\n handler : IStateHandler,\r\n stateElement: IStateElement\r\n): any {\r\n const absPathInfo = getAbsolutePathInfo(stateElement, address.pathInfo);\r\n const absAddress = createAbsoluteStateAddress(absPathInfo, address.listIndex);\r\n const cacheEntry = getCacheEntryByAbsoluteStateAddress(absAddress);\r\n if (cacheEntry !== null && cacheEntry.dirty === false) {\r\n return cacheEntry.value;\r\n }\r\n const value = _getByAddress(target, address, receiver, handler, stateElement);\r\n setCacheEntryByAbsoluteStateAddress(absAddress, {\r\n value: value,\r\n dirty: false\r\n });\r\n return value;\r\n}\r\n\r\nexport function getByAddress(\r\n target : object,\r\n address : IStateAddress,\r\n receiver : any,\r\n handler : IStateHandler\r\n): any {\r\n checkDependency(handler, address);\r\n const stateElement = handler.stateElement;\r\n const cacheable = address.pathInfo.wildcardCount > 0 || \r\n stateElement.getterPaths.has(address.pathInfo.path);\r\n if (cacheable) {\r\n return _getByAddressWithCache(target, address, receiver, handler, stateElement);\r\n } else {\r\n return _getByAddress(target, address, receiver, handler, stateElement);\r\n }\r\n}\r\n","import { IStateAddress } from \"../../address/types\";\r\nimport { IStateHandler } from \"../types\";\r\n\r\nexport function checkDependency(\r\n handler: IStateHandler,\r\n address: IStateAddress,\r\n): void {\r\n // 動的依存関係の登録\r\n if (handler.addressStackLength > 0) {\r\n const lastInfo = handler.lastAddressStack?.pathInfo ?? null;\r\n const stateElement = handler.stateElement;\r\n if (lastInfo !== null) {\r\n if (stateElement.getterPaths.has(lastInfo.path) &&\r\n lastInfo.path !== address.pathInfo.path) {\r\n // lastInfo.pathはgetterの名前であり、address.pathInfo.pathは\r\n // そのgetterが参照している値のパスである\r\n stateElement.addDynamicDependency(address.pathInfo.path, lastInfo.path);\r\n }\r\n }\r\n }\r\n}","/**\r\n * getContextListIndex.ts\r\n *\r\n * Stateの内部APIとして、現在のプロパティ参照スコープにおける\r\n * 指定したstructuredPath(ワイルドカード付きプロパティパス)に対応する\r\n * リストインデックス(IListIndex)を取得する関数です。\r\n *\r\n * 主な役割:\r\n * - handlerの最後にアクセスされたAddressから、指定パスに対応するリストインデックスを取得\r\n * - ワイルドカード階層に対応し、多重ループやネストした配列バインディングにも利用可能\r\n *\r\n * 設計ポイント:\r\n * - 直近のプロパティ参照情報を取得\r\n * - info.indexByWildcardPathからstructuredPathのインデックスを特定\r\n * - listIndex.at(index)で該当階層のリストインデックスを取得\r\n * - パスが一致しない場合や参照が存在しない場合はnullを返す\r\n */\r\n\r\nimport { IListIndex } from \"../../list/types\";\r\nimport { IStateHandler } from \"../types\";\r\n\r\nexport function getContextListIndex(\r\n handler: IStateHandler,\r\n structuredPath: string\r\n): IListIndex | null {\r\n if (handler.addressStackLength === 0) {\r\n return null;\r\n }\r\n const address = handler.lastAddressStack;\r\n if (address === null) {\r\n return null;\r\n }\r\n const index: number | undefined = address.pathInfo.indexByWildcardPath[structuredPath];\r\n if (typeof index === \"undefined\") {\r\n return null;\r\n }\r\n return address.listIndex?.at(index) ?? null;\r\n}\r\n","import { IAbsoluteStateAddress } from \"../address/types\";\r\nimport { applyChangeFromBindings } from \"../apply/applyChangeFromBindings\";\r\nimport { getBindingSetByAbsoluteStateAddress } from \"../binding/getBindingSetByAbsoluteStateAddress\";\r\nimport { IBindingInfo } from \"../types\";\r\n\r\nclass Updater {\r\n private _queueAbsoluteAddresses: IAbsoluteStateAddress[] = [];\r\n constructor() {\r\n }\r\n\r\n enqueueAbsoluteAddress(absoluteAddress: IAbsoluteStateAddress): void {\r\n const requireStartProcess = this._queueAbsoluteAddresses.length === 0;\r\n this._queueAbsoluteAddresses.push(absoluteAddress);\r\n if (requireStartProcess) {\r\n queueMicrotask(() => {\r\n const absoluteAddresses = this._queueAbsoluteAddresses;\r\n this._queueAbsoluteAddresses = [];\r\n this._applyChange(absoluteAddresses);\r\n });\r\n }\r\n }\r\n\r\n // テスト用に公開\r\n testApplyChange(absoluteAddresses: IAbsoluteStateAddress[]): void {\r\n this._applyChange(absoluteAddresses);\r\n }\r\n\r\n private _applyChange(absoluteAddresses: IAbsoluteStateAddress[]): void {\r\n // Note: AbsoluteStateAddress はキャッシュされているため、\r\n // 同一の (stateName, address) は同じインスタンスとなり、\r\n // Set による重複排除が正しく機能する \r\n const absoluteAddressSet = new Set(absoluteAddresses);\r\n const processBindings: IBindingInfo[] = [];\r\n for (const absoluteAddress of absoluteAddressSet) {\r\n const bindings = getBindingSetByAbsoluteStateAddress(absoluteAddress);\r\n for(const binding of bindings) {\r\n if (binding.replaceNode.isConnected === false) {\r\n // 切断されているバインディングは無視\r\n continue;\r\n }\r\n processBindings.push(binding);\r\n }\r\n }\r\n applyChangeFromBindings(\r\n processBindings\r\n );\r\n }\r\n\r\n}\r\n\r\nconst updater = new Updater();\r\n\r\nexport function getUpdater(): Updater {\r\n return updater;\r\n}\r\n\r\n// テスト用にprivateメソッドを公開\r\nexport const __private__ = {\r\n Updater,\r\n};\r\n","import { IStateAddress } from \"../../address/types\";\r\nimport { ISwapInfo } from \"./types\";\r\n\r\nconst swapInfoByStateAddress: WeakMap<IStateAddress, ISwapInfo> = new WeakMap();\r\n\r\nexport function getSwapInfoByAddress(address: IStateAddress): ISwapInfo | null {\r\n return swapInfoByStateAddress.get(address) ?? null;\r\n}\r\n\r\nexport function setSwapInfoByAddress(address: IStateAddress, swapInfo: ISwapInfo | null): void {\r\n if (swapInfo === null) {\r\n swapInfoByStateAddress.delete(address);\r\n } else {\r\n swapInfoByStateAddress.set(address, swapInfo);\r\n }\r\n}\r\n","import { getAbsolutePathInfo } from \"../address/AbsolutePathInfo\";\r\nimport { createAbsoluteStateAddress } from \"../address/AbsoluteStateAddress\";\r\nimport { calcWildcardLen } from \"../address/calcWildcardLen\";\r\nimport { getPathInfo } from \"../address/PathInfo\";\r\nimport { createStateAddress } from \"../address/StateAddress\";\r\nimport { IPathInfo, IStateAddress } from \"../address/types\";\r\nimport { IStateElement } from \"../components/types\";\r\nimport { config } from \"../config\";\r\nimport { WILDCARD } from \"../define\";\r\nimport { createListDiff } from \"../list/createListDiff\";\r\nimport { getLastListValueByAbsoluteStateAddress } from \"../list/lastListValueByAbsoluteStateAddress\";\r\nimport { IListDiff, IListIndex } from \"../list/types\";\r\nimport { getByAddressSymbol } from \"../proxy/symbols\";\r\nimport { IStateProxy } from \"../proxy/types\";\r\nimport { raiseError } from \"../raiseError\";\r\nimport { SearchType } from \"./types\";\r\n\r\nconst MAX_DEPENDENCY_DEPTH = 1000;\r\n\r\nfunction getIndexes(listDiff: IListDiff, searchType: SearchType): Iterable<IListIndex> {\r\n switch (searchType) {\r\n case \"old\":\r\n return listDiff.oldIndexes;\r\n case \"new\":\r\n return listDiff.newIndexes;\r\n case \"add\":\r\n return listDiff.addIndexSet;\r\n case \"change\":\r\n return listDiff.changeIndexSet;\r\n case \"delete\":\r\n return listDiff.deleteIndexSet;\r\n default: \r\n if (config.debug) {\r\n console.log(`Invalid search type: ${searchType}`);\r\n }\r\n return [];\r\n }\r\n}\r\n\r\ntype ExpandContext = {\r\n readonly stateName: string,\r\n readonly stateElement: IStateElement,\r\n readonly targetPathInfo: IPathInfo,\r\n readonly targetListIndexes: IListIndex[],\r\n readonly wildcardPaths: string[],\r\n readonly wildcardParentPaths: string[],\r\n readonly stateProxy: IStateProxy,\r\n readonly searchType: SearchType\r\n}\r\n\r\nfunction _walkExpandWildcard(\r\n context: ExpandContext, \r\n currentWildcardIndex: number,\r\n parentListIndex: IListIndex | null\r\n): void {\r\n const parentPath = context.wildcardParentPaths[currentWildcardIndex];\r\n const parentPathInfo = getPathInfo(parentPath);\r\n const parentAbsPathInfo = getAbsolutePathInfo(context.stateElement, parentPathInfo);\r\n const parentAddress = createStateAddress(parentPathInfo, parentListIndex);\r\n const parentAbsAddress = createAbsoluteStateAddress(parentAbsPathInfo, parentListIndex);\r\n const lastValue = getLastListValueByAbsoluteStateAddress(parentAbsAddress);\r\n const newValue = context.stateProxy[getByAddressSymbol](parentAddress);\r\n const listDiff = createListDiff(parentAddress.listIndex, lastValue, newValue);\r\n\r\n const loopIndexes = getIndexes(listDiff, context.searchType);\r\n if (currentWildcardIndex === context.wildcardPaths.length - 1) {\r\n context.targetListIndexes.push(...loopIndexes);\r\n } else {\r\n for(const listIndex of loopIndexes) {\r\n _walkExpandWildcard(\r\n context,\r\n currentWildcardIndex + 1,\r\n listIndex\r\n );\r\n }\r\n }\r\n}\r\n\r\ntype Context = {\r\n readonly stateName: string,\r\n readonly stateElement: IStateElement,\r\n readonly staticMap: Map<string, string[]>,\r\n readonly dynamicMap: Map<string, string[]>, \r\n readonly result: Set<IStateAddress>,\r\n readonly listPathSet: Set<string>,\r\n readonly visited: Set<IStateAddress>,\r\n readonly stateProxy: IStateProxy,\r\n readonly searchType: SearchType,\r\n}\r\n\r\ntype StackEntry = { address: IStateAddress, depth: number };\r\n\r\nfunction _walkDependency(\r\n context: Context,\r\n startAddress: IStateAddress,\r\n callback: (address: IStateAddress) => void\r\n): void {\r\n const stack: StackEntry[] = [{ address: startAddress, depth: 0 }];\r\n\r\n while (stack.length > 0) {\r\n const { address, depth } = stack.pop()!;\r\n if (depth > MAX_DEPENDENCY_DEPTH) {\r\n raiseError(`Maximum dependency depth of ${MAX_DEPENDENCY_DEPTH} exceeded. Possible circular dependency detected at path: ${address.pathInfo.path}`);\r\n }\r\n if (context.visited.has(address)) {\r\n continue;\r\n }\r\n context.visited.add(address);\r\n callback(address);\r\n const sourcePath = address.pathInfo.path;\r\n const nextDepth = depth + 1;\r\n\r\n // 依存アドレスを逆順でpushするための一時バッファ\r\n const nextEntries: StackEntry[] = [];\r\n\r\n /**\r\n * パスから依存関係をたどる\r\n * users.*.name <= users.* <= users\r\n * ただし、users がリストであれば users.* の依存関係は展開する\r\n */\r\n const staticDeps = context.staticMap.get(sourcePath);\r\n if (staticDeps) {\r\n for(const dep of staticDeps) {\r\n const depPathInfo = getPathInfo(dep);\r\n if (context.listPathSet.has(sourcePath) && depPathInfo.lastSegment === WILDCARD) {\r\n //expand indexes\r\n const newValue = context.stateProxy[getByAddressSymbol](address);\r\n const absPathInfo = getAbsolutePathInfo(context.stateElement, address.pathInfo);\r\n const absAddress = createAbsoluteStateAddress(absPathInfo, address.listIndex);\r\n const lastValue = getLastListValueByAbsoluteStateAddress(absAddress);\r\n const listDiff = createListDiff(address.listIndex, lastValue, newValue);\r\n for(const listIndex of listDiff.newIndexes) {\r\n const depAddress = createStateAddress(depPathInfo, listIndex);\r\n context.result.add(depAddress);\r\n nextEntries.push({ address: depAddress, depth: nextDepth });\r\n }\r\n } else {\r\n const depAddress = createStateAddress(depPathInfo, address.listIndex);\r\n context.result.add(depAddress);\r\n nextEntries.push({ address: depAddress, depth: nextDepth });\r\n }\r\n }\r\n }\r\n /**\r\n * 動的依存関係をたどる\r\n * 動的依存関係は、getterの実行時に決定される\r\n *\r\n * source, target\r\n *\r\n * products.*.price => products.*.tax\r\n * get \"products.*.tax\"() { return this[\"products.*.price\"] * 0.1; }\r\n *\r\n * products.*.price => products.summary\r\n * get \"products.summary\"() { return this.$getAll(\"products.*.price\", []).reduce(sum); }\r\n *\r\n * categories.*.name => categories.*.products.*.categoryName\r\n * get \"categories.*.products.*.categoryName\"() { return this[\"categories.*.name\"]; }\r\n */\r\n const dynamicDeps = context.dynamicMap.get(sourcePath);\r\n if (dynamicDeps) {\r\n for(const dep of dynamicDeps) {\r\n const depPathInfo = getPathInfo(dep);\r\n const listIndexes: (IListIndex | null)[] = [];\r\n if (depPathInfo.wildcardCount > 0) {\r\n // ワイルドカードを含む依存関係の処理\r\n // 同じ親を持つかをパスの集合積で判定する\r\n // polyfills.tsにてSetのintersectionメソッドを定義している\r\n const wildcardLen = calcWildcardLen(address.pathInfo, depPathInfo);\r\n const expandable = (depPathInfo.wildcardCount - wildcardLen) >= 1;\r\n if (expandable) {\r\n let listIndex: IListIndex | null;\r\n if (wildcardLen > 0) {\r\n // categories.*.name => categories.*.products.*.categoryName\r\n // ワイルドカードを含む同じ親(products.*)を持つのが、\r\n // さらに下位にワイルドカードがあるので展開する\r\n if (address.listIndex === null) {\r\n raiseError(`Cannot expand dynamic dependency with wildcard for non-list address: ${address.pathInfo.path}`);\r\n }\r\n listIndex = address.listIndex!.at(wildcardLen - 1);\r\n } else {\r\n // selectedIndex => items.*.selected\r\n // 同じ親を持たない場合はnullから開始\r\n listIndex = null;\r\n }\r\n const expandContext: ExpandContext = {\r\n stateName: context.stateName,\r\n stateElement: context.stateElement,\r\n targetPathInfo: depPathInfo,\r\n targetListIndexes: [],\r\n wildcardPaths: depPathInfo.wildcardPaths,\r\n wildcardParentPaths: depPathInfo.wildcardParentPaths,\r\n stateProxy: context.stateProxy,\r\n searchType: context.searchType,\r\n };\r\n _walkExpandWildcard(expandContext, wildcardLen, listIndex);\r\n listIndexes.push(...expandContext.targetListIndexes);\r\n } else {\r\n // products.*.price => products.*.tax\r\n // ワイルドカードを含む同じ親(products.*)を持つので、リストインデックスは引き継ぐ\r\n if (address.listIndex === null) {\r\n raiseError(`Cannot expand dynamic dependency with wildcard for non-list address: ${address.pathInfo.path}`);\r\n }\r\n const listIndex = address.listIndex.at(wildcardLen - 1);\r\n listIndexes.push(listIndex);\r\n }\r\n } else {\r\n // products.*.tax => currentTaxRate\r\n // 同じ親を持たないので、リストインデックスはnull\r\n listIndexes.push(null);\r\n }\r\n for(const listIndex of listIndexes) {\r\n const depAddress = createStateAddress(depPathInfo, listIndex);\r\n context.result.add(depAddress);\r\n nextEntries.push({ address: depAddress, depth: nextDepth });\r\n }\r\n }\r\n }\r\n\r\n // 逆順でpushして、元の再帰と同じ探索順序を保つ\r\n for(let i = nextEntries.length - 1; i >= 0; i--) {\r\n stack.push(nextEntries[i]);\r\n }\r\n }\r\n}\r\n\r\nexport function walkDependency(\r\n stateName: string,\r\n stateElement: IStateElement,\r\n startAddress: IStateAddress,\r\n staticDependency: Map<string, string[]>,\r\n dynamicDependency: Map<string, string[]>,\r\n listPathSet: Set<string>,\r\n stateProxy: IStateProxy,\r\n searchType: SearchType,\r\n callback: (address: IStateAddress) => void\r\n): IStateAddress[] {\r\n const context: Context = {\r\n stateName: stateName,\r\n stateElement: stateElement,\r\n staticMap: staticDependency,\r\n dynamicMap: dynamicDependency,\r\n result: new Set<IStateAddress>(),\r\n listPathSet: listPathSet,\r\n visited: new Set<IStateAddress>(),\r\n stateProxy: stateProxy,\r\n searchType: searchType,\r\n };\r\n _walkDependency(context, startAddress, callback);\r\n return Array.from(context.result);\r\n}\r\n","/**\r\n * setByAddress.ts\r\n *\r\n * Stateの内部APIとして、アドレス情報(IStateAddress)を指定して\r\n * 状態オブジェクト(target)に値を設定するための関数(setByAddress)の実装です。\r\n *\r\n * 主な役割:\r\n * - 指定されたパス・インデックスに対応するState値を設定(多重ループやワイルドカードにも対応)\r\n * - getter/setter経由で値設定時はpushAddressでスコープを一時設定\r\n * - 存在しない場合は親pathInfoやlistIndexを辿って再帰的に値を設定\r\n * - 設定後はupdater.enqueueUpdateAddressで更新情報を登録\r\n *\r\n * 設計ポイント:\r\n * - ワイルドカードや多重ループにも柔軟に対応し、再帰的な値設定を実現\r\n * - finallyで必ず更新情報を登録し、再描画や依存解決に利用\r\n * - getter/setter経由のスコープ切り替えも考慮した設計\r\n */\r\n\r\nimport { createAbsoluteStateAddress } from \"../../address/AbsoluteStateAddress\";\r\nimport { IAbsoluteStateAddress, IStateAddress } from \"../../address/types\";\r\nimport { WILDCARD } from \"../../define\";\r\nimport { createListIndex } from \"../../list/createListIndex\";\r\nimport { getListIndexesByList } from \"../../list/listIndexesByList\";\r\nimport { raiseError } from \"../../raiseError\";\r\nimport { getUpdater } from \"../../updater/updater\";\r\nimport { IStateHandler, IStateProxy } from \"../types\";\r\nimport { getByAddress } from \"./getByAddress\";\r\nimport { getSwapInfoByAddress, setSwapInfoByAddress } from \"./swapInfo\";\r\nimport { walkDependency } from \"../../dependency/walkDependency\";\r\nimport { dirtyCacheEntryByAbsoluteStateAddress, setCacheEntryByAbsoluteStateAddress } from \"../../cache/cacheEntryByAbsoluteStateAddress\";\r\nimport { getAbsolutePathInfo } from \"../../address/AbsolutePathInfo\";\r\n\r\nfunction _setByAddress(\r\n target : object, \r\n address : IStateAddress,\r\n absAddress: IAbsoluteStateAddress,\r\n value : any, \r\n receiver : any,\r\n handler : IStateHandler\r\n): any {\r\n try {\r\n if (address.pathInfo.path in target) {\r\n if (handler.stateElement.setterPaths.has(address.pathInfo.path)) {\r\n // setterの中で参照の可能性があるので、addressをプッシュする\r\n handler.pushAddress(address);\r\n try {\r\n return Reflect.set(target, address.pathInfo.path, value, receiver);\r\n } finally {\r\n handler.popAddress();\r\n }\r\n } else {\r\n return Reflect.set(target, address.pathInfo.path, value);\r\n }\r\n } else {\r\n const parentAddress = address.parentAddress ?? raiseError(`address.parentAddress is undefined path: ${address.pathInfo.path}`);\r\n const parentValue = getByAddress(target, parentAddress, receiver, handler);\r\n const lastSegment = address.pathInfo.segments[address.pathInfo.segments.length - 1];\r\n if (lastSegment === WILDCARD) {\r\n const index = address.listIndex?.index ?? raiseError(`address.listIndex?.index is undefined path: ${address.pathInfo.path}`);\r\n return Reflect.set(parentValue, index, value);\r\n } else {\r\n return Reflect.set(parentValue, lastSegment, value);\r\n }\r\n }\r\n } finally {\r\n const updater = getUpdater();\r\n updater.enqueueAbsoluteAddress(absAddress);\r\n // 依存関係のあるキャッシュを無効化(ダーティ)、更新対象として登録\r\n walkDependency(\r\n handler.stateName,\r\n handler.stateElement,\r\n address,\r\n handler.stateElement.staticDependency,\r\n handler.stateElement.dynamicDependency,\r\n handler.stateElement.listPaths,\r\n receiver as IStateProxy,\r\n \"new\",\r\n (depAddress: IStateAddress) => {\r\n // キャッシュを無効化(ダーティ)\r\n if (depAddress === address) return;\r\n const absDepPathInfo = getAbsolutePathInfo(handler.stateElement, depAddress.pathInfo);\r\n const absDepAddress = createAbsoluteStateAddress(absDepPathInfo, depAddress.listIndex);\r\n dirtyCacheEntryByAbsoluteStateAddress(absDepAddress);\r\n // 更新対象として登録\r\n updater.enqueueAbsoluteAddress(absDepAddress);\r\n }\r\n )\r\n }\r\n}\r\n\r\nfunction _setByAddressWithSwap(\r\n target : object, \r\n address : IStateAddress,\r\n absAddress: IAbsoluteStateAddress,\r\n value : any, \r\n receiver : any,\r\n handler : IStateHandler\r\n) {\r\n // elementsの場合はswapInfoを準備\r\n let parentAddress = address.parentAddress ?? raiseError(`address.parentAddress is undefined path: ${address.pathInfo.path}`);\r\n let swapInfo = getSwapInfoByAddress(parentAddress);\r\n if (swapInfo === null) {\r\n const parentValue = getByAddress(target, parentAddress, receiver, handler) ?? [];\r\n const listIndexes = getListIndexesByList(parentValue) ?? [];\r\n swapInfo = {\r\n value: [...parentValue], listIndexes: [...listIndexes]\r\n }\r\n setSwapInfoByAddress(parentAddress, swapInfo);\r\n }\r\n try {\r\n return _setByAddress(target, address, absAddress, value, receiver, handler);\r\n } finally {\r\n const index = swapInfo.value.indexOf(value);\r\n const currentParentValue = getByAddress(target, parentAddress, receiver, handler) ?? [];\r\n const currentListIndexes = Array.isArray(currentParentValue) ? (getListIndexesByList(currentParentValue) ?? []) : [];\r\n const curIndex = address.listIndex!.index;\r\n const listIndex = (index !== -1) ? \r\n swapInfo!.listIndexes[index] : \r\n createListIndex(parentAddress.listIndex, -1);\r\n currentListIndexes[curIndex] = listIndex;\r\n // 重複チェック\r\n // 重複していない場合、swapが完了したとみなし、インデックスを更新\r\n const listValueSet = new Set(currentParentValue);\r\n if (listValueSet.size === swapInfo!.value.length) {\r\n for(let i = 0; i < currentListIndexes.length; i++) {\r\n currentListIndexes[i].index = i;\r\n }\r\n // 完了したのでswapInfoを削除\r\n setSwapInfoByAddress(parentAddress, null);\r\n }\r\n }\r\n}\r\n\r\nexport function setByAddress(\r\n target : object, \r\n address : IStateAddress,\r\n value : any, \r\n receiver : any,\r\n handler : IStateHandler\r\n): any {\r\n const stateElement = handler.stateElement;\r\n const isSwappable = stateElement.elementPaths.has(address.pathInfo.path);\r\n const cacheable = address.pathInfo.wildcardCount > 0 || \r\n stateElement.getterPaths.has(address.pathInfo.path);\r\n const absPathInfo = getAbsolutePathInfo(stateElement, address.pathInfo);\r\n const absAddress = createAbsoluteStateAddress(absPathInfo, address.listIndex);\r\n try {\r\n if (isSwappable) {\r\n return _setByAddressWithSwap(target, address, absAddress, value, receiver, handler);\r\n } else {\r\n return _setByAddress(target, address, absAddress, value, receiver, handler);\r\n }\r\n } finally {\r\n if (cacheable) {\r\n setCacheEntryByAbsoluteStateAddress(absAddress, {\r\n value: value,\r\n dirty: false\r\n });\r\n }\r\n // DCC bindable イベントディスパッチ\r\n const eventName = stateElement.bindableEventMap[address.pathInfo.path];\r\n if (eventName) {\r\n const rootNode = stateElement.rootNode;\r\n if (rootNode instanceof ShadowRoot) {\r\n rootNode.host.dispatchEvent(new CustomEvent(eventName, {\r\n detail: value,\r\n bubbles: true,\r\n }));\r\n }\r\n }\r\n }\r\n}\r\n\r\n","/**\r\n * resolve.ts\r\n *\r\n * StateClassのAPIとして、パス(path)とインデックス(indexes)を指定して\r\n * Stateの値を取得・設定するための関数(resolve)の実装です。\r\n *\r\n * 主な役割:\r\n * - 文字列パス(path)とインデックス配列(indexes)から、該当するState値の取得・設定を行う\r\n * - ワイルドカードや多重ループを含むパスにも対応\r\n * - value未指定時は取得(getByRef)、指定時は設定(setByRef)を実行\r\n *\r\n * 設計ポイント:\r\n * - getStructuredPathInfoでパスを解析し、ワイルドカード階層ごとにリストインデックスを解決\r\n * - handler.engine.getListIndexesSetで各階層のリストインデックス集合を取得\r\n * - getByRef/setByRefで値の取得・設定を一元的に処理\r\n * - 柔軟なバインディングやAPI経由での利用が可能\r\n */\r\n\r\nimport { getPathInfo } from \"../../address/PathInfo\";\r\nimport { createStateAddress } from \"../../address/StateAddress\";\r\nimport { getListIndexesByList } from \"../../list/listIndexesByList\";\r\nimport { IListIndex } from \"../../list/types\";\r\nimport { raiseError } from \"../../raiseError\";\r\nimport { getByAddress } from \"../methods/getByAddress\";\r\nimport { setByAddress } from \"../methods/setByAddress\";\r\nimport { IStateHandler } from \"../types\";\r\n\r\ntype ResolveFunction = (path: string, indexes: number[], value?: any) => any;\r\n\r\nexport function resolve(\r\n target: object, \r\n _prop: PropertyKey, \r\n receiver: any,\r\n handler: IStateHandler\r\n): ResolveFunction {\r\n return (path: string, indexes: number[], value?: any): any => {\r\n const pathInfo = getPathInfo(path);\r\n if (handler.addressStackLength > 0) {\r\n const lastInfo = handler.lastAddressStack?.pathInfo ?? null;\r\n const stateElement = handler.stateElement;\r\n if (lastInfo !== null && lastInfo.path !== pathInfo.path) {\r\n // gettersに含まれる場合は依存関係を登録\r\n if (stateElement.getterPaths.has(lastInfo.path)) {\r\n stateElement.addDynamicDependency(pathInfo.path, lastInfo.path);\r\n }\r\n }\r\n }\r\n\r\n if (pathInfo.wildcardParentPathInfos.length > indexes.length) {\r\n raiseError(`indexes length is insufficient: ${path}`);\r\n }\r\n // ワイルドカード階層ごとにListIndexを解決していく\r\n let listIndex: IListIndex | null = null;\r\n for(let i = 0; i < pathInfo.wildcardParentPathInfos.length; i++) {\r\n const wildcardParentPathInfo = pathInfo.wildcardParentPathInfos[i];\r\n const wildcardAddress = createStateAddress(wildcardParentPathInfo, listIndex);\r\n const tmpValue = getByAddress(target, wildcardAddress, receiver, handler);\r\n const listIndexes = getListIndexesByList(tmpValue);\r\n if (listIndexes == null) {\r\n raiseError(`ListIndexes not found: ${wildcardParentPathInfo.path}`);\r\n }\r\n const index = indexes[i];\r\n listIndex = listIndexes[index] ?? \r\n raiseError(`ListIndex not found: ${wildcardParentPathInfo.path}`);\r\n }\r\n\r\n // ToDo:WritableかReadonlyかを判定して適切なメソッドを呼び出す\r\n const address = createStateAddress(pathInfo, listIndex);\r\n const hasSetValue = typeof value !== \"undefined\";\r\n if (!hasSetValue) {\r\n return getByAddress(target, address, receiver, handler);\r\n } else {\r\n setByAddress(target, address, value, receiver, handler);\r\n }\r\n };\r\n} ","/**\r\n * getAllReadonly\r\n *\r\n * ワイルドカードを含む State パスから、対象となる全要素を配列で取得する。\r\n * Throws: LIST-201(インデックス未解決)、BIND-201(ワイルドカード情報不整合)\r\n */\r\n\r\nimport { getPathInfo } from \"../../address/PathInfo\";\r\nimport { createStateAddress } from \"../../address/StateAddress\";\r\nimport { IPathInfo, IStateAddress } from \"../../address/types\";\r\nimport { createListDiff } from \"../../list/createListDiff\";\r\nimport { IListIndex } from \"../../list/types\";\r\nimport { raiseError } from \"../../raiseError\";\r\nimport { getByAddress } from \"../methods/getByAddress\";\r\nimport { getContextListIndex } from \"../methods/getContextListIndex\";\r\nimport { IStateHandler } from \"../types\";\r\nimport { resolve } from \"./resolve\";\r\n\r\n// ToDo: IAbsoluteStateAddressに変更する\r\nconst lastValueByListAddress = new WeakMap<IStateAddress, unknown[]>();\r\n\r\ntype GetAllFunction = (path: string, indexes?: number[]) => any[];\r\n\r\nexport function getAll(\r\n target: object, \r\n prop: PropertyKey, \r\n receiver: any,\r\n handler: IStateHandler\r\n): GetAllFunction {\r\n const resolveFn = resolve(target, prop, receiver, handler);\r\n return (path: string, indexes?: number[]): any[] => {\r\n const newValueByAddress: Map<IStateAddress, any> = new Map();\r\n const pathInfo = getPathInfo(path);\r\n if (handler.addressStackLength > 0) {\r\n const lastInfo = handler.lastAddressStack?.pathInfo ?? null;\r\n const stateElement = handler.stateElement;\r\n if (lastInfo !== null && lastInfo.path !== pathInfo.path) {\r\n // gettersに含まれる場合は依存関係を登録\r\n if (stateElement.getterPaths.has(lastInfo.path)) {\r\n stateElement.addDynamicDependency(pathInfo.path, lastInfo.path);\r\n }\r\n }\r\n }\r\n \r\n if (typeof indexes === \"undefined\") {\r\n for(let i = 0; i < pathInfo.wildcardParentPathInfos.length; i++) {\r\n const wildcardPattern = pathInfo.wildcardParentPathInfos[i];\r\n const listIndex = getContextListIndex(handler, wildcardPattern.path);\r\n if (listIndex) {\r\n indexes = listIndex.indexes;\r\n break;\r\n }\r\n }\r\n if (typeof indexes === \"undefined\") {\r\n indexes = [];\r\n }\r\n }\r\n const walkWildcardPattern = (\r\n wildcardParentPathInfos: IPathInfo[],\r\n wildcardIndexPos: number,\r\n listIndex: IListIndex | null,\r\n indexes: number[],\r\n indexPos: number,\r\n parentIndexes: number[],\r\n results: number[][]\r\n ) => {\r\n const wildcardParentPathInfo = wildcardParentPathInfos[wildcardIndexPos] ?? null;\r\n if (wildcardParentPathInfo === null) {\r\n results.push(parentIndexes);\r\n return;\r\n }\r\n const wildcardAddress = createStateAddress(wildcardParentPathInfo, listIndex);\r\n const oldValue = lastValueByListAddress.get(wildcardAddress);\r\n const newValue = getByAddress(target, wildcardAddress, receiver, handler);\r\n const listDiff = createListDiff(listIndex, oldValue, newValue);\r\n const listIndexes = listDiff.newIndexes;\r\n const index = indexes[indexPos] ?? null;\r\n newValueByAddress.set(wildcardAddress, newValue);\r\n if (index === null) {\r\n for(let i = 0; i < listIndexes.length; i++) {\r\n const listIndex = listIndexes[i];\r\n walkWildcardPattern(\r\n wildcardParentPathInfos, \r\n wildcardIndexPos + 1, \r\n listIndex, \r\n indexes, \r\n indexPos + 1, \r\n parentIndexes.concat(listIndex.index),\r\n results);\r\n }\r\n } else {\r\n const listIndex = listIndexes[index] ?? \r\n raiseError(`ListIndex not found: ${wildcardParentPathInfo.path}`);\r\n if ((wildcardIndexPos + 1) < wildcardParentPathInfos.length) {\r\n walkWildcardPattern(\r\n wildcardParentPathInfos, \r\n wildcardIndexPos + 1, \r\n listIndex, \r\n indexes, \r\n indexPos + 1, \r\n parentIndexes.concat(listIndex.index),\r\n results\r\n );\r\n } else {\r\n // 最終ワイルドカード層まで到達しているので、結果を確定\r\n results.push(parentIndexes.concat(listIndex.index));\r\n }\r\n }\r\n }\r\n const resultIndexes: number[][] = [];\r\n walkWildcardPattern(\r\n pathInfo.wildcardParentPathInfos, \r\n 0, \r\n null, \r\n indexes, \r\n 0, \r\n [], \r\n resultIndexes\r\n );\r\n const resultValues: any[] = [];\r\n for(let i = 0; i < resultIndexes.length; i++) {\r\n resultValues.push(resolveFn(\r\n pathInfo.path,\r\n resultIndexes[i]\r\n ));\r\n }\r\n for(const [address, newValue] of newValueByAddress.entries()) {\r\n lastValueByListAddress.set(address, newValue);\r\n }\r\n return resultValues;\r\n }\r\n }\r\n","/**\r\n * getListIndex.ts\r\n *\r\n * StateClassの内部APIとして、パス情報(IResolvedAddress)から\r\n * 対応するリストインデックス(IListIndex)を取得する関数です。\r\n *\r\n * 主な役割:\r\n * - パスのワイルドカード種別(context/all/partial/none)に応じてリストインデックスを解決\r\n * - context型は現在のループコンテキストからリストインデックスを取得\r\n * - all型は各階層のリストインデックス集合からインデックスを辿って取得\r\n * - partial型やnone型は未実装またはnullを返す\r\n *\r\n * 設計ポイント:\r\n * - ワイルドカードや多重ループ、ネストした配列バインディングに柔軟に対応\r\n * - getListIndexesByListで各階層のリストインデックス集合を取得\r\n * - エラー時はraiseErrorで例外を投げる\r\n */\r\n\r\nimport { createStateAddress } from \"../../address/StateAddress\";\r\nimport { IResolvedAddress } from \"../../address/types\";\r\nimport { getListIndexesByList } from \"../../list/listIndexesByList\";\r\nimport { IListIndex } from \"../../list/types\";\r\nimport { raiseError } from \"../../raiseError\";\r\nimport { IStateHandler } from \"../types\";\r\nimport { getByAddress } from \"./getByAddress\";\r\nimport { getContextListIndex } from \"./getContextListIndex\";\r\n\r\nexport function getListIndex(\r\n target : object, \r\n resolvedAddress: IResolvedAddress, \r\n receiver: any,\r\n handler: IStateHandler\r\n): IListIndex | null {\r\n const pathInfo = resolvedAddress.pathInfo;\r\n switch (resolvedAddress.wildcardType) {\r\n case \"none\":\r\n return null;\r\n case \"context\": {\r\n const lastWildcardPath = pathInfo.wildcardPaths.at(-1) ?? \r\n raiseError(`lastWildcardPath is null: ${resolvedAddress.pathInfo.path}`);\r\n return getContextListIndex(handler, lastWildcardPath) ?? \r\n raiseError(`ListIndex not found: ${resolvedAddress.pathInfo.path}`);\r\n }\r\n case \"all\": {\r\n let parentListIndex: IListIndex | null = null;\r\n for(let i = 0; i < resolvedAddress.pathInfo.wildcardCount; i++) {\r\n const wildcardParentPathInfo = resolvedAddress.pathInfo.wildcardParentPathInfos[i] ?? \r\n raiseError(`wildcardParentPathInfo is null: ${resolvedAddress.pathInfo.path}`);\r\n const wildcardParentAddress = createStateAddress(wildcardParentPathInfo, parentListIndex);\r\n const wildcardParentValue = getByAddress(target, wildcardParentAddress, receiver, handler);\r\n const wildcardParentListIndexes: IListIndex[] = getListIndexesByList(wildcardParentValue) ?? \r\n raiseError( `ListIndex not found: ${wildcardParentPathInfo.path}`);\r\n const wildcardIndex = resolvedAddress.wildcardIndexes[i] ?? \r\n raiseError(`wildcardIndex is null: ${resolvedAddress.pathInfo.path}`);\r\n parentListIndex = wildcardParentListIndexes[wildcardIndex] ?? \r\n raiseError(`ListIndex not found: ${wildcardParentPathInfo.path}`);\r\n }\r\n return parentListIndex;\r\n }\r\n case \"partial\": {\r\n raiseError(`Partial wildcard type is not supported yet: ${resolvedAddress.pathInfo.path}`);\r\n }\r\n }\r\n}\r\n","/**\r\n * setLoopContext.ts\r\n *\r\n * StateClassの内部APIとして、ループコンテキスト(ILoopContext)を一時的に設定し、\r\n * 指定した同期/非同期コールバックをそのスコープ内で実行するための関数です。\r\n *\r\n * 主な役割:\r\n * - handler.loopContextにループコンテキストを一時的に設定\r\n * - 既にループコンテキストが設定されている場合はエラーを投げる\r\n * - 常にスコープを設定しコールバックを実行\r\n * - finallyで必ずloopContextをnullに戻し、スコープ外への影響を防止\r\n *\r\n * 設計ポイント:\r\n * - ループバインディングや多重ループ時のスコープ管理を安全に行う\r\n * - finallyで状態復元を保証し、例外発生時も安全\r\n * - 非同期処理にも対応\r\n */\r\n\r\nimport { ILoopContext } from \"../../list/types\";\r\nimport { raiseError } from \"../../raiseError\";\r\nimport { IStateHandler } from \"../types\";\r\n\r\nfunction _setLoopContext<T>(\r\n handler: IStateHandler,\r\n loopContext: ILoopContext | null,\r\n callback: () => T\r\n): T {\r\n if (typeof handler.loopContext !== \"undefined\") {\r\n raiseError('already in loop context');\r\n }\r\n handler.setLoopContext(loopContext);\r\n try {\r\n handler.pushAddress(loopContext);\r\n try {\r\n return callback();\r\n } finally {\r\n handler.popAddress();\r\n }\r\n } finally {\r\n handler.clearLoopContext();\r\n }\r\n}\r\n\r\nexport function setLoopContext(\r\n handler: IStateHandler,\r\n loopContext: ILoopContext | null,\r\n callback: () => any\r\n): any {\r\n return _setLoopContext(handler, loopContext, callback);\r\n}\r\n\r\nexport async function setLoopContextAsync(\r\n handler: IStateHandler,\r\n loopContext: ILoopContext | null,\r\n callback: () => Promise<any>\r\n): Promise<any> {\r\n return await _setLoopContext(handler, loopContext, callback);\r\n}\r\n","/**\r\n * get.ts\r\n *\r\n * StateClassのProxyトラップとして、プロパティアクセス時の値取得処理を担う関数(get)の実装です。\r\n *\r\n * 主な役割:\r\n * - 文字列プロパティの場合、特殊プロパティ($1〜$9, $resolve, $getAll, $navigate)に応じた値やAPIを返却\r\n * - 通常のプロパティはgetResolvedPathInfoでパス情報を解決し、getListIndexでリストインデックスを取得\r\n * - getByRefで構造化パス・リストインデックスに対応した値を取得\r\n * - シンボルプロパティの場合はhandler.callableApi経由でAPIを呼び出し\r\n * - それ以外はReflect.getで通常のプロパティアクセスを実行\r\n *\r\n * 設計ポイント:\r\n * - $1〜$9は直近のStatePropertyRefのリストインデックス値を返す特殊プロパティ\r\n * - $resolve, $getAll, $navigateはAPI関数やルーターインスタンスを返す\r\n * - 通常のプロパティアクセスもバインディングや多重ループに対応\r\n * - シンボルAPIやReflect.getで拡張性・互換性も確保\r\n */\r\n\r\nimport { getResolvedAddress } from \"../../address/ResolvedAddress\";\r\nimport { createStateAddress } from \"../../address/StateAddress\";\r\nimport { IAbsoluteStateAddress, IStateAddress } from \"../../address/types\";\r\nimport { INDEX_BY_INDEX_NAME } from \"../../define\";\r\nimport { raiseError } from \"../../raiseError\";\r\nimport { connectedCallback } from \"../apis/connectedCallback\";\r\nimport { disconnectedCallback } from \"../apis/disconnectedCallback\";\r\nimport { getAll } from \"../apis/getAll\";\r\nimport { postUpdate } from \"../apis/postUpdate\";\r\nimport { resolve } from \"../apis/resolve\";\r\nimport { trackDependency } from \"../apis/trackDependency\";\r\nimport { updatedCallback } from \"../apis/updatedCallback\";\r\nimport { getByAddress } from \"../methods/getByAddress\";\r\nimport { getListIndex } from \"../methods/getListIndex\";\r\nimport { setByAddress } from \"../methods/setByAddress\";\r\nimport { setLoopContext, setLoopContextAsync } from \"../methods/setLoopContext\";\r\nimport { connectedCallbackSymbol, disconnectedCallbackSymbol, getByAddressSymbol, setByAddressSymbol, setLoopContextAsyncSymbol, setLoopContextSymbol, updatedCallbackSymbol } from \"../symbols\";\r\nimport { IStateHandler } from \"../types\";\r\n\r\nexport function get(\r\n target : object, \r\n prop : PropertyKey, \r\n receiver: any,\r\n handler : IStateHandler\r\n): any {\r\n const index = INDEX_BY_INDEX_NAME[prop];\r\n if (typeof index !== \"undefined\") {\r\n if (handler.addressStackLength === 0) {\r\n raiseError(`No active state reference to get list index for \"${prop.toString()}\".`);\r\n }\r\n const listIndex = handler.lastAddressStack?.listIndex;\r\n return listIndex?.indexes[index] ?? raiseError(`ListIndex not found: ${prop.toString()}`);\r\n }\r\n if (typeof prop === \"string\") {\r\n if (prop[0] === '$') {\r\n switch (prop) {\r\n case \"$stateElement\": {\r\n return handler.stateElement;\r\n }\r\n case \"$getAll\": {\r\n return (path: string, indexes?: number[]): any[] => {\r\n return getAll(\r\n target, \r\n prop, \r\n receiver,\r\n handler\r\n )(path, indexes);\r\n }\r\n }\r\n case \"$postUpdate\": {\r\n return (path: string): void => {\r\n return postUpdate(\r\n target, \r\n prop, \r\n receiver,\r\n handler\r\n )(path);\r\n }\r\n }\r\n case \"$resolve\": {\r\n return (path: string, indexes: number[], value?: any): any => {\r\n return resolve(\r\n target, \r\n prop, \r\n receiver,\r\n handler\r\n )(path, indexes, value);\r\n }\r\n }\r\n case \"$trackDependency\": {\r\n return (path: string): void => {\r\n return trackDependency(\r\n target, \r\n prop, \r\n receiver,\r\n handler\r\n )(path);\r\n }\r\n }\r\n }\r\n } else {\r\n const resolvedAddress = getResolvedAddress(prop);\r\n const listIndex = getListIndex(target, resolvedAddress, receiver, handler);\r\n const stateAddress = createStateAddress(resolvedAddress.pathInfo, listIndex);\r\n return getByAddress(\r\n target, \r\n stateAddress,\r\n receiver,\r\n handler\r\n );\r\n }\r\n } else if (typeof prop === \"symbol\") {\r\n switch (prop) {\r\n case setLoopContextAsyncSymbol: {\r\n return (loopContext: any, callback = async (): Promise<any> => {}): Promise<any> => {\r\n return setLoopContextAsync(handler, loopContext, callback);\r\n };\r\n }\r\n case setLoopContextSymbol: {\r\n return (loopContext: any, callback = (): any => {}): any => {\r\n return setLoopContext(handler, loopContext, callback);\r\n };\r\n }\r\n case getByAddressSymbol: {\r\n return (address: IStateAddress): any => {\r\n return getByAddress(\r\n target,\r\n address,\r\n receiver,\r\n handler\r\n );\r\n }\r\n }\r\n case setByAddressSymbol: {\r\n return (address: IStateAddress, value: any): void => {\r\n return setByAddress(\r\n target,\r\n address,\r\n value,\r\n receiver,\r\n handler\r\n );\r\n }\r\n }\r\n case connectedCallbackSymbol: {\r\n return (): Promise<void> => {\r\n return connectedCallback(\r\n target,\r\n prop,\r\n receiver,\r\n handler\r\n );\r\n }\r\n }\r\n case disconnectedCallbackSymbol: {\r\n return (): void => {\r\n return disconnectedCallback(\r\n target,\r\n prop,\r\n receiver,\r\n handler\r\n );\r\n }\r\n }\r\n case updatedCallbackSymbol: {\r\n return (\r\n refs: IAbsoluteStateAddress[]\r\n ): unknown => {\r\n return updatedCallback(\r\n target,\r\n refs,\r\n receiver,\r\n handler\r\n );\r\n }\r\n }\r\n }\r\n\r\n return Reflect.get(\r\n target, \r\n prop, \r\n receiver\r\n );\r\n }\r\n}\r\n","import { getAbsolutePathInfo } from \"../../address/AbsolutePathInfo\";\r\nimport { createAbsoluteStateAddress } from \"../../address/AbsoluteStateAddress\";\r\nimport { getResolvedAddress } from \"../../address/ResolvedAddress\";\r\nimport { createStateAddress } from \"../../address/StateAddress\";\r\nimport { IStateAddress } from \"../../address/types\";\r\nimport { dirtyCacheEntryByAbsoluteStateAddress } from \"../../cache/cacheEntryByAbsoluteStateAddress\";\r\nimport { walkDependency } from \"../../dependency/walkDependency\";\r\nimport { getUpdater } from \"../../updater/updater\";\r\nimport { getListIndex } from \"../methods/getListIndex\";\r\nimport { IStateHandler, IStateProxy } from \"../types\";\r\n\r\n\r\ntype PostFunction = (path: string) => void;\r\n\r\nexport function postUpdate(\r\n target: object, \r\n _prop: PropertyKey, \r\n receiver: any,\r\n handler: IStateHandler\r\n): PostFunction {\r\n const stateElement = handler.stateElement;\r\n return (path: string): void => {\r\n const resolvedAddress = getResolvedAddress(path);\r\n const listIndex = getListIndex(target, resolvedAddress, receiver, handler);\r\n const address = createStateAddress(resolvedAddress.pathInfo, listIndex);\r\n const absPathInfo = getAbsolutePathInfo(stateElement, address.pathInfo);\r\n const absAddress = createAbsoluteStateAddress(absPathInfo, address.listIndex);\r\n const updater = getUpdater();\r\n updater.enqueueAbsoluteAddress(absAddress);\r\n // 依存関係のあるキャッシュを無効化(ダーティ)、更新対象として登録\r\n walkDependency(\r\n handler.stateName,\r\n handler.stateElement,\r\n address,\r\n handler.stateElement.staticDependency,\r\n handler.stateElement.dynamicDependency,\r\n handler.stateElement.listPaths,\r\n receiver as IStateProxy,\r\n \"new\",\r\n (depAddress: IStateAddress) => {\r\n // キャッシュを無効化(ダーティ)\r\n const absDepPathInfo = getAbsolutePathInfo(stateElement, depAddress.pathInfo);\r\n const absDepAddress = createAbsoluteStateAddress(absDepPathInfo, depAddress.listIndex);\r\n dirtyCacheEntryByAbsoluteStateAddress(absDepAddress);\r\n // 更新対象として登録\r\n updater.enqueueAbsoluteAddress(absDepAddress);\r\n }\r\n );\r\n }\r\n}","/**\r\n * trackDependency.ts\r\n *\r\n * StateClassのAPIとして、getterチェーン中に参照されたパス間の\r\n * 依存関係を動的に登録するための関数(trackDependency)の実装です。\r\n *\r\n * 主な役割:\r\n * - 現在解決中のStatePropertyRef(lastRefStack)を取得\r\n * - pathManager.gettersに登録されているgetterの場合のみ依存を追跡\r\n * - 自身と同一パターンでない参照に対してaddDynamicDependencyを呼び出す\r\n *\r\n * 設計ポイント:\r\n * - lastRefStackが存在しない場合はSTATE-202エラーを発生させる\r\n * - getter同士の再帰(自己依存)は登録しない\r\n * - 動的依存はpathManagerに集約し、キャッシュの無効化に利用する\r\n */\r\n\r\nimport { raiseError } from \"../../raiseError\";\r\nimport { IStateHandler } from \"../types\";\r\n\r\n/**\r\n * 現在解決中のgetterから、指定されたパスへの動的依存を登録する関数を返します。\r\n *\r\n * - pathManager.gettersに登録されているgetterのみ依存追跡を行う\r\n * - 自己参照は除外し、異なるパターン間の依存だけを記録\r\n * - 動的依存はpathManager.addDynamicDependencyで集中管理される\r\n *\r\n * @param target プロキシ対象オブジェクト\r\n * @param prop アクセスされたプロパティキー\r\n * @param receiver プロキシレシーバ\r\n * @param handler StateClassハンドラ\r\n * @returns 引数pathで指定されたパターンへの依存を登録する無名関数\r\n */\r\n\r\ntype TrackDependencyFunction = (path: string) => void;\r\n\r\nexport function trackDependency(\r\n _target: object, \r\n _prop: PropertyKey, \r\n _receiver: any,\r\n handler: IStateHandler\r\n): TrackDependencyFunction {\r\n return (path: string): void => {\r\n if (handler.addressStackLength === 0) {\r\n raiseError(`No active state reference to track dependency for path \"${path}\".`);\r\n }\r\n const lastInfo = handler.lastAddressStack?.pathInfo ?? \r\n raiseError('Internal error: lastAddressStack is null');\r\n const stateElement = handler.stateElement;\r\n if (handler.stateElement.getterPaths.has(lastInfo.path) &&\r\n lastInfo.path !== path) {\r\n stateElement.addDynamicDependency(path, lastInfo.path);\r\n }\r\n };\r\n}\r\n","/**\r\n * connectedCallback.ts\r\n *\r\n * StateClassのライフサイクルフック「$connectedCallback」を呼び出すユーティリティ関数です。\r\n *\r\n * 主な役割:\r\n * - オブジェクト(target)に$connectedCallbackメソッドが定義されていれば呼び出す\r\n * - コールバックはtargetのthisコンテキストで呼び出し、IReadonlyStateProxy(receiver)を引数として渡す\r\n * - 非同期関数として実行可能(await対応)\r\n *\r\n * 設計ポイント:\r\n * - Reflect.getで$connectedCallbackプロパティを安全に取得\r\n * - 存在しない場合は何もしない\r\n * - ライフサイクル管理やカスタム初期化処理に利用\r\n */\r\n\r\nimport { STATE_CONNECTED_CALLBACK_NAME } from \"../../define\";\r\nimport { IStateHandler } from \"../types\";\r\n\r\nexport async function connectedCallback(\r\n target: object, \r\n _prop: PropertyKey, \r\n receiver: any,\r\n _handler: IStateHandler\r\n):Promise<void> {\r\n const callback = Reflect.get(target, STATE_CONNECTED_CALLBACK_NAME);\r\n if (typeof callback === \"function\") {\r\n await callback.call(receiver);\r\n }\r\n}","/**\r\n * disconnectedCallback.ts\r\n *\r\n * StateClassのライフサイクルフック「$disconnectedCallback」を呼び出すユーティリティ関数です。\r\n *\r\n * 主な役割:\r\n * - オブジェクト(target)に$disconnectedCallbackメソッドが定義されていれば呼び出す\r\n * - コールバックはtargetのthisコンテキストで呼び出し、IReadonlyStateProxy(receiver)を引数として渡す\r\n *\r\n * 設計ポイント:\r\n * - Reflect.getで$disconnectedCallbackプロパティを安全に取得\r\n * - 存在しない場合は何もしない\r\n * - ライフサイクル管理やクリーンアップ処理に利用\r\n */\r\n\r\nimport { STATE_DISCONNECTED_CALLBACK_NAME } from \"../../define\";\r\nimport { IStateHandler } from \"../types\";\r\n\r\nexport function disconnectedCallback(\r\n target: object, \r\n _prop: PropertyKey, \r\n receiver: any,\r\n _handler: IStateHandler\r\n): void {\r\n const callback = Reflect.get(target, STATE_DISCONNECTED_CALLBACK_NAME);\r\n if (typeof callback === \"function\") {\r\n callback.call(receiver);\r\n }\r\n}\r\n","/**\r\n * updatedCallback.ts\r\n *\r\n * Utility function to invoke the StateClass lifecycle hook \"$updatedCallback\".\r\n *\r\n * Main responsibilities:\r\n * - Invokes $updatedCallback method if defined on the object (target)\r\n * - Callback is invoked with target's this context, passing IReadonlyStateProxy (receiver) as argument\r\n * - Executable as async function (await compatible)\r\n *\r\n * Design points:\r\n * - Safely retrieves $updatedCallback property using Reflect.get\r\n * - Does nothing if the callback doesn't exist\r\n * - Used for lifecycle management and update handling logic\r\n */\r\n\r\nimport { IAbsoluteStateAddress } from \"../../address/types\";\r\nimport { STATE_UPDATED_CALLBACK_NAME } from \"../../define\";\r\nimport { IStateHandler } from \"../types\";\r\n\r\n/**\r\n * Invokes the $updatedCallback lifecycle hook if defined on the target.\r\n * Aggregates updated paths and their indexes before passing to the callback.\r\n * @param target - Target object to check for callback\r\n * @param refs - Array of state property references that were updated\r\n * @param receiver - State proxy to pass as this context\r\n * @param handler - State handler (unused but part of signature)\r\n * @returns Promise or void depending on callback implementation\r\n */\r\nexport function updatedCallback(\r\n target: object, \r\n refs: IAbsoluteStateAddress[], \r\n receiver: any,\r\n handler: IStateHandler\r\n): unknown {\r\n const callback: unknown = Reflect.get(target, STATE_UPDATED_CALLBACK_NAME);\r\n if (typeof callback === \"function\") {\r\n const paths: Set<string> = new Set();\r\n // ToDo:現状では1階層のみのワイルドカードに対応。多階層対応は後回し\r\n const indexesListByPath: Record<string, Array<number[]>> = {};\r\n for (const ref of refs) {\r\n const pathInfo = ref.absolutePathInfo.pathInfo;\r\n let pathName;\r\n if (ref.absolutePathInfo.stateName === handler.stateName) {\r\n pathName = pathInfo.path;\r\n } else {\r\n pathName = pathInfo.path + \"@\" + ref.absolutePathInfo.stateName;\r\n }\r\n paths.add(pathName);\r\n if (pathInfo.wildcardCount > 0) {\r\n const indexes = ref.listIndex!.indexes ?? [];\r\n const indexesList = indexesListByPath[pathName];\r\n if (typeof indexesList === \"undefined\") {\r\n indexesListByPath[pathName] = [indexes];\r\n } else {\r\n indexesList.push(indexes);\r\n }\r\n }\r\n }\r\n return callback.call(receiver, Array.from(paths), indexesListByPath);\r\n }\r\n}","import { IStateAddress } from \"../address/types\";\r\nimport { IStateElement } from \"../components/types\";\r\nimport { raiseError } from \"../raiseError\";\r\nimport { getStateElementByName } from \"../stateElementByName\";\r\nimport { IStateHandler, IStateProxy, Mutability } from \"./types\";\r\nimport { get as trapGet } from \"./traps/get\";\r\nimport { set as trapSet } from \"./traps/set\";\r\nimport { ILoopContext } from \"../list/types\";\r\nimport { IState } from \"../types\";\r\nimport { MAX_LOOP_DEPTH } from \"../define\";\r\n\r\nclass StateHandler implements IStateHandler {\r\n private _stateElement: IStateElement;\r\n private _stateName: string;\r\n private _addressStack: (IStateAddress | null | undefined)[] = Array(MAX_LOOP_DEPTH).fill(undefined);\r\n private _addressStackIndex: number = -1;\r\n private _loopContext: ILoopContext | null | undefined;\r\n private _mutability: Mutability;\r\n \r\n constructor(\r\n rootNode: Node,\r\n stateName: string,\r\n mutability: Mutability\r\n ) {\r\n this._stateName = stateName;\r\n const stateElement = getStateElementByName(rootNode, this._stateName);\r\n if (stateElement === null) {\r\n raiseError(`StateHandler: State element with name \"${this._stateName}\" not found.`);\r\n }\r\n this._stateElement = stateElement;\r\n this._mutability = mutability;\r\n }\r\n\r\n get stateName(): string {\r\n return this._stateName;\r\n }\r\n\r\n get stateElement(): IStateElement {\r\n return this._stateElement;\r\n }\r\n\r\n get lastAddressStack(): IStateAddress | null {\r\n let address: IStateAddress | null | undefined = undefined;\r\n if (this._addressStackIndex >= 0) {\r\n address = this._addressStack[this._addressStackIndex];\r\n }\r\n if (typeof address === \"undefined\") {\r\n raiseError(`Last address stack is undefined.`);\r\n }\r\n return address;\r\n }\r\n\r\n get addressStackLength(): number {\r\n return this._addressStackIndex + 1;\r\n }\r\n\r\n get loopContext(): ILoopContext | null | undefined {\r\n return this._loopContext;\r\n }\r\n\r\n pushAddress(address: IStateAddress | null): void {\r\n this._addressStackIndex++;\r\n if (this._addressStackIndex >= MAX_LOOP_DEPTH) {\r\n raiseError(`Exceeded maximum address stack depth of ${MAX_LOOP_DEPTH}. Possible infinite loop.`);\r\n }\r\n this._addressStack[this._addressStackIndex] = address;\r\n }\r\n\r\n popAddress(): IStateAddress | null {\r\n if (this._addressStackIndex < 0) {\r\n return null;\r\n }\r\n const address = this._addressStack[this._addressStackIndex];\r\n if (typeof address === \"undefined\") {\r\n raiseError(`Address stack at index ${this._addressStackIndex} is undefined.`);\r\n }\r\n this._addressStack[this._addressStackIndex] = undefined;\r\n this._addressStackIndex--;\r\n return address;\r\n }\r\n\r\n setLoopContext(loopContext: ILoopContext | null): void {\r\n this._loopContext = loopContext;\r\n }\r\n\r\n clearLoopContext(): void {\r\n this._loopContext = undefined;\r\n }\r\n\r\n get(\r\n target : object, \r\n prop : PropertyKey, \r\n receiver: any\r\n ): any {\r\n return trapGet(target, prop, receiver, this);\r\n }\r\n\r\n set(\r\n target : object, \r\n prop : PropertyKey, \r\n value : any, \r\n receiver: any\r\n ): boolean {\r\n if (this._mutability === \"readonly\") {\r\n raiseError(`State \"${this._stateName}\" is readonly.`);\r\n }\r\n return trapSet(target, prop, value, receiver, this);\r\n }\r\n\r\n has(\r\n target: object, \r\n prop : PropertyKey\r\n ): boolean {\r\n return Reflect.has(target, prop);\r\n// return Reflect.has(target, prop) || this.symbols.has(prop) || this.apis.has(prop);\r\n }\r\n\r\n}\r\n\r\nexport function createStateProxy(\r\n rootNode: Node,\r\n state: IState,\r\n stateName: string,\r\n mutability: Mutability\r\n): IStateProxy {\r\n const handler = new StateHandler(rootNode, stateName, mutability);\r\n const stateProxy = new Proxy<IStateProxy>(state as IStateProxy, handler);\r\n return stateProxy;\r\n}\r\n\r\nexport const __private__ = {\r\n StateHandler,\r\n};","/**\r\n * set.ts\r\n *\r\n * StateClassのProxyトラップとして、プロパティ設定時の値セット処理を担う関数(set)の実装です。\r\n *\r\n * 主な役割:\r\n * - 文字列プロパティの場合、getResolvedPathInfoでパス情報を解決し、getListIndexでリストインデックスを取得\r\n * - setByRefで構造化パス・リストインデックスに対応した値設定を実行\r\n * - それ以外(シンボル等)の場合はReflect.setで通常のプロパティ設定を実行\r\n *\r\n * 設計ポイント:\r\n * - バインディングや多重ループ、ワイルドカードを含むパスにも柔軟に対応\r\n * - setByRefを利用することで、依存解決や再描画などの副作用も一元管理\r\n * - Reflect.setで標準的なプロパティ設定の互換性も確保\r\n */\r\n\r\nimport { getResolvedAddress } from \"../../address/ResolvedAddress\";\r\nimport { IStateHandler } from \"../types\";\r\nimport { getListIndex } from \"../methods/getListIndex\";\r\nimport { createStateAddress } from \"../../address/StateAddress\";\r\nimport { setByAddress } from \"../methods/setByAddress\";\r\n\r\nexport function set(\r\n target : object, \r\n prop : PropertyKey, \r\n value : any, \r\n receiver: any,\r\n handler : IStateHandler\r\n): boolean {\r\n if (typeof prop === \"string\") {\r\n const resolvedAddress = getResolvedAddress(prop);\r\n const listIndex = getListIndex(target, resolvedAddress, receiver, handler);\r\n const stateAddress = createStateAddress(resolvedAddress.pathInfo, listIndex);\r\n return setByAddress(\r\n target, \r\n stateAddress,\r\n value, \r\n receiver,\r\n handler\r\n );\r\n } else {\r\n return Reflect.set(\r\n target, \r\n prop, \r\n value, \r\n receiver\r\n );\r\n }\r\n}\r\n","\r\n// WebComponent専用のキャッシュ\r\n// outerState.tsからのアクセスで、これを返す\r\n\r\nimport { IAbsoluteStateAddress } from \"../address/types\";\r\n\r\nconst lastValueByAbsoluteStateAddress: WeakMap<IAbsoluteStateAddress, any> = new WeakMap();\r\n\r\nexport function setLastValueByAbsoluteStateAddress(absoluteStateAddress: IAbsoluteStateAddress, value: any): void {\r\n lastValueByAbsoluteStateAddress.set(absoluteStateAddress, value);\r\n}\r\n\r\nexport function getLastValueByAbsoluteStateAddress(absoluteStateAddress: IAbsoluteStateAddress): any {\r\n return lastValueByAbsoluteStateAddress.get(absoluteStateAddress);\r\n}\r\n","import { IStateElement } from \"../components/types\";\r\n\r\nconst stateElementByWebComponent: WeakMap<Element, Map<string, IStateElement>> = new WeakMap();\r\n\r\nexport function setStateElementByWebComponent(webComponent: Element, stateName: string, stateElement: IStateElement): void {\r\n let stateMap = stateElementByWebComponent.get(webComponent);\r\n if (!stateMap) {\r\n stateMap = new Map();\r\n stateElementByWebComponent.set(webComponent, stateMap);\r\n }\r\n stateMap.set(stateName, stateElement);\r\n}\r\n\r\nexport function getStateElementByWebComponent(webComponent: Element, stateName: string): IStateElement | null {\r\n const stateMap = stateElementByWebComponent.get(webComponent);\r\n if (!stateMap) {\r\n return null;\r\n }\r\n return stateMap.get(stateName) ?? null;\r\n}","import { getAbsolutePathInfo } from \"../address/AbsolutePathInfo\";\r\nimport { getPathInfo } from \"../address/PathInfo\";\r\nimport { IAbsolutePathInfo } from \"../address/types\";\r\nimport { getAbsoluteStateAddressByBinding } from \"../binding/getAbsoluteStateAddressByBinding\";\r\nimport { IBindingInfo } from \"../binding/types\";\r\nimport { addBindingByNode } from \"../bindings/getBindingsByNode\";\r\nimport { IStateElement } from \"../components/types\";\r\nimport { DELIMITER } from \"../define\";\r\nimport { raiseError } from \"../raiseError\";\r\nimport { getStateElementByName } from \"../stateElementByName\";\r\nimport { getStateElementByWebComponent } from \"./stateElementByWebComponent\";\r\n\r\nexport interface IMappingRule {\r\n innerAbsPathInfo: IAbsolutePathInfo;\r\n outerAbsPathInfo: IAbsolutePathInfo;\r\n}\r\n\r\nconst innerMappingByElement: WeakMap<Element, Map<IAbsolutePathInfo, IAbsolutePathInfo>> = new WeakMap();\r\nconst outerMappingByElement: WeakMap<Element, Map<IAbsolutePathInfo, IAbsolutePathInfo>> = new WeakMap();\r\nconst primaryMappingRuleSetByElement: WeakMap<Element, Set<IMappingRule>> = new WeakMap();\r\nconst primaryBindingByMappingRule: WeakMap<IMappingRule, IBindingInfo> = new WeakMap();\r\n\r\nfunction createMappingRuleByBinding(innerState: IStateElement, binding: IBindingInfo): IMappingRule {\r\n const innerPathInfo = getPathInfo(binding.propSegments.slice(1).join(DELIMITER));\r\n const innerAbsPathInfo = getAbsolutePathInfo(innerState, innerPathInfo);\r\n const outerAbsStateAddress = getAbsoluteStateAddressByBinding(binding);\r\n const outerAbsPathInfo = outerAbsStateAddress.absolutePathInfo;\r\n return { innerAbsPathInfo, outerAbsPathInfo };\r\n}\r\n\r\nexport function buildPrimaryMappingRule(webComponent: Element, stateName: string, bindings: IBindingInfo[]): void {\r\n if (bindings.length === 0) {\r\n return;\r\n }\r\n const innerState = getStateElementByWebComponent(webComponent, stateName);\r\n if (innerState === null) {\r\n raiseError('State element not found for web component.');\r\n }\r\n const innerMappingRule = new Map<IAbsolutePathInfo, IAbsolutePathInfo>();\r\n const outerMappingRule = new Map<IAbsolutePathInfo, IAbsolutePathInfo>();\r\n for (const binding of bindings) {\r\n const mappingRule = createMappingRuleByBinding(innerState, binding);\r\n let primaryMappingRuleSet = primaryMappingRuleSetByElement.get(webComponent);\r\n if (typeof primaryMappingRuleSet === 'undefined') {\r\n primaryMappingRuleSetByElement.set(webComponent, new Set([mappingRule]));\r\n } else {\r\n primaryMappingRuleSet.add(mappingRule);\r\n }\r\n const innerAbsPathInfo = mappingRule.innerAbsPathInfo;\r\n const outerAbsPathInfo = mappingRule.outerAbsPathInfo;\r\n primaryBindingByMappingRule.set(mappingRule, binding);\r\n innerMappingRule.set(innerAbsPathInfo, outerAbsPathInfo);\r\n outerMappingRule.set(outerAbsPathInfo, innerAbsPathInfo);\r\n }\r\n innerMappingByElement.set(webComponent, innerMappingRule);\r\n outerMappingByElement.set(webComponent, outerMappingRule);\r\n}\r\n\r\nexport function getInnerAbsolutePathInfo(webComponent: Element, outerAbsPathInfo: IAbsolutePathInfo): IAbsolutePathInfo | null {\r\n const mapping = outerMappingByElement.get(webComponent);\r\n if (typeof mapping === 'undefined') {\r\n return null;\r\n }\r\n return mapping.get(outerAbsPathInfo) ?? null;\r\n}\r\n\r\nexport function getOuterAbsolutePathInfo(webComponent: Element, innerAbsPathInfo: IAbsolutePathInfo): IAbsolutePathInfo | null {\r\n let innerMapping = innerMappingByElement.get(webComponent);\r\n if (typeof innerMapping === 'undefined') {\r\n innerMapping = new Map<IAbsolutePathInfo, IAbsolutePathInfo>();\r\n innerMappingByElement.set(webComponent, innerMapping);\r\n }\r\n if (innerMapping.has(innerAbsPathInfo)) {\r\n return innerMapping.get(innerAbsPathInfo)!\r\n }\r\n let outerMapping = outerMappingByElement.get(webComponent);\r\n if (typeof outerMapping === 'undefined') {\r\n outerMapping = new Map<IAbsolutePathInfo, IAbsolutePathInfo>();\r\n outerMappingByElement.set(webComponent, outerMapping);\r\n }\r\n // 内側からのアクセスの場合、ルールがなければプライマリルールから新たにルールとバインディングを生成する\r\n const primaryMappingRuleSet = primaryMappingRuleSetByElement.get(webComponent);\r\n if (typeof primaryMappingRuleSet === 'undefined') {\r\n // マッピングルールが存在しない場合はnullを返し、ローカル状態へのフォールバックを許可する\r\n return null;\r\n }\r\n let primaryMappingRule: IMappingRule | null = null;\r\n for(const currentPrimaryMappingRule of primaryMappingRuleSet) {\r\n // innerPathInfoがprimaryMappingRuleのinnerPathInfoを包含しているか\r\n if (!innerAbsPathInfo.pathInfo.cumulativePathInfoSet.has(currentPrimaryMappingRule.innerAbsPathInfo.pathInfo)) {\r\n continue;\r\n }\r\n if (currentPrimaryMappingRule.innerAbsPathInfo.pathInfo.segments.length === innerAbsPathInfo.pathInfo.segments.length) {\r\n raiseError('Duplicate mapping rule for web component.');\r\n }\r\n primaryMappingRule = currentPrimaryMappingRule;\r\n break;\r\n }\r\n if (primaryMappingRule === null) {\r\n // マッピングルールに一致しない場合はnullを返し、ローカル状態へのフォールバックを許可する\r\n return null;\r\n }\r\n // マッチした残りのパスをouterPathInfoに付与して新たなルールを生成\r\n const primaryBinding = primaryBindingByMappingRule.get(primaryMappingRule);\r\n /* c8 ignore start */\r\n if (typeof primaryBinding === 'undefined') {\r\n raiseError('Binding not found for primary mapping rule on web component.');\r\n }\r\n /* c8 ignore stop */\r\n const outerRemainingSegments = innerAbsPathInfo.pathInfo.segments.slice(primaryMappingRule.innerAbsPathInfo.pathInfo.segments.length);\r\n const outerSegments = primaryMappingRule.outerAbsPathInfo.pathInfo.segments.concat(outerRemainingSegments);\r\n const outerPathInfo = getPathInfo(outerSegments.join(DELIMITER));\r\n const rootNode = webComponent.getRootNode() as Node;\r\n const outerStateElement = getStateElementByName(rootNode, primaryBinding.stateName);\r\n if (outerStateElement === null) {\r\n raiseError(`State element with name \"${primaryBinding.stateName}\" not found for web component.`);\r\n }\r\n const outerAbsPathInfo = getAbsolutePathInfo(outerStateElement, outerPathInfo);\r\n innerMapping.set(innerAbsPathInfo, outerAbsPathInfo);\r\n outerMapping.set(outerAbsPathInfo, innerAbsPathInfo);\r\n\r\n // ルールに対応するバインディングを生成\r\n const newBinding: IBindingInfo = {\r\n ...primaryBinding,\r\n propName: innerAbsPathInfo.pathInfo.path,\r\n propSegments: innerAbsPathInfo.pathInfo.segments,\r\n statePathName: outerAbsPathInfo.pathInfo.path,\r\n statePathInfo: outerAbsPathInfo.pathInfo,\r\n }\r\n addBindingByNode(webComponent, newBinding);\r\n\r\n return outerAbsPathInfo;\r\n}","\r\nfunction cloneWithDescriptors(obj: object) {\r\n const proto = Object.getPrototypeOf(obj);\r\n const clone = Object.create(proto);\r\n const descriptors = Object.getOwnPropertyDescriptors(obj);\r\n for(const key in descriptors) {\r\n const descriptor = descriptors[key];\r\n if (descriptor.writable === false) {\r\n descriptor.writable = true;\r\n }\r\n }\r\n Object.defineProperties(clone, descriptors);\r\n return clone;\r\n}\r\n\r\nexport function meltFrozenObject(frozenObj: object) {\r\n return cloneWithDescriptors(frozenObj);\r\n}","import { getAbsolutePathInfo } from \"../address/AbsolutePathInfo\";\r\nimport { createAbsoluteStateAddress } from \"../address/AbsoluteStateAddress\";\r\nimport { getPathInfo } from \"../address/PathInfo\";\r\nimport { IStateElement } from \"../components/types\";\r\nimport { getLoopContextByNode } from \"../list/loopContextByNode\";\r\nimport { IListIndex } from \"../list/types\";\r\nimport { setLoopContextSymbol } from \"../proxy/symbols\";\r\nimport { raiseError } from \"../raiseError\";\r\nimport { setLastValueByAbsoluteStateAddress } from \"./lastValueByAbsoluteStateAddress\";\r\nimport { getOuterAbsolutePathInfo } from \"./MappingRule\";\r\nimport { meltFrozenObject } from \"./meltFrozenObject\";\r\nimport { getStateElementByWebComponent } from \"./stateElementByWebComponent\";\r\nimport { IInnerState } from \"./types\";\r\n\r\nclass InnerStateProxyHandler implements ProxyHandler<IInnerState> {\r\n private _webComponent: Element;\r\n private _innerStateElement: IStateElement;\r\n constructor(webComponent: Element, stateName: string) {\r\n this._webComponent = webComponent;\r\n this._innerStateElement = getStateElementByWebComponent(webComponent, stateName) ?? raiseError('State element not found for web component.');\r\n }\r\n\r\n get(target: IInnerState, prop: string | symbol, receiver: any): any {\r\n if (typeof prop === 'string') {\r\n if (prop === \"then\") {\r\n // Promiseのthenと誤認識されるのを防ぐため、Promiseに存在するプロパティはProxyのgetで処理しない\r\n return undefined;\r\n }\r\n if (prop[0] === '$') {\r\n return undefined;\r\n }\r\n // 1. getter完全一致 → ローカル計算(this = receiverで依存自動追跡)\r\n if (this._innerStateElement.getterPaths.has(prop) && prop in target) {\r\n return Reflect.get(target, prop, receiver);\r\n }\r\n // 2 & 3. マッピング完全一致 / サブパス → 親の状態\r\n const innerPathInfo = getPathInfo(prop);\r\n const innerAbsPathInfo = getAbsolutePathInfo(this._innerStateElement, innerPathInfo);\r\n const outerAbsPathInfo = getOuterAbsolutePathInfo(this._webComponent, innerAbsPathInfo);\r\n if (outerAbsPathInfo !== null) {\r\n const loopContext = getLoopContextByNode(this._webComponent);\r\n let value = undefined;\r\n outerAbsPathInfo.stateElement.createState(\"readonly\", (state) => {\r\n state[setLoopContextSymbol](loopContext, () => {\r\n value = state[outerAbsPathInfo.pathInfo.path];\r\n let listIndex: IListIndex | null = null;\r\n if (loopContext !== null && loopContext.listIndex !== null) {\r\n if (outerAbsPathInfo.pathInfo.wildcardCount > 0) {\r\n // wildcardPathSetとloopContextのpathInfoSetのintersectionのうち、segment数が最も多いものをouterAbsPathInfoにする\r\n // 例: outerPathInfoが \"todos.*.name\"で、loopContextのpathInfoSetに \"todos.0.name\", \"todos.1.name\"がある場合、\"todos.0.name\"や\"todos.1.name\"をouterAbsPathInfoにする\r\n listIndex = loopContext.listIndex.at(outerAbsPathInfo.pathInfo.wildcardCount - 1);\r\n }\r\n }\r\n const absStateAddress = createAbsoluteStateAddress(outerAbsPathInfo, listIndex);\r\n setLastValueByAbsoluteStateAddress(absStateAddress, value);\r\n });\r\n });\r\n return value;\r\n }\r\n // 4. ローカルデータプロパティ → ローカル値\r\n if (prop in target) {\r\n return Reflect.get(target, prop, receiver);\r\n }\r\n // 5. エラー\r\n raiseError(`Property \"${prop}\" not found in inner state: no mapping rule and no local state property.`);\r\n } else {\r\n return Reflect.get(target, prop, receiver);\r\n }\r\n }\r\n\r\n set(target: IInnerState, prop: string | symbol, value: any, receiver: any): boolean {\r\n if (typeof prop === 'string') {\r\n // 1. setter完全一致 → ローカル処理(this = receiverで親への書き込み可能)\r\n if (this._innerStateElement.setterPaths.has(prop) && prop in target) {\r\n return Reflect.set(target, prop, value, receiver);\r\n }\r\n // 2 & 3. マッピング完全一致 / サブパス → 親に書く\r\n const innerPathInfo = getPathInfo(prop);\r\n const innerAbsPathInfo = getAbsolutePathInfo(this._innerStateElement, innerPathInfo);\r\n const outerAbsPathInfo = getOuterAbsolutePathInfo(this._webComponent, innerAbsPathInfo);\r\n if (outerAbsPathInfo !== null) {\r\n const loopContext = getLoopContextByNode(this._webComponent);\r\n outerAbsPathInfo.stateElement.createState(\"writable\", (state) => {\r\n state[setLoopContextSymbol](loopContext, () => {\r\n state[outerAbsPathInfo.pathInfo.path] = value;\r\n });\r\n });\r\n return true;\r\n }\r\n // 4. ローカルデータプロパティ → ローカルに書く\r\n if (prop in target) {\r\n return Reflect.set(target, prop, value, receiver);\r\n }\r\n // 5. エラー\r\n raiseError(`Property \"${prop}\" not found in inner state: no mapping rule and no local state property.`);\r\n } else {\r\n return Reflect.set(target, prop, value, receiver);\r\n }\r\n }\r\n\r\n has(target: IInnerState, prop: string | symbol): boolean {\r\n if (typeof prop === 'string') {\r\n if (prop[0] === '$') {\r\n return false;\r\n }\r\n // 1. getter/setter完全一致\r\n if ((this._innerStateElement.getterPaths.has(prop) || this._innerStateElement.setterPaths.has(prop)) && prop in target) {\r\n return true;\r\n }\r\n // 2 & 3. マッピング\r\n const innerPathInfo = getPathInfo(prop);\r\n const innerAbsPathInfo = getAbsolutePathInfo(this._innerStateElement, innerPathInfo);\r\n const outerAbsPathInfo = getOuterAbsolutePathInfo(this._webComponent, innerAbsPathInfo);\r\n if (outerAbsPathInfo !== null) {\r\n return true;\r\n }\r\n // 4. ローカルデータ\r\n if (prop in target) {\r\n return true;\r\n }\r\n // 5. 存在しない\r\n return false;\r\n } else {\r\n return Reflect.has(target, prop);\r\n }\r\n }\r\n\r\n}\r\n\r\nexport function createInnerState(webComponent: Element, stateName: string): IInnerState {\r\n const handler = new InnerStateProxyHandler(webComponent, stateName);\r\n const innerState = getStateElementByWebComponent(webComponent, stateName);\r\n /* c8 ignore start */\r\n if (innerState === null) {\r\n raiseError('State element not found for web component.');\r\n }\r\n /* c8 ignore stop */\r\n if (innerState.boundComponentStateProp === null) {\r\n raiseError('State element is not bound to any component state prop.');\r\n }\r\n if (!(innerState.boundComponentStateProp in webComponent)) {\r\n raiseError(`State element is not bound to a valid component state prop: ${innerState.boundComponentStateProp}`);\r\n }\r\n const state = (webComponent as any)[innerState.boundComponentStateProp];\r\n if (typeof state !== 'object' || state === null) {\r\n raiseError(`Invalid state object for component state prop: ${innerState.boundComponentStateProp}`);\r\n }\r\n return new Proxy(meltFrozenObject(state), handler);\r\n}","import { getAbsolutePathInfo } from \"../address/AbsolutePathInfo\";\r\nimport { createAbsoluteStateAddress } from \"../address/AbsoluteStateAddress\";\r\nimport { getPathInfo } from \"../address/PathInfo\";\r\nimport { IStateElement } from \"../components/types\";\r\nimport { raiseError } from \"../raiseError\";\r\nimport { getLastValueByAbsoluteStateAddress } from \"./lastValueByAbsoluteStateAddress\";\r\nimport { getStateElementByWebComponent } from \"./stateElementByWebComponent\";\r\nimport { IOuterState } from \"./types\";\r\n\r\nclass OuterStateProxyHandler implements ProxyHandler<IOuterState> {\r\n private _innerStateElement: IStateElement;\r\n constructor(webComponent: Element, stateName: string) {\r\n this._innerStateElement = getStateElementByWebComponent(webComponent, stateName) ?? raiseError('State element not found for web component.');\r\n }\r\n\r\n get(target: IOuterState, prop: string | symbol, receiver: any): any {\r\n if (typeof prop === 'string') {\r\n const innerPathInfo = getPathInfo(prop);\r\n const innerAbsPathInfo = getAbsolutePathInfo(this._innerStateElement, innerPathInfo);\r\n const absStateAddress = createAbsoluteStateAddress(innerAbsPathInfo, null);\r\n return getLastValueByAbsoluteStateAddress(absStateAddress);\r\n } else {\r\n return Reflect.get(target, prop, receiver);\r\n }\r\n }\r\n\r\n set(target: IOuterState, prop: string | symbol, value: any, receiver: any): boolean {\r\n if (typeof prop === 'string') {\r\n const innerPathInfo = getPathInfo(prop);\r\n const innerAbsPathInfo = getAbsolutePathInfo(this._innerStateElement, innerPathInfo);\r\n this._innerStateElement.createState(\"readonly\", (state) => {\r\n state.$postUpdate(innerAbsPathInfo.pathInfo.path);\r\n });\r\n return true;\r\n } else {\r\n return Reflect.set(target, prop, value, receiver);\r\n }\r\n }\r\n}\r\n\r\nexport function createOuterState(webComponent: Element, stateName: string): IOuterState {\r\n const handler = new OuterStateProxyHandler(webComponent, stateName);\r\n return new Proxy({}, handler);\r\n}\r\n","import { IStateElement } from \"../components/types\";\r\nimport { raiseError } from \"../raiseError\";\r\nimport { getStateElementByWebComponent } from \"./stateElementByWebComponent\";\r\nimport { IOuterState } from \"./types\";\r\n\r\nclass PlainOuterStateProxyHandler implements ProxyHandler<IOuterState> {\r\n private _innerStateElement: IStateElement;\r\n constructor(webComponent: Element, stateName: string) {\r\n this._innerStateElement = getStateElementByWebComponent(webComponent, stateName) ?? raiseError('State element not found for web component.');\r\n }\r\n\r\n get(target: IOuterState, prop: string | symbol, receiver: any): any {\r\n if (typeof prop === 'string') {\r\n let value;\r\n this._innerStateElement.createState(\"readonly\", (state) => {\r\n value = state[prop];\r\n });\r\n return value;\r\n } else {\r\n return Reflect.get(target, prop, receiver);\r\n }\r\n }\r\n\r\n set(target: IOuterState, prop: string | symbol, value: any, receiver: any): boolean {\r\n if (typeof prop === 'string') {\r\n this._innerStateElement.createState(\"writable\", (state) => {\r\n state[prop] = value;\r\n });\r\n return true;\r\n } else {\r\n return Reflect.set(target, prop, value, receiver);\r\n }\r\n }\r\n}\r\n\r\nexport function createPlainOuterState(webComponent: Element, stateName: string): IOuterState {\r\n const handler = new PlainOuterStateProxyHandler(webComponent, stateName);\r\n return new Proxy({}, handler);\r\n}\r\n","import { getBindingsByNode } from \"../bindings/getBindingsByNode\";\r\nimport { IStateElement } from \"../components/types\";\r\nimport { config } from \"../config\";\r\nimport { WEBCOMPONENT_STATE_READY_CALLBACK_NAME } from \"../define\";\r\nimport { raiseError } from \"../raiseError\";\r\nimport { markWebComponentAsComplete } from \"./completeWebComponent\";\r\nimport { createInnerState } from \"./innerState\";\r\nimport { buildPrimaryMappingRule } from \"./MappingRule\";\r\nimport { meltFrozenObject } from \"./meltFrozenObject\";\r\nimport { createOuterState } from \"./outerState\";\r\nimport { createPlainOuterState } from \"./plainOuterState\";\r\nimport { setStateElementByWebComponent } from \"./stateElementByWebComponent\";\r\nimport { IOuterState } from \"./types\";\r\n\r\nconst getOuter = (outerState: IOuterState) => (): IOuterState => outerState;\r\n\r\nexport function bindWebComponent(\r\n innerStateElement: IStateElement,\r\n component: Element,\r\n stateProp: string,\r\n state: Record<string, any>\r\n): void {\r\n setStateElementByWebComponent(component, stateProp, innerStateElement);\r\n if (component.hasAttribute(config.bindAttributeName)) {\r\n const bindings = (getBindingsByNode(component) ?? []).filter(\r\n binding => binding.propSegments[0] === stateProp\r\n );\r\n buildPrimaryMappingRule(component, stateProp, bindings);\r\n const outerState = createOuterState(component, stateProp);\r\n const innerState = createInnerState(component, stateProp);\r\n innerStateElement.setInitialState(innerState);\r\n Object.defineProperty(component, stateProp, {\r\n get: getOuter(outerState),\r\n enumerable: true,\r\n configurable: true,\r\n });\r\n } else {\r\n innerStateElement.setInitialState(meltFrozenObject(state));\r\n const outerState = createPlainOuterState(component, stateProp);\r\n Object.defineProperty(component, stateProp, {\r\n get: getOuter(outerState),\r\n enumerable: true,\r\n configurable: true,\r\n });\r\n }\r\n markWebComponentAsComplete(component, innerStateElement);\r\n if (WEBCOMPONENT_STATE_READY_CALLBACK_NAME in component) {\r\n const func = (component as any)[WEBCOMPONENT_STATE_READY_CALLBACK_NAME];\r\n if (typeof func === 'function') {\r\n func.call(component, stateProp).catch((error: any) => {\r\n raiseError(`Error in ${WEBCOMPONENT_STATE_READY_CALLBACK_NAME}: ${error instanceof Error ? error.message : String(error)}`);\r\n });\r\n } else {\r\n raiseError(`${WEBCOMPONENT_STATE_READY_CALLBACK_NAME} is not a function.`);\r\n }\r\n }\r\n}\r\n","import { config, inSsr } from \"../config\";\r\nimport { loadFromInnerScript } from \"../stateLoader/loadFromInnerScript\";\r\nimport { loadFromJsonFile } from \"../stateLoader/loadFromJsonFile\";\r\nimport { loadFromScriptFile } from \"../stateLoader/loadFromScriptFile\";\r\nimport { loadFromScriptJson } from \"../stateLoader/loadFromScriptJson\";\r\nimport { raiseError } from \"../raiseError\";\r\nimport { BindingType, IState } from \"../types\";\r\nimport { IStateElement } from \"./types\";\r\nimport { setStateElementByName, getBindingsReady } from \"../stateElementByName\";\r\nimport { ILoopContextStack } from \"../list/types\";\r\nimport { createLoopContextStack } from \"../list/loopContext\";\r\nimport { DCC_DEFINITION_ATTRIBUTE, NO_SET_TIMEOUT, STATE_CONNECTED_CALLBACK_NAME, STATE_DISCONNECTED_CALLBACK_NAME, WILDCARD } from \"../define\";\r\nimport { defineDCC } from \"../dcc/defineDCC\";\r\nimport { getPathInfo } from \"../address/PathInfo\";\r\nimport { IStateProxy, Mutability } from \"../proxy/types\";\r\nimport { createStateProxy } from \"../proxy/StateHandler\";\r\nimport { bindWebComponent } from \"../webComponent/bindWebComponent\";\r\nimport { connectedCallbackSymbol, disconnectedCallbackSymbol } from \"../proxy/symbols\";\r\nimport { waitInitializeBinding } from \"../bindings/initializeBindingPromiseByNode\";\r\nimport { getCustomElement } from \"../getCustomElement\";\r\nimport { Ssr } from \"./Ssr\";\r\nimport { VERSION } from \"../version\";\r\n\r\ntype Descriptors = Record<string, PropertyDescriptor>;\r\n\r\nfunction getAllPropertyDescriptors(obj: object): Descriptors {\r\n let descriptors: Descriptors = {};\r\n let proto = obj;\r\n while (proto && proto !== Object.prototype) {\r\n Object.assign(descriptors, Object.getOwnPropertyDescriptors(proto));\r\n proto = Object.getPrototypeOf(proto);\r\n }\r\n return descriptors;\r\n}\r\n\r\nfunction getStateInfo(\r\n state: IState\r\n): { \r\n getterPaths: Set<string>,\r\n setterPaths: Set<string>,\r\n} {\r\n const getterPaths: Set<string> = new Set<string>();\r\n const setterPaths: Set<string> = new Set<string>();\r\n const descriptors = getAllPropertyDescriptors(state);\r\n for(const [ key, descriptor ] of Object.entries(descriptors)) {\r\n if (typeof descriptor.get === \"function\") {\r\n getterPaths.add(key);\r\n }\r\n if (typeof descriptor.set === \"function\") {\r\n setterPaths.add(key);\r\n }\r\n }\r\n return {\r\n getterPaths, setterPaths\r\n };\r\n}\r\n\r\nexport class State extends HTMLElement implements IStateElement {\r\n static hasConnectedCallbackPromise = true;\r\n\r\n static getBindingsReady(rootNode: Node): Promise<void> {\r\n return getBindingsReady(rootNode);\r\n }\r\n\r\n private __state: IState | undefined;\r\n private _name: string = 'default';\r\n private _initialized: boolean = false;\r\n private _initializePromise: Promise<void>;\r\n private _resolveInitialize: (() => void) | null = null;\r\n private _connectedCallbackPromise: Promise<void>;\r\n private _resolveConnectedCallback: (() => void) | null = null;\r\n private _loadingPromise: Promise<void>;\r\n private _resolveLoading: (() => void) | null = null;\r\n private _setStatePromise: Promise<Record<string, any>> | null = null;\r\n private _resolveSetState: ((value: Record<string, any>) => void) | null = null;\r\n private _listPaths: Set<string> = new Set<string>();\r\n private _elementPaths: Set<string> = new Set<string>();\r\n private _getterPaths: Set<string> = new Set<string>();\r\n private _setterPaths: Set<string> = new Set<string>();\r\n private _loopContextStack: ILoopContextStack = createLoopContextStack();\r\n private _dynamicDependency: Map<string, string[]> = new Map<string, string[]>();\r\n private _staticDependency: Map<string, string[]> = new Map<string, string[]>();\r\n private _pathSet: Set<string> = new Set<string>();\r\n private _version = 0;\r\n private _rootNode: Node | null = null;\r\n private _boundComponent: Element | null = null;\r\n private _boundComponentStateProp: string | null = null;\r\n private _bindableEventMap: Record<string, string> = {};\r\n\r\n constructor() {\r\n super();\r\n this._initializePromise = new Promise<void>((resolve) => {\r\n this._resolveInitialize = resolve;\r\n });\r\n this._connectedCallbackPromise = new Promise<void>((resolve) => {\r\n this._resolveConnectedCallback = resolve;\r\n });\r\n this._loadingPromise = new Promise<void>((resolve) => {\r\n this._resolveLoading = resolve;\r\n });\r\n this._setStatePromise = new Promise<Record<string, any>>((resolve) => {\r\n this._resolveSetState = resolve;\r\n });\r\n }\r\n\r\n private get _state(): IState {\r\n if (typeof this.__state === \"undefined\") {\r\n raiseError(`${config.tagNames.state} _state is not initialized yet.`);\r\n }\r\n return this.__state;\r\n }\r\n\r\n private set _state(value: IState) {\r\n this.__state = value;\r\n this._listPaths.clear();\r\n this._elementPaths.clear();\r\n this._getterPaths.clear();\r\n this._pathSet.clear();\r\n const stateInfo = getStateInfo(value);\r\n for(const path of stateInfo.getterPaths) {\r\n this._getterPaths.add(path);\r\n }\r\n for(const path of stateInfo.setterPaths) {\r\n this._setterPaths.add(path);\r\n }\r\n this._resolveLoading?.();\r\n }\r\n\r\n get name(): string {\r\n return this._name;\r\n }\r\n\r\n private _loadFromSsrElement(): IState | null {\r\n if (!this.hasAttribute('enable-ssr')) return null;\r\n const name = this.getAttribute('name') || 'default';\r\n const root = this.parentNode;\r\n if (!root) return null;\r\n const ssrEl = Ssr.findByName(root, name);\r\n if (!ssrEl) return null;\r\n const data = ssrEl.stateData;\r\n return Object.keys(data).length > 0 ? data : null;\r\n }\r\n\r\n private async _initialize() {\r\n // enable-ssr (クライアント側のみ): <wcs-ssr> から初期データを取得\r\n const ssrState = !inSsr() ? this._loadFromSsrElement() : null;\r\n try {\r\n if (this.hasAttribute('state')) {\r\n const state = this.getAttribute('state');\r\n this._state = loadFromScriptJson(state!);\r\n } else if (this.hasAttribute('src')) {\r\n const src = this.getAttribute('src');\r\n if (src && src.endsWith('.json')) {\r\n this._state = await loadFromJsonFile(src);\r\n } else if (src && src.endsWith('.js')) {\r\n this._state = await loadFromScriptFile(src);\r\n } else {\r\n raiseError(`Unsupported src file type: ${src}`);\r\n }\r\n } else if (this.hasAttribute('json')) {\r\n const json = this.getAttribute('json');\r\n this._state = JSON.parse(json!);\r\n } else {\r\n const script = this.querySelector<HTMLScriptElement>('script[type=\"module\"]');\r\n if (script) {\r\n this._state = await loadFromInnerScript(script, `${this._name}`);\r\n } else {\r\n const timerId = setTimeout(() => {\r\n console.warn(`[@wcstack/state] Warning: No state source found for <${config.tagNames.state}> element with name=\"${this._name}\".`);\r\n }, NO_SET_TIMEOUT);\r\n // 要注意!!!APIでセットする場合はここで待機する必要がある --(1)\r\n this._state = await this._setStatePromise!;\r\n clearTimeout(timerId);\r\n }\r\n }\r\n } catch(e) {\r\n raiseError(`Failed to initialize state: ${e}`);\r\n }\r\n // SSR データがある場合、state 定義(メソッド/getter)を維持しつつデータ値を上書き\r\n if (ssrState !== null && this.__state) {\r\n for (const [key, value] of Object.entries(ssrState)) {\r\n if (key in this.__state) {\r\n const desc = Object.getOwnPropertyDescriptor(this.__state, key);\r\n // getter/setter はスキップ(定義側を優先)\r\n if (desc && (desc.get || desc.set)) continue;\r\n // 関数はスキップ\r\n if (typeof this.__state[key] === 'function') continue;\r\n }\r\n this.__state[key] = value;\r\n }\r\n }\r\n await this._loadingPromise;\r\n this._name = this.getAttribute('name') || 'default';\r\n setStateElementByName(this.rootNode!, this._name, this);\r\n }\r\n\r\n private async _initializeBindWebComponent() {\r\n if (this.hasAttribute(\"bind-component\")) {\r\n // wcs-stateはコンポーネントのトップレベル要素であること\r\n // ShadowDOM直下: parentNodeがShadowRoot → hostが親コンポーネント\r\n // LightDOM/ShadowDOM内のLightDOM: parentNodeがElement → それが親コンポーネント\r\n const parentNode = this.parentNode;\r\n const boundComponent = parentNode instanceof ShadowRoot\r\n ? parentNode.host\r\n : parentNode instanceof Element\r\n ? parentNode\r\n : null;\r\n const customTagName = boundComponent ? getCustomElement(boundComponent) : null;\r\n if (boundComponent === null || customTagName === null) {\r\n raiseError(`\"bind-component\" requires <${config.tagNames.state}> to be a direct child of a custom element.`);\r\n }\r\n // LightDOMの場合、名前空間が上位スコープと共有されるためnameが必須\r\n if (!(parentNode instanceof ShadowRoot) && !this.hasAttribute(\"name\")) {\r\n raiseError(`\"bind-component\" in Light DOM requires a \"name\" attribute to avoid namespace conflicts with the parent scope.`);\r\n }\r\n const boundComponentStateProp = this.getAttribute(\"bind-component\")!;\r\n await customElements.whenDefined(customTagName.toLowerCase());\r\n // data-wcs属性がある場合は、上位の状態によりbinding情報の設定が完了するまで待機する\r\n if (boundComponent.hasAttribute(config.bindAttributeName)) {\r\n await waitInitializeBinding(boundComponent);\r\n }\r\n if (!(boundComponentStateProp in boundComponent)) {\r\n raiseError(`Component does not have property \"${boundComponentStateProp}\" for state binding.`);\r\n }\r\n const state = (boundComponent as any)[boundComponentStateProp] as Record<string, any>;\r\n if (typeof state !== 'object' || state === null) {\r\n raiseError(`Component property \"${boundComponentStateProp}\" is not an object for state binding.`);\r\n }\r\n this._boundComponent = boundComponent;\r\n this._boundComponentStateProp = boundComponentStateProp;\r\n bindWebComponent(this, this._boundComponent, this._boundComponentStateProp, state);\r\n }\r\n }\r\n\r\n private async _callStateConnectedCallback(): Promise<void> {\r\n await this.createStateAsync(\"writable\", async (state) => {\r\n // stateに\"$connectedCallback\"があるか確認し、connectedCallbackAPIを呼び出す\r\n if (STATE_CONNECTED_CALLBACK_NAME in state) {\r\n await state[connectedCallbackSymbol]();\r\n }\r\n });\r\n }\r\n\r\n private async _initializeDCC(hostElement: Element, shadowRoot: ShadowRoot): Promise<void> {\r\n let state: IState;\r\n try {\r\n if (this.hasAttribute('src')) {\r\n const src = this.getAttribute('src')!;\r\n if (src.endsWith('.js')) {\r\n state = await loadFromScriptFile(src);\r\n } else {\r\n raiseError(`DCC: Unsupported src type: ${src}`);\r\n }\r\n } else {\r\n const script = this.querySelector<HTMLScriptElement>('script[type=\"module\"]');\r\n if (script) {\r\n state = await loadFromInnerScript(script, hostElement.tagName.toLowerCase());\r\n } else {\r\n raiseError(`DCC: No state source found for \"${hostElement.tagName.toLowerCase()}\".`);\r\n }\r\n }\r\n } catch (e) {\r\n raiseError(`DCC: Failed to load state: ${e}`);\r\n }\r\n defineDCC(hostElement, shadowRoot, state!);\r\n this._initialized = true;\r\n this._rootNode = null; // disconnectedCallbackでのstate参照を防止\r\n this._resolveInitialize?.();\r\n this._resolveConnectedCallback?.();\r\n }\r\n\r\n private _callStateDisconnectedCallback(): void {\r\n this.createState(\"writable\", (state) => {\r\n // stateに\"$disconnectedCallback\"があるか確認し、disconnectedCallbackAPIを呼び出す\r\n if (STATE_DISCONNECTED_CALLBACK_NAME in state) {\r\n state[disconnectedCallbackSymbol]();\r\n }\r\n });\r\n }\r\n\r\n async connectedCallback() {\r\n this._rootNode = this.getRootNode() as Node;\r\n if (!this._initialized) {\r\n // DCC 検出: ShadowRoot 内かつホストに data-wc-definition がある場合\r\n const parentNode = this.parentNode;\r\n if (parentNode instanceof ShadowRoot &&\r\n parentNode.host.hasAttribute(DCC_DEFINITION_ATTRIBUTE)) {\r\n await this._initializeDCC(parentNode.host, parentNode);\r\n return;\r\n }\r\n await this._initializeBindWebComponent();\r\n await this._initialize();\r\n this._initialized = true;\r\n this._resolveInitialize?.();\r\n }\r\n // enable-ssr (クライアント側): SSR で $connectedCallback 済みなのでスキップ\r\n // inSsr() (サーバー側): レンダリング中なので実行する\r\n if (!this.hasAttribute('enable-ssr') || inSsr()) {\r\n await this._callStateConnectedCallback();\r\n }\r\n\r\n // サーバーモード + enable-ssr: バインディング完了後に <wcs-ssr> を生成\r\n if (inSsr() && this.hasAttribute('enable-ssr')) {\r\n await getBindingsReady(this.rootNode);\r\n\r\n const name = this.getAttribute('name') || 'default';\r\n const stateData = Ssr.extractStateData(this);\r\n const ssrEl = document.createElement(config.tagNames.ssr);\r\n ssrEl.setAttribute('name', name);\r\n ssrEl.setAttribute('version', VERSION);\r\n Ssr.buildContent(ssrEl, stateData);\r\n this.parentNode?.insertBefore(ssrEl, this);\r\n }\r\n\r\n this._resolveConnectedCallback?.();\r\n }\r\n\r\n disconnectedCallback() {\r\n if (this._rootNode !== null) {\r\n this._callStateDisconnectedCallback();\r\n setStateElementByName(this.rootNode, this._name, null);\r\n this._rootNode = null;\r\n }\r\n }\r\n\r\n get initializePromise(): Promise<void> {\r\n return this._initializePromise;\r\n }\r\n\r\n get connectedCallbackPromise(): Promise<void> {\r\n return this._connectedCallbackPromise;\r\n }\r\n\r\n get listPaths(): Set<string> {\r\n return this._listPaths;\r\n }\r\n\r\n get elementPaths(): Set<string> {\r\n return this._elementPaths;\r\n }\r\n\r\n get getterPaths(): Set<string> {\r\n return this._getterPaths;\r\n }\r\n\r\n get setterPaths(): Set<string> {\r\n return this._setterPaths;\r\n }\r\n\r\n get loopContextStack(): ILoopContextStack {\r\n return this._loopContextStack;\r\n }\r\n\r\n get dynamicDependency(): Map<string, string[]> {\r\n return this._dynamicDependency;\r\n }\r\n\r\n get staticDependency(): Map<string, string[]> {\r\n return this._staticDependency;\r\n }\r\n\r\n get version(): number {\r\n return this._version;\r\n }\r\n\r\n get rootNode(): Node {\r\n if (this._rootNode === null) {\r\n raiseError('State rootNode is not available.');\r\n }\r\n return this._rootNode;\r\n }\r\n\r\n get boundComponentStateProp(): string | null {\r\n return this._boundComponentStateProp;\r\n }\r\n\r\n get bindableEventMap(): Record<string, string> {\r\n return this._bindableEventMap;\r\n }\r\n\r\n setBindableEventMap(map: Record<string, string>): void {\r\n this._bindableEventMap = map;\r\n }\r\n\r\n private _addDependency(\r\n map: Map<string, string[]>, \r\n sourcePath: string, \r\n targetPath: string\r\n ): boolean {\r\n const deps = map.get(sourcePath);\r\n if (deps === undefined) {\r\n map.set(sourcePath, [targetPath]);\r\n return true;\r\n } else if (!deps.includes(targetPath)) {\r\n deps.push(targetPath);\r\n return true;\r\n }\r\n return false;\r\n } \r\n\r\n /**\r\n * source, target\r\n * \r\n * products.*.price => products.*.tax \r\n * get \"products.*.tax\"() { return this[\"products.*.price\"] * 0.1; }\r\n * \r\n * products.*.price => products.summary \r\n * get \"products.summary\"() { return this.$getAll(\"products.*.price\", []).reduce(sum); }\r\n * \r\n * categories.*.name => categories.*.products.*.categoryName \r\n * get \"categories.*.products.*.categoryName\"() { return this[\"categories.*.name\"]; }\r\n * \r\n * @param sourcePath \r\n * @param targetPath \r\n */\r\n addDynamicDependency(sourcePath: string, targetPath: string): boolean {\r\n return this._addDependency(this._dynamicDependency, sourcePath, targetPath);\r\n }\r\n\r\n /**\r\n * source, target\r\n * products => products.*\r\n * products.* => products.*.price\r\n * products.* => products.*.name\r\n * \r\n * @param sourcePath \r\n * @param targetPath \r\n */\r\n addStaticDependency(sourcePath: string, targetPath: string): boolean {\r\n return this._addDependency(this._staticDependency, sourcePath, targetPath);\r\n }\r\n\r\n setPathInfo(path: string, bindingType: BindingType): void {\r\n if (bindingType === \"for\") {\r\n this._listPaths.add(path);\r\n this._elementPaths.add(path + '.' + WILDCARD);\r\n }\r\n if (!this._pathSet.has(path)) {\r\n const pathInfo = getPathInfo(path);\r\n this._pathSet.add(path);\r\n if (pathInfo.parentPath !== null) {\r\n let currentPathInfo = pathInfo;\r\n while(currentPathInfo.parentPath !== null) {\r\n if (!this.addStaticDependency(currentPathInfo.parentPath, currentPathInfo.path)) {\r\n break;\r\n }\r\n currentPathInfo = getPathInfo(currentPathInfo.parentPath);\r\n }\r\n }\r\n }\r\n }\r\n\r\n private _createState<T>(rootNode: Node, mutability: Mutability, callback: (state: IStateProxy) => T): T {\r\n try {\r\n const stateProxy = createStateProxy(rootNode, this._state, this._name, mutability);\r\n return callback(stateProxy);\r\n } finally {\r\n // cleanup if needed\r\n }\r\n }\r\n\r\n async createStateAsync(mutability: Mutability, callback: (state: IStateProxy) => Promise<void>): Promise<void> {\r\n return await this._createState(this.rootNode, mutability, callback);\r\n }\r\n\r\n createState(mutability: Mutability, callback: (state: IStateProxy) => void): void {\r\n this._createState(this.rootNode, mutability, callback);\r\n }\r\n\r\n nextVersion(): number {\r\n this._version++;\r\n return this._version;\r\n }\r\n\r\n bindProperty(prop: string, desc: PropertyDescriptor): void {\r\n Object.defineProperty(this._state, prop, desc);\r\n }\r\n\r\n setInitialState(state: Record<string, any>): void {\r\n if (!this._initialized) {\r\n this._resolveSetState?.(state);\r\n } else {\r\n this._state = state;\r\n }\r\n }\r\n}\r\n","import { raiseError } from \"../raiseError\";\r\nimport { IState } from \"../types\";\r\n\r\n\r\nexport function loadFromScriptJson(id: string): IState {\r\n const script = document.getElementById(id) as HTMLScriptElement;\r\n if (script && script.type === 'application/json') {\r\n try {\r\n const data = JSON.parse(script.textContent || '{}');\r\n return data;\r\n } catch (e) {\r\n raiseError('Failed to parse JSON from script element:' + e);\r\n }\r\n }\r\n return {};\r\n}","import { raiseError } from \"../raiseError\";\r\nimport { IState } from \"../types\";\r\n\r\nexport async function loadFromJsonFile(url: string): Promise<IState> {\r\n try {\r\n const response = await fetch(url);\r\n if (!response.ok) {\r\n raiseError(`Failed to fetch JSON file: ${response.statusText}`);\r\n }\r\n const data = await response.json();\r\n return data;\r\n } catch (e) {\r\n console.error('Failed to load JSON file:', e);\r\n return {};\r\n }\r\n}","import { IState } from \"../types\";\r\nimport { DCC_DEFINITION_ATTRIBUTE, STATE_BINDABLES_NAME } from \"../define\";\r\nimport { config } from \"../config\";\r\nimport { raiseError } from \"../raiseError\";\r\nimport { getterFn, setterFn, callFn, isInternalProperty } from \"./dccPropertyFactories\";\r\nimport { createWcBindable, createBindableEventMap, IWcBindable } from \"./wcBindable\";\r\nimport { State } from \"../components/State\";\r\n\r\nexport function defineDCC(hostElement: Element, shadowRoot: ShadowRoot, state: IState): void {\r\n const tagName = hostElement.tagName.toLowerCase();\r\n\r\n // バリデーション\r\n if (!tagName.includes(\"-\")) {\r\n raiseError(`DCC: \"${tagName}\" is not a valid custom element name (must contain a hyphen).`);\r\n }\r\n if (customElements.get(tagName)) {\r\n // 既に登録済みならスキップ\r\n return;\r\n }\r\n\r\n // ShadowRoot は cloneNode 不可のため、template 経由で内容をクローン\r\n const template = document.createElement(\"template\");\r\n template.innerHTML = shadowRoot.innerHTML;\r\n const shadowRootMode = shadowRoot.mode as ShadowRootMode;\r\n\r\n // $bindables から wcBindable + bindableEventMap を生成\r\n const bindables: string[] = Array.isArray(state[STATE_BINDABLES_NAME])\r\n ? state[STATE_BINDABLES_NAME]\r\n : [];\r\n const wcBindable: IWcBindable | null = bindables.length > 0\r\n ? createWcBindable(tagName, bindables)\r\n : null;\r\n const bindableEventMap: Record<string, string> = bindables.length > 0\r\n ? createBindableEventMap(tagName, bindables)\r\n : {};\r\n\r\n // DCC クラス生成\r\n const stateTagSelector = `${config.tagNames.state}:not([name])` as const;\r\n\r\n const DCCElement = class extends HTMLElement {\r\n static template = template;\r\n static shadowRootMode = shadowRootMode;\r\n static wcBindable = wcBindable;\r\n static bindableEventMap = bindableEventMap;\r\n\r\n private _shadow: ShadowRoot | null = null;\r\n\r\n connectedCallback() {\r\n if (this.hasAttribute(DCC_DEFINITION_ATTRIBUTE)) return;\r\n this._shadow = this.attachShadow({ mode: DCCElement.shadowRootMode });\r\n this._shadow.appendChild(DCCElement.template.content.cloneNode(true));\r\n\r\n // bindableEventMap の設定\r\n if (Object.keys(DCCElement.bindableEventMap).length > 0) {\r\n const stateEl = this._shadow.querySelector(stateTagSelector) as State | null;\r\n if (stateEl) {\r\n stateEl.initializePromise.then(() => {\r\n stateEl.setBindableEventMap(DCCElement.bindableEventMap);\r\n });\r\n }\r\n }\r\n }\r\n\r\n get stateElement() {\r\n return this._shadow?.querySelector(stateTagSelector) as State | null;\r\n }\r\n };\r\n\r\n // state プロパティを走査して DCC クラスのプロトタイプにgetter/setter/methodを定義\r\n const descriptors = Object.getOwnPropertyDescriptors(state);\r\n for (const [name, desc] of Object.entries(descriptors)) {\r\n if (isInternalProperty(name)) continue;\r\n\r\n const newDesc: PropertyDescriptor = { configurable: true, enumerable: true };\r\n if (typeof desc.value === \"function\") {\r\n const isAsync = desc.value.constructor?.name === \"AsyncFunction\";\r\n newDesc.value = callFn(name, isAsync);\r\n } else {\r\n newDesc.get = getterFn(name);\r\n newDesc.set = setterFn(name);\r\n }\r\n Object.defineProperty(DCCElement.prototype, name, newDesc);\r\n }\r\n\r\n // カスタム要素登録\r\n customElements.define(tagName, DCCElement);\r\n}\r\n","export interface IWcBindableProperty {\r\n name: string;\r\n event: string;\r\n}\r\n\r\nexport interface IWcBindable {\r\n protocol: string;\r\n version: number;\r\n properties: IWcBindableProperty[];\r\n}\r\n\r\nexport function createWcBindable(tagName: string, bindables: string[]): IWcBindable {\r\n const properties: IWcBindableProperty[] = bindables.map((propName) => ({\r\n name: propName,\r\n event: `${tagName}:${propName}-changed`,\r\n }));\r\n return {\r\n protocol: \"wc-bindable\",\r\n version: 1,\r\n properties,\r\n };\r\n}\r\n\r\nexport function createBindableEventMap(tagName: string, bindables: string[]): Record<string, string> {\r\n const map: Record<string, string> = {};\r\n for (const propName of bindables) {\r\n map[propName] = `${tagName}:${propName}-changed`;\r\n }\r\n return map;\r\n}\r\n","import { Ssr } from \"./components/Ssr\";\r\nimport { State } from \"./components/State\";\r\nimport { config } from \"./config\";\r\n\r\nexport function registerComponents() {\r\n if (!customElements.get(config.tagNames.ssr)) {\r\n customElements.define(config.tagNames.ssr, Ssr);\r\n }\r\n if (!customElements.get(config.tagNames.state)) {\r\n customElements.define(config.tagNames.state, State);\r\n }\r\n}\r\n","import { setConfig } from \"./config\";\r\nimport { registerComponents } from \"./registerComponents\";\r\nimport { IWritableConfig } from \"./types\";\r\n\r\nexport function bootstrapState(config?: IWritableConfig): void {\r\n if (config) {\r\n setConfig(config);\r\n }\r\n registerComponents();\r\n}","/**\n * defineState.ts\n *\n * 状態オブジェクトに型付けを提供するためのユーティリティ。\n * defineState() はアイデンティティ関数で、ThisType<> を付与することで\n * メソッド・computed getter 内の this に型補完を提供する。\n *\n * テンプレートリテラル型によるドットパスの型解決:\n * - WcsPaths<T> : T から生成される全ドットパスの union\n * - WcsPathValue<T,P>: パス P に対応する値の型\n * - WcsPathAccessor<T>: ブラケットアクセス用マップ型\n */\n\n// ============================================================\n// Internal helper types\n// ============================================================\n\n/**\n * `any` 型を検出する。\n * `0 extends (1 & T)` は T が `any` の場合のみ true になる。\n */\ntype IsAny<T> = 0 extends (1 & T) ? true : false;\n\n/**\n * T がドットパス再帰の対象となる「プレーンなデータオブジェクト」かどうかを判定する。\n * プリミティブ、組み込みオブジェクト (Date, Map 等)、関数、配列、any は除外。\n */\ntype IsPlainObject<T> =\n IsAny<T> extends true ? false :\n T extends\n | string | number | boolean | null | undefined | symbol | bigint\n | Function | Date | RegExp | Error\n | Map<any, any> | Set<any> | WeakMap<any, any> | WeakSet<any>\n | Promise<any> | readonly any[]\n ? false\n : T extends Record<string, any>\n ? true\n : false;\n\n/**\n * T のキーのうち、関数でないもの(データプロパティ・computed getter)を抽出する。\n * メソッド(イベントハンドラ等)はドットパスの対象外。\n * any 型のプロパティは除外せず保持する。\n */\ntype DataKeys<T> = {\n [K in keyof T & string]: IsAny<T[K]> extends true ? K : T[K] extends Function ? never : K;\n}[keyof T & string];\n\n// ============================================================\n// WcsPaths — ドットパスの union 生成\n// ============================================================\n\n/**\n * 型 T から生成される全てのドットパスの union。\n * 配列プロパティはワイルドカード `*` を使用: `items.*.name`\n *\n * 再帰の深さは最大4レベルに制限(コンパイル性能の確保)。\n *\n * @example\n * ```ts\n * type S = {\n * count: number;\n * users: { name: string; age: number }[];\n * cart: { items: { price: number }[] };\n * };\n * type P = WcsPaths<S>;\n * // = \"count\" | \"users\" | \"users.*\" | \"users.*.name\" | \"users.*.age\"\n * // | \"cart\" | \"cart.items\" | \"cart.items.*\" | \"cart.items.*.price\"\n * ```\n */\nexport type WcsPaths<T, Depth extends readonly any[] = []> =\n Depth[\"length\"] extends 4 ? never :\n {\n [K in DataKeys<T>]:\n | K\n | (T[K] extends readonly (infer E)[]\n ? IsPlainObject<E> extends true\n ? `${K}.*` | WcsSubPaths<E, `${K}.*.`, [...Depth, 0]>\n : `${K}.*`\n : IsPlainObject<T[K]> extends true\n ? WcsSubPaths<T[K], `${K}.`, [...Depth, 0]>\n : never)\n }[DataKeys<T>];\n\n/** @internal プレフィックス付きサブパスの生成ヘルパー */\ntype WcsSubPaths<T, Prefix extends string, Depth extends readonly any[]> =\n WcsPaths<T, Depth> extends infer P extends string\n ? `${Prefix}${P}`\n : never;\n\n// ============================================================\n// WcsPathValue — パスから値の型を解決\n// ============================================================\n\n/**\n * ドットパス P に対応する値の型を T から解決する。\n *\n * 解決順序:\n * 1. T の直接キー(computed getter 含む)\n * 2. `K.*` → 配列要素型\n * 3. `K.rest` → オブジェクト/配列のネストを再帰的に辿る\n *\n * @example\n * ```ts\n * type S = { cart: { items: { price: number; qty: number }[] } };\n * type V1 = WcsPathValue<S, \"cart.items.*.price\">; // number\n * type V2 = WcsPathValue<S, \"cart.items.*\">; // { price: number; qty: number }\n * type V3 = WcsPathValue<S, \"cart\">; // { items: ... }\n * ```\n */\nexport type WcsPathValue<T, P extends string> =\n // 1. Direct key (includes computed getters like \"users.*.ageCategory\")\n P extends keyof T\n ? T[P]\n // 2. K.* → array element type\n : P extends `${infer K}.*`\n ? K extends keyof T\n ? T[K] extends readonly (infer E)[] ? E : never\n : never\n // 3. K.rest → recurse into nested structure\n : P extends `${infer K}.${infer Rest}`\n ? K extends keyof T\n ? T[K] extends readonly (infer E)[]\n // Array: expect *.subpath or *\n ? Rest extends `*.${infer SubRest}`\n ? WcsPathValue<E, SubRest>\n : Rest extends \"*\"\n ? E\n : never\n // Object: recurse\n : T[K] extends Record<string, any>\n ? WcsPathValue<T[K], Rest>\n : never\n : never\n : never;\n\n// ============================================================\n// WcsPathAccessor — ブラケットアクセス用マップ型\n// ============================================================\n\n/**\n * 全ドットパスに対する型付きブラケットアクセスを提供するマップ型。\n *\n * `this[\"users.*.name\"]` のようなアクセスに対して、\n * WcsPaths で生成されたパスに対応する値の型を返す。\n */\ntype WcsPathAccessor<T> = {\n [P in WcsPaths<T>]: WcsPathValue<T, P>;\n};\n\n// ============================================================\n// State Proxy API — this 経由でアクセスできるAPI\n// ============================================================\n\n/**\n * `<wcs-state>` の Proxy 経由で提供されるAPIメソッド。\n * state定義オブジェクト内のメソッド・getter で `this.` 経由で利用可能。\n */\nexport interface WcsStateApi {\n /**\n * ワイルドカードを含むパスにマッチする全要素を配列で取得する。\n *\n * @example\n * ```ts\n * get \"cart.totalPrice\"() {\n * return this.$getAll(\"cart.items.*.price\", []).reduce((sum, v) => sum + v, 0);\n * }\n * ```\n */\n $getAll<V = any>(path: string, defaultValue?: V[]): V[];\n\n /**\n * 指定パスの更新を手動でトリガーする。\n * Proxy の set トラップを経由せずに内部状態を変更した場合に使用。\n */\n $postUpdate(path: string): void;\n\n /**\n * パスとインデックス配列を指定して、ワイルドカードを解決した値を取得・設定する。\n *\n * @param path - ワイルドカードを含むパス\n * @param indexes - 各ワイルドカード階層のインデックス\n * @param value - 設定する値(省略時は取得)\n */\n $resolve(path: string, indexes: number[], value?: any): any;\n\n /**\n * 指定パスへの依存関係を明示的に登録する。\n * computed getter 内で動的にパスを組み立てる場合に使用。\n */\n $trackDependency(path: string): void;\n\n /** `<wcs-state>` 要素への参照 */\n readonly $stateElement: HTMLElement;\n\n // ループインデックス変数 ($1〜$9)\n // for テンプレート内のイベントハンドラで、ネストされたループの\n // 各階層のインデックスにアクセスするために使用。\n readonly $1: number;\n readonly $2: number;\n readonly $3: number;\n readonly $4: number;\n readonly $5: number;\n readonly $6: number;\n readonly $7: number;\n readonly $8: number;\n readonly $9: number;\n}\n\n// ============================================================\n// WcsThis — state メソッド/getter 内の this の型\n// ============================================================\n\n/**\n * state定義オブジェクト内の `this` の型。\n *\n * - `T` のプロパティに型付きでアクセス可能(直接キー)\n * - `WcsPathAccessor<T>` によるネストされたドットパスの型付きアクセス\n * - `WcsStateApi` のメソッド ($getAll, $postUpdate 等) にアクセス可能\n * - 動的パス (`this[\\`items.${i}.name\\`]`) は型チェック対象外(キャストが必要)\n *\n * @example\n * ```ts\n * defineState({\n * count: 0,\n * users: [] as { name: string; age: number }[],\n * increment() {\n * this.count++; // number\n * this[\"users.*.name\"]; // string (パス型解決)\n * this.$getAll(\"path\", []); // API\n * }\n * });\n * ```\n */\nexport type WcsThis<T> = T & WcsStateApi & WcsPathAccessor<T>;\n\n// ============================================================\n// defineState — 型付き状態定義関数\n// ============================================================\n\n/**\n * `<wcs-state>` 用の型付き状態オブジェクトを定義する。\n *\n * ランタイムではアイデンティティ関数(引数をそのまま返す)として動作し、\n * コストはゼロ。TypeScript の `ThisType<>` を利用して、メソッド・getter 内の\n * `this` に型補完を提供する。\n *\n * ### 基本的な使い方 (TypeScript)\n * ```ts\n * import { defineState } from '@wcstack/state';\n *\n * export default defineState({\n * count: 0,\n * users: [] as { name: string; age: number }[],\n *\n * increment() {\n * this.count++; // ✅ number\n * this[\"users.*.name\"]; // ✅ string (ドットパス型解決)\n * },\n *\n * get \"users.*.ageCategory\"() {\n * return this[\"users.*.age\"] < 25 ? \"Young\" : \"Adult\";\n * }\n * });\n * ```\n *\n * ### JavaScript (JSDoc)\n * ```js\n * import { defineState } from '@wcstack/state';\n *\n * export default defineState({\n * count: 0,\n * increment() {\n * this.count++; // ✅ JSDoc + tsconfig checkJs で型補完\n * }\n * });\n * ```\n *\n * ### HTML インラインスクリプト\n * ```html\n * <wcs-state>\n * <script type=\"module\">\n * import { defineState } from '@wcstack/state';\n * export default defineState({\n * count: 0,\n * increment() { this.count++; }\n * });\n * </script>\n * </wcs-state>\n * ```\n *\n * ### ライフサイクルコールバック\n * ```ts\n * export default defineState({\n * data: null,\n * async $connectedCallback() {\n * this.data = await fetch('/api/data').then(r => r.json());\n * },\n * $disconnectedCallback() {\n * // cleanup\n * },\n * $updatedCallback() {\n * // called after DOM update\n * }\n * });\n * ```\n */\nexport function defineState<T extends Record<string, any>>(\n definition: T & ThisType<WcsThis<T>>\n): T {\n return definition;\n}\n"],"names":["_inSsrCache","inSsr","html","document","querySelector","hasAttribute","_config","bindAttributeName","commentTextPrefix","commentForPrefix","commentIfPrefix","commentElseIfPrefix","commentElsePrefix","tagNames","state","ssr","locale","debug","enableMustache","config","getConfig","VERSION","raiseError","message","Error","bindingPromiseByNode","WeakMap","id","getInitializeBindingPromiseByNode","node","resolveFn","bindingPromise","get","promise","Promise","resolve","set","async","waitInitializeBinding","resolveInitializedBinding","replaceToReplaceNode","bindingInfo","replaceNode","parentNode","replaceChild","resolveNodePath","root","path","currentNode","length","i","childNodes","getBindingInfos","parseBindingTextResults","bindingInfos","parseBindingTextResult","bindingType","push","createTextNode","bindingsByNode","getBindingsByNode","setBindingsByNode","bindings","DELIMITER","WILDCARD","MAX_LOOP_DEPTH","tmpIndexByIndexName","INDEX_BY_INDEX_NAME","Object","freeze","STATE_CONNECTED_CALLBACK_NAME","STATE_DISCONNECTED_CALLBACK_NAME","WEBCOMPONENT_STATE_READY_CALLBACK_NAME","STATE_BINDABLES_NAME","DCC_DEFINITION_ATTRIBUTE","_cache","Map","getPathInfo","pathInfo","PathInfo","segments","lastSegment","cumulativePaths","cumulativePathSet","cumulativePathInfos","cumulativePathInfoSet","parentPath","wildcardPaths","wildcardPathSet","indexByWildcardPath","wildcardPathInfos","wildcardPathInfoSet","wildcardParentPaths","wildcardParentPathSet","wildcardParentPathInfos","wildcardParentPathInfoSet","wildcardPositions","lastWildcardPath","lastWildcardInfo","wildcardCount","parentPathInfo","constructor","getPattern","_path","this","split","currentPatternPath","prevPatternPath","Set","STRUCTURAL_BINDING_TYPE_SET","optionsRequired","fnName","optionMustBeNumber","valueMustBeNumber","valueMustBeDate","validateNumberString","value","isNaN","Number","builtinFilters","eq","options","opt","ne","not","_options","lt","le","gt","ge","inc","dec","mul","div","mod","fix","toFixed","toLocaleString","uc","String","toUpperCase","lc","toLowerCase","cap","v","charAt","slice","trim","numberedOpts","opt1","opt2","substr","pad","padStart","rep","repeat","rev","reverse","join","int","parseInt","float","parseFloat","round","optValue","Math","pow","floor","ceil","percent","date","Date","toLocaleDateString","time","toLocaleTimeString","datetime","ymd","year","getFullYear","toString","month","getMonth","day","getDate","falsy","truthy","defaults","boolean","Boolean","number","string","null","outputBuiltinFilters","builtinFiltersByFilterIOType","input","output","builtinFilterFn","name","filters","filter","filterFnByKey","parseFilters","filterTextList","filterIOType","map","filterText","openParenIndex","indexOf","closeParenIndex","lastIndexOf","filterName","filterKey","filterFn","args","argsText","substring","current","inQuote","hasQuote","char","last","parseFilterArgs","trimFn","s","cacheFilterInfos","parseStatePart","statePart","pos","stateAndPath","filterTexts","filtersText","has","statePathName","stateName","statePathInfo","outFilters","parseBindTextsForElement","bindText","bindTexts","results","separatorIndex","propPart","propName","propSegments","propModifiers","inFilters","stateResult","propResult","propText","propModifiersText","parsePropPart","startsWith","some","r","bindTextByNode","bindingTypeKeywordSet","EMBEDDED_REGEX","RegExp","parseCommentNode","savedText","nodeType","Node","COMMENT_NODE","text","data","match","exec","keyword","getParseBindTextResults","ELEMENT_NODE","getAttribute","bindTextOrUUID","fragmentInfo","getFragmentInfoByUUID","parseBindTextResult","uuid","getSubscriberNodes","subscriberNodes","walker","createTreeWalker","NodeFilter","SHOW_ELEMENT","SHOW_COMMENT","acceptNode","FILTER_ACCEPT","FILTER_SKIP","nextNode","registeredNodeSet","WeakSet","collectNodesAndBindingInfos","allBindings","add","loopContextByNode","getLoopContextByNode","paramNode","loopContext","setLoopContextByNode","delete","setLoopContextAsyncSymbol","Symbol","setLoopContextSymbol","getByAddressSymbol","setByAddressSymbol","connectedCallbackSymbol","disconnectedCallbackSymbol","updatedCallbackSymbol","handlerByHandlerKey","bindingSetByHandlerKey","attachEventHandler","binding","key","modifierKey","m","sort","getHandlerKey","stateEventHandler","handlerName","modifiers","event","includes","preventDefault","stopPropagation","target","stateElement","getStateElementByName","getRootNode","createStateAsync","handler","Reflect","apply","listIndex","indexes","eventName","addEventListener","bindingSet","cache","getCustomElement","cached","undefined","element","tagName","is","CHECK_TYPES","DEFAULT_VALUE_PROP_NAMES","DEFAULT_GETTER","e","detail","attachTwowayEventHandler","customTagName","customElements","whenDefined","then","inputType","customClass","bindable","wcBindable","protocol","version","properties","p","isPossibleTwoWay","propDesc","find","modifier","getEventName","valueGetter","getter","getValueGetter","hasGetter","f","twowayEventHandler","console","warn","newValue","filteredNewValue","createState","twowayEventHandlerFunction","lastListValueByAbsoluteStateAddress","getLastListValueByAbsoluteStateAddress","address","setLastListValueByAbsoluteStateAddress","getAbsolutePathInfo","pathMap","absolutePathInfo","AbsolutePathInfo","parentAbsolutePathInfo","_cacheNullListIndex","AbsoluteStateAddress","_parentAbsoluteAddress","parentAbsoluteAddress","parentListIndex","createAbsoluteStateAddress","cacheByAbsolutePathInfo","rootNodeByFragment","setRootNodeByFragment","fragment","rootNode","getRootNodeByFragment","cacheCalcWildcardLen","calcWildcardLen","targetPathInfo","path1","path2","len","intersection","size","listIndexByBindingInfoByLoopContext","getListIndexByBindingInfo","listIndexByBindingInfo","wildcardLen","at","absoluteStateAddressByBinding","getAbsoluteStateAddressByBinding","absoluteStateAddress","isConnected","nodeName","clearAbsoluteStateAddressByBinding","completeByStateElementByWebComponent","isWebComponentComplete","webComponent","completeByStateElement","getFilteredValue","filteredValue","EMPTY_ARRAY","StateAddress","_parentAddress","parentAddress","createStateAddress","cacheByPathInfo","indexBindingsByContent","getIndexBindingsByContent","content","setIndexBindingsByContent","prototype","difference","other","result","elem","count","getUUID","ListIndex","position","_index","_version","_indexes","_listIndexes","index","dirty","listIndexes","WeakRef","varName","deref","createListIndex","listIndexesByList","getListIndexesByList","list","setListIndexesByList","listDiffByOldListByNewList","EMPTY_LIST","EMPTY_SET","createListDiff","rawOldList","rawNewList","oldList","Array","isArray","newList","cachedDiff","diffByNewList","getListDiff","oldIndexes","retValue","newIndexes","changeIndexSet","deleteIndexSet","addIndexSet","newListIndex","isSameList","indexByValue","val","newIndexSet","oldIndexSet","existingIndexes","oldIndex","shift","existingListIndex","calcDiffIndexes","diff","setListDiff","bindingSetByAbsoluteStateAddress","getBindingSetByAbsoluteStateAddress","addBindingByAbsoluteStateAddress","removeBindingByAbsoluteStateAddress","stateAddressByBindingInfo","clearStateAddressByBindingInfo","bindingsByContent","getBindingsByContent","setBindingsByContent","nodesByContent","getNodesByContent","setNodesByContent","nodes","bindLoopContextToContent","activateContent","context","applyChange","deactivateContent","mounted","unbindLoopContextToContent","contentSetByNode","setContentByNode","contents","getContentSetByNode","recursiveBindingTypes","Content","_content","_childNodeArray","_firstNode","_lastNode","_mounted","from","firstNode","lastNode","appendTo","targetNode","appendChild","mountAfter","nextSibling","insertBefore","unmount","removeChild","createContentFromNodes","createDocumentFragment","createContent","cloneFragment","importNode","initialInfo","nodeInfos","nodeInfo","nodePath","parseBindTextResults","collectNodesAndBindingInfosByFragment","_initializeBindings","initializeBindingsByFragment","indexBindings","lastNodeByNode","contentByListIndexByNode","pooledContentsByNode","isOnlyNodeInParentContentByNode","hydrateSetContent","setContent","hydrateSetLastNode","getPooledContents","setPooledContent","getContent","contentByListIndex","lastConnectedByNode","bindingInfoText","applyChangeToIf","rawNewValue","currentConnected","values","next","ssrMode","log","startComment","createComment","endComment","afterNode","store","getSsrProperties","trackedNodes","SSR_ATTR_PROPS","textContent","setAttribute","checked","removeAttribute","selected","disabled","selectedIndex","querySelectorAll","idx","applyChangeToProperty","_context","firstSegment","error","attrHandler","entries","existing","addSsrProperty","subObject","segment","oldValue","isFrozen","ssrWrappedNodes","applyChangeToWebComponent","restSegments","getValue","stateAddress","getStateAddressByBindingInfo","indexName","indexPos","getIndexValueByLoopContext","applyChangeByFirstSegment","class","className","classList","toggle","attr","attrName","style","styleName","applyChangeByBindingType","nodeValue","for","listPathInfo","absAddress","lastValue","newListValueByAbsAddress","isOnlyNode","prevCheckNode","previousSibling","nextCheckNode","onlyNode","TEXT_NODE","isOnlyNodeInParentContent","deleteIndex","elementPathInfo","loopContextStack","createLoopContext","pooledContents","pop","indexBinding","if","else","elseif","radio","elementFilteredValue","checkbox","normalizedNewValue","fnByBinding","deferredSelectBindingByBinding","_applyChange","deferredSelectBindings","fn","appliedBindingSet","updatedAbsAddressSetByStateElement","customTag","DocumentFragment","ShadowRoot","targetState","newContext","applyChangeFromBindings","bindingIndex","nextBindingInfo","nextRootNode","newListValue","absAddressSet","radioEventHandlerFunction","type","attachRadioEventHandler","radioEventHandler","checkboxEventHandlerFunction","currentValue","concat","toSpliced","attachCheckboxEventHandler","checkboxEventHandler","initializeBindings","parentLoopContext","setPathInfo","MUSTACHE_REGEX","SKIP_TAGS","convertMustacheToComments","SHOW_TEXT","textNodes","textNode","parentElement","replaceTextNode","convertTextNodes","templates","template","namespaceURI","newTemplate","createElement","childNode","attributes","replaceWith","lastIndex","test","_notFilterInfo","createNotFilter","COMMENT_REGEX","expandShorthandInStatePart","forPath","prefix","pipeIndex","atIndex","pathPart","suffix","expandCommentData","commentPrefix","commentSuffix","expandBindAttribute","attrValue","parts","changed","part","trimmed","colonIndex","expanded","expandShorthandInBindAttribute","expandShorthandPaths","bindAttr","comment","HTMLTemplateElement","getNodePath","unshift","getFragmentNodeInfos","fragmnentNodeInfos","subscriberNode","optimizeFragment","keywordByBindingType","notFilter","cloneNotParseBindTextResult","_getFragmentInfo","collectStructuralFragments","walkRoot","elseKeyword","lastIfFragmentInfo","elseFragmentInfos","childForPath","setFragmentInfoByUUID","lastElseFragmentInfo","placeHolder","remove","elseUUID","elseFragmentInfo","elsePlaceHolder","waitForStateInitialize","elements","promises","initializePromise","all","buildBindings","body","shadowRoot","host","STRUCTURAL_TYPES","collectBindingsFromLiveNodes","parent","wrapper","firstChild","findPlaceholderComment","pattern","restoreFragments","ssrEl","lastIfParseResult","tpl","hydrateBindings","ssrElements","ssrNode","verifyVersion","Ssr","cleanupDom","blocks","startComments","startMatch","SSR_BLOCK_START","info","sibling","endPattern","collectSsrBlocks","listIndexesByUuid","block","placeholderComment","hydrateBlocks","removeBlockBoundaryComments","ssrParents","el","restoreTextBindings","normalBindings","structuralBindings","absAddr","restoredSsrElements","props","hydrateProps","propMap","completedEls","stateElementByNameByNode","bindingsReadyByNode","stateElementByName","getBindingsReady","setStateElementByName","enableSsr","ready","queueMicrotask","fragmentInfoByUUID","bindingPartial","nodeBindingPartial","nodeStateElement","SSR_PLACEHOLDER_COMMENT","SSR_BLOCK_END","SSR_TEXT_START","HTMLElement","_stateData","_templates","_hydrateProps","stateData","_loadStateData","_loadTemplates","_loadHydrateProps","getTemplate","serverVersion","serverParts","clientParts","setStateData","setHydrateProps","script","JSON","parse","findByName","parentEl","Element","Document","documentElement","extractStateData","stateEl","raw","__state","buildContent","jsonScript","stringify","uuids","keys","bindResult","cloneNode","ssrNodes","propsData","entry","propsScript","clear","toRemove","removeStructuralComments","bindComment","templateByUuid","walker1","walker2","placeholders","restored","imported","child","ssrIdElements","loadFromInnerScript","scriptModule","uniq_comment","URL","createObjectURL","blob","Blob","url","import","revokeObjectURL","b64","btoa","fromCodePoint","TextEncoder","encode","default","loadFromScriptFile","LoopContextStack","_loopContextStack","fill","_length","elementStateAddress","callback","lastLoopContext","prevWildcardPathInfo","finally","getterFn","setterFn","callFn","isAsync","isInternalProperty","ResolvedAddress","paths","wildcardType","wildcardIndexes","tmpPatternSegments","incompleteCount","completeCount","lastPath","getResolvedAddress","nameInfo","cacheEntryByAbsoluteStateAddress","setCacheEntryByAbsoluteStateAddress","cacheEntry","dirtyCacheEntryByAbsoluteStateAddress","_getByAddress","receiver","parentValue","getByAddress","getterPaths","pushAddress","popAddress","_getByAddressWithCache","getCacheEntryByAbsoluteStateAddress","addressStackLength","lastInfo","lastAddressStack","addDynamicDependency","checkDependency","getContextListIndex","structuredPath","updater","_queueAbsoluteAddresses","enqueueAbsoluteAddress","absoluteAddress","requireStartProcess","absoluteAddresses","testApplyChange","absoluteAddressSet","processBindings","getUpdater","swapInfoByStateAddress","setSwapInfoByAddress","swapInfo","_walkExpandWildcard","currentWildcardIndex","parentAbsPathInfo","stateProxy","loopIndexes","listDiff","searchType","getIndexes","targetListIndexes","walkDependency","startAddress","staticDependency","dynamicDependency","listPathSet","staticMap","dynamicMap","visited","stack","depth","sourcePath","nextDepth","nextEntries","staticDeps","dep","depPathInfo","depAddress","dynamicDeps","expandContext","_walkDependency","_setByAddress","setterPaths","listPaths","absDepAddress","_setByAddressWithSwap","getSwapInfoByAddress","currentParentValue","currentListIndexes","curIndex","setByAddress","isSwappable","elementPaths","cacheable","bindableEventMap","dispatchEvent","CustomEvent","bubbles","_prop","wildcardParentPathInfo","wildcardAddress","lastValueByListAddress","getListIndex","resolvedAddress","_setLoopContext","setLoopContext","clearLoopContext","prop","newValueByAddress","wildcardPattern","walkWildcardPattern","wildcardIndexPos","parentIndexes","resultIndexes","resultValues","getAll","postUpdate","_target","_receiver","trackDependency","setLoopContextAsync","call","connectedCallback","disconnectedCallback","refs","indexesListByPath","ref","pathName","indexesList","updatedCallback","StateHandler","_stateElement","_stateName","_addressStack","_addressStackIndex","_loopContext","_mutability","mutability","trapGet","trapSet","lastValueByAbsoluteStateAddress","stateElementByWebComponent","getStateElementByWebComponent","stateMap","innerMappingByElement","outerMappingByElement","primaryMappingRuleSetByElement","primaryBindingByMappingRule","createMappingRuleByBinding","innerState","innerAbsPathInfo","outerAbsPathInfo","getOuterAbsolutePathInfo","innerMapping","outerMapping","primaryMappingRuleSet","primaryMappingRule","currentPrimaryMappingRule","primaryBinding","outerRemainingSegments","outerPathInfo","outerStateElement","addBindingByNode","meltFrozenObject","frozenObj","obj","proto","getPrototypeOf","clone","create","descriptors","getOwnPropertyDescriptors","descriptor","writable","defineProperties","cloneWithDescriptors","InnerStateProxyHandler","_webComponent","_innerStateElement","innerPathInfo","setLastValueByAbsoluteStateAddress","OuterStateProxyHandler","absStateAddress","$postUpdate","PlainOuterStateProxyHandler","getOuter","outerState","bindWebComponent","innerStateElement","component","stateProp","setStateElementByWebComponent","innerMappingRule","outerMappingRule","mappingRule","buildPrimaryMappingRule","Proxy","createOuterState","boundComponentStateProp","createInnerState","setInitialState","defineProperty","enumerable","configurable","createPlainOuterState","markWebComponentAsComplete","func","catch","getStateInfo","assign","getAllPropertyDescriptors","State","static","_name","_initialized","_initializePromise","_resolveInitialize","_connectedCallbackPromise","_resolveConnectedCallback","_loadingPromise","_resolveLoading","_setStatePromise","_resolveSetState","_listPaths","_elementPaths","_getterPaths","_setterPaths","createLoopContextStack","_dynamicDependency","_staticDependency","_pathSet","_rootNode","_boundComponent","_boundComponentStateProp","_bindableEventMap","super","_state","stateInfo","_loadFromSsrElement","_initialize","ssrState","getElementById","loadFromScriptJson","src","endsWith","response","fetch","ok","statusText","json","loadFromJsonFile","timerId","setTimeout","clearTimeout","desc","getOwnPropertyDescriptor","_initializeBindWebComponent","boundComponent","_callStateConnectedCallback","_initializeDCC","hostElement","innerHTML","shadowRootMode","mode","bindables","createWcBindable","createBindableEventMap","stateTagSelector","DCCElement","_shadow","attachShadow","setBindableEventMap","newDesc","define","defineDCC","_callStateDisconnectedCallback","connectedCallbackPromise","_addDependency","targetPath","deps","addStaticDependency","currentPathInfo","_createState","createStateProxy","nextVersion","bindProperty","registerComponents","bootstrapState","partialConfig","defineState","definition"],"mappings":"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"}
1
+ {"version":3,"file":"index.esm.min.js","sources":["../../src/config.ts","../../src/version.ts","../../src/raiseError.ts","../../src/bindings/initializeBindingPromiseByNode.ts","../../src/bindings/replaceToReplaceNode.ts","../../src/structural/resolveNodePath.ts","../../src/bindings/getBindingInfos.ts","../../src/bindings/getBindingsByNode.ts","../../src/define.ts","../../src/address/PathInfo.ts","../../src/structural/define.ts","../../src/filters/errorMessages.ts","../../src/filters/builtinFilters.ts","../../src/bindTextParser/parseFilters.ts","../../src/bindTextParser/parseFilterArgs.ts","../../src/bindTextParser/utils.ts","../../src/bindTextParser/parsePropPart.ts","../../src/bindTextParser/parseStatePart.ts","../../src/bindTextParser/parseBindTextsForElement.ts","../../src/bindings/parseCommentNode.ts","../../src/bindings/getParseBindTextResults.ts","../../src/bindTextParser/parseBindTextForEmbeddedNode.ts","../../src/bindings/getSubscriberNodes.ts","../../src/bindings/collectNodesAndBindingInfos.ts","../../src/list/loopContextByNode.ts","../../src/proxy/symbols.ts","../../src/event/handler.ts","../../src/getCustomElement.ts","../../src/event/isPossibleTwoWay.ts","../../src/event/twowayHandler.ts","../../src/list/lastListValueByAbsoluteStateAddress.ts","../../src/address/AbsolutePathInfo.ts","../../src/address/AbsoluteStateAddress.ts","../../src/apply/rootNodeByFragment.ts","../../src/address/calcWildcardLen.ts","../../src/list/getListIndexByBindingInfo.ts","../../src/binding/getAbsoluteStateAddressByBinding.ts","../../src/webComponent/completeWebComponent.ts","../../src/apply/getFilteredValue.ts","../../src/apply/applyChangeToCheckbox.ts","../../src/createEmptyArray.ts","../../src/address/StateAddress.ts","../../src/bindings/indexBindingsByContent.ts","../../src/polyfills.ts","../../src/getUUID.ts","../../src/list/createListIndex.ts","../../src/list/listIndexesByList.ts","../../src/list/createListDiff.ts","../../src/binding/getBindingSetByAbsoluteStateAddress.ts","../../src/binding/getStateAddressByBindingInfo.ts","../../src/bindings/bindingsByContent.ts","../../src/bindings/nodesByContent.ts","../../src/bindings/bindLoopContextToContent.ts","../../src/structural/activateContent.ts","../../src/structural/contentsByNode.ts","../../src/createEmptySet.ts","../../src/structural/createContent.ts","../../src/bindings/initializeBindings.ts","../../src/apply/applyChangeToFor.ts","../../src/apply/applyChangeToIf.ts","../../src/apply/ssrPropertyStore.ts","../../src/apply/applyChangeToProperty.ts","../../src/apply/applyChangeToText.ts","../../src/apply/applyChangeToWebComponent.ts","../../src/apply/getValue.ts","../../src/list/getIndexValueByLoopContext.ts","../../src/apply/applyChange.ts","../../src/apply/applyChangeToClass.ts","../../src/apply/applyChangeToAttribute.ts","../../src/apply/applyChangeToStyle.ts","../../src/apply/applyChangeToRadio.ts","../../src/apply/applyChangeFromBindings.ts","../../src/event/radioHandler.ts","../../src/event/checkboxHandler.ts","../../src/mustache/convertMustacheToComments.ts","../../src/structural/createNotFilter.ts","../../src/structural/expandShorthandPaths.ts","../../src/structural/getNodePath.ts","../../src/structural/getFragmentNodeInfos.ts","../../src/structural/optimizeFragment.ts","../../src/structural/collectStructuralFragments.ts","../../src/waitForStateInitialize.ts","../../src/buildBindings.ts","../../src/hydrateBindings.ts","../../src/stateElementByName.ts","../../src/structural/fragmentInfoByUUID.ts","../../src/components/Ssr.ts","../../src/stateLoader/loadFromInnerScript.ts","../../src/stateLoader/loadFromScriptFile.ts","../../src/list/loopContext.ts","../../src/dcc/dccPropertyFactories.ts","../../src/address/ResolvedAddress.ts","../../src/cache/cacheEntryByAbsoluteStateAddress.ts","../../src/proxy/methods/getByAddress.ts","../../src/proxy/methods/checkDependency.ts","../../src/proxy/methods/getContextListIndex.ts","../../src/updater/updater.ts","../../src/proxy/methods/swapInfo.ts","../../src/dependency/walkDependency.ts","../../src/proxy/methods/setByAddress.ts","../../src/proxy/apis/resolve.ts","../../src/proxy/apis/getAll.ts","../../src/proxy/methods/getListIndex.ts","../../src/proxy/methods/setLoopContext.ts","../../src/proxy/traps/get.ts","../../src/proxy/apis/postUpdate.ts","../../src/proxy/apis/trackDependency.ts","../../src/proxy/apis/connectedCallback.ts","../../src/proxy/apis/disconnectedCallback.ts","../../src/proxy/apis/updatedCallback.ts","../../src/proxy/StateHandler.ts","../../src/proxy/traps/set.ts","../../src/webComponent/lastValueByAbsoluteStateAddress.ts","../../src/webComponent/stateElementByWebComponent.ts","../../src/webComponent/MappingRule.ts","../../src/webComponent/meltFrozenObject.ts","../../src/webComponent/innerState.ts","../../src/webComponent/outerState.ts","../../src/webComponent/plainOuterState.ts","../../src/webComponent/bindWebComponent.ts","../../src/components/State.ts","../../src/stateLoader/loadFromScriptJson.ts","../../src/stateLoader/loadFromJsonFile.ts","../../src/dcc/defineDCC.ts","../../src/dcc/wcBindable.ts","../../src/registerComponents.ts","../../src/bootstrapState.ts","../../src/defineState.ts"],"sourcesContent":["import { IConfig, IWritableConfig } from \"./types.js\";\n\nlet _inSsrCache: boolean | null = null;\n\nexport function inSsr(): boolean {\n if (_inSsrCache !== null) return _inSsrCache;\n const html = document.querySelector('html');\n _inSsrCache = html ? html.hasAttribute('data-wcs-server') : false;\n return _inSsrCache;\n}\n\n/** @internal テスト用: inSsr() キャッシュをリセット */\nexport function resetSsrCache(): void {\n _inSsrCache = null;\n}\n\ninterface IInternalConfig {\n bindAttributeName: string;\n commentTextPrefix: string;\n commentForPrefix: string;\n commentIfPrefix: string;\n commentElseIfPrefix: string;\n commentElsePrefix: string;\n tagNames: {\n state: string;\n ssr: string;\n };\n locale: string;\n debug: boolean;\n enableMustache: boolean;\n}\n\nconst _config: IInternalConfig = {\n bindAttributeName: 'data-wcs',\n commentTextPrefix: 'wcs-text',\n commentForPrefix: 'wcs-for',\n commentIfPrefix: 'wcs-if',\n commentElseIfPrefix: 'wcs-elseif',\n commentElsePrefix: 'wcs-else',\n tagNames: {\n state: 'wcs-state',\n ssr: 'wcs-ssr',\n },\n locale: 'en',\n debug: false,\n enableMustache: true,\n};\n\n// backward compatible export (read-only usage)\nexport const config: IConfig = _config as IConfig;\n\nexport function getConfig(): IConfig {\n return config;\n}\n\nexport function setConfig(partialConfig: IWritableConfig): void {\n if (partialConfig.tagNames) {\n Object.assign(_config.tagNames, partialConfig.tagNames);\n }\n if (typeof partialConfig.bindAttributeName === \"string\") {\n _config.bindAttributeName = partialConfig.bindAttributeName;\n }\n if (typeof partialConfig.commentTextPrefix === \"string\") {\n _config.commentTextPrefix = partialConfig.commentTextPrefix;\n }\n if (typeof partialConfig.commentForPrefix === \"string\") {\n _config.commentForPrefix = partialConfig.commentForPrefix;\n }\n if (typeof partialConfig.commentIfPrefix === \"string\") {\n _config.commentIfPrefix = partialConfig.commentIfPrefix;\n }\n if (typeof partialConfig.commentElseIfPrefix === \"string\") {\n _config.commentElseIfPrefix = partialConfig.commentElseIfPrefix;\n }\n if (typeof partialConfig.commentElsePrefix === \"string\") {\n _config.commentElsePrefix = partialConfig.commentElsePrefix;\n }\n if (typeof partialConfig.locale === \"string\") {\n _config.locale = partialConfig.locale;\n }\n if (typeof partialConfig.debug === \"boolean\") {\n _config.debug = partialConfig.debug;\n }\n if (typeof partialConfig.enableMustache === \"boolean\") {\n _config.enableMustache = partialConfig.enableMustache;\n }\n}\n","import pkg from \"../package.json\" with { type: \"json\" };\nexport const VERSION = pkg.version;\n","\nexport function raiseError(message: string): never {\n throw new Error(`[@wcstack/state] ${message}`);\n}","import { IInitializeBindingPromise } from \"./types\";\n\nconst bindingPromiseByNode = new WeakMap<Node, IInitializeBindingPromise>();\n\nlet id = 0;\n\nexport function getInitializeBindingPromiseByNode(node: Node): IInitializeBindingPromise {\n let bindingPromise = bindingPromiseByNode.get(node) || null;\n if (bindingPromise !== null) {\n return bindingPromise;\n }\n let resolveFn = undefined;\n const promise = new Promise<void>((resolve) => {\n resolveFn = resolve;\n });\n bindingPromise = {\n id: ++id,\n promise,\n resolve: resolveFn!\n };\n bindingPromiseByNode.set(node, bindingPromise);\n return bindingPromise;\n}\n\nexport async function waitInitializeBinding(node: Node): Promise<void> {\n const bindingPromise = getInitializeBindingPromiseByNode(node);\n await bindingPromise.promise;\n}\n\nexport function resolveInitializedBinding(node: Node): void {\n const bindingPromise = getInitializeBindingPromiseByNode(node);\n bindingPromise.resolve();\n}\n","import { IBindingInfo } from \"../types.js\";\n\nexport function replaceToReplaceNode(bindingInfo: IBindingInfo): void {\n const node = bindingInfo.node;\n const replaceNode = bindingInfo.replaceNode;\n if (node === replaceNode) {\n return;\n }\n if (node.parentNode === null) {\n // already replaced\n return;\n }\n node.parentNode.replaceChild(replaceNode, node);\n}\n","\nexport function resolveNodePath(root: Node, path: number[]): Node | null {\n let currentNode = root;\n if (path.length === 0) return currentNode;\n // path.reduce()だと途中でnullになる可能性があるので、\n for(let i = 0; i < path.length; i++) {\n currentNode = currentNode?.childNodes[path[i]] ?? null;\n if (currentNode === null) break;\n }\n return currentNode;\n}","import { IBindingInfo } from \"../types\";\nimport { ParseBindTextResult } from \"../bindTextParser/types\";\n\nexport function getBindingInfos(node: Node, parseBindingTextResults: ParseBindTextResult[]): IBindingInfo[] {\n const bindingInfos: IBindingInfo[] = [];\n for (const parseBindingTextResult of parseBindingTextResults) {\n if (parseBindingTextResult.bindingType !== 'text') {\n bindingInfos.push({\n ...parseBindingTextResult,\n node: node,\n replaceNode: node,\n });\n } else {\n const replaceNode = document.createTextNode('');\n bindingInfos.push({\n ...parseBindingTextResult,\n node: node,\n replaceNode: replaceNode,\n });\n }\n }\n return bindingInfos;\n}\n","import { IBindingInfo } from \"../binding/types\";\n\nconst bindingsByNode = new WeakMap<Node, IBindingInfo[]>();\n\nexport function getBindingsByNode(node: Node): IBindingInfo[] | null {\n return bindingsByNode.get(node) || null;\n}\n\nexport function setBindingsByNode(node: Node, bindings: IBindingInfo[]): void {\n bindingsByNode.set(node, bindings);\n}\n\nexport function addBindingByNode(node: Node, binding: IBindingInfo): void {\n const bindings = getBindingsByNode(node);\n if (bindings === null) {\n setBindingsByNode(node, [binding]);\n } else {\n bindings.push(binding);\n }\n}","export const DELIMITER = '.';\nexport const WILDCARD = '*';\nexport const MAX_WILDCARD_DEPTH = 128;\nexport const MAX_LOOP_DEPTH = 128;\n\n/**\n * stackIndexByIndexName\n * インデックス名からスタックインデックスへのマッピング\n * $1 => 0\n * $2 => 1\n * :\n * ${i + 1} => i\n * i < MAX_WILDCARD_DEPTH\n */\nconst tmpIndexByIndexName: { [key: PropertyKey]: number } = {};\nfor (let i = 0; i < MAX_WILDCARD_DEPTH; i++) {\n tmpIndexByIndexName[`$${i+1}`] = i;\n}\nexport const INDEX_BY_INDEX_NAME: { [key: PropertyKey]: number } = Object.freeze(tmpIndexByIndexName);\n\nexport const NO_SET_TIMEOUT = 60 * 1000; // 1分\n\nexport const SVG_NAMESPACE = 'http://www.w3.org/2000/svg';\n\nexport const STATE_CONNECTED_CALLBACK_NAME = \"$connectedCallback\";\nexport const STATE_DISCONNECTED_CALLBACK_NAME = \"$disconnectedCallback\";\nexport const STATE_UPDATED_CALLBACK_NAME = \"$updatedCallback\";\n\nexport const WEBCOMPONENT_STATE_READY_CALLBACK_NAME = \"$stateReadyCallback\";\n\nexport const STATE_BINDABLES_NAME = \"$bindables\";\nexport const DCC_DEFINITION_ATTRIBUTE = \"data-wc-definition\";\n","import { WILDCARD } from \"../define.js\";\nimport { IPathInfo } from \"./types.js\";\n\nconst _cache: Map<string, IPathInfo> = new Map();\n\nlet id: number = 0;\nexport function getPathInfo(path: string): IPathInfo {\n let pathInfo = _cache.get(path);\n if (typeof pathInfo !== \"undefined\") {\n return pathInfo;\n }\n pathInfo = Object.freeze(new PathInfo(path));\n _cache.set(path, pathInfo);\n return pathInfo;\n}\n\nclass PathInfo implements IPathInfo {\n readonly id: number = ++id;\n readonly path: string;\n readonly segments: string[];\n readonly lastSegment: string;\n readonly cumulativePaths: string[];\n readonly cumulativePathSet: Set<string>;\n readonly cumulativePathInfos: IPathInfo[];\n readonly cumulativePathInfoSet: Set<IPathInfo>;\n readonly parentPath: string | null;\n readonly wildcardPaths: string[];\n readonly wildcardPathSet: Set<string>;\n readonly indexByWildcardPath: Record<string, number>;\n readonly wildcardPathInfos: IPathInfo[];\n readonly wildcardPathInfoSet: Set<IPathInfo>;\n readonly wildcardParentPaths: string[];\n readonly wildcardParentPathSet: Set<string>;\n readonly wildcardParentPathInfos: IPathInfo[];\n readonly wildcardParentPathInfoSet: Set<IPathInfo>;\n readonly wildcardPositions: number[];\n readonly lastWildcardPath: string | null;\n readonly lastWildcardInfo: IPathInfo | null;\n readonly wildcardCount: number;\n readonly parentPathInfo: IPathInfo | null;\n constructor(path: string) {\n // Helper to get or create StructuredPathInfo instances, avoiding redundant creation for self-reference\n const getPattern = (_path: string): IPathInfo => {\n return (path === _path) ? this : getPathInfo(_path);\n };\n \n // Split the pattern into individual path segments (e.g., \"items.*.name\" → [\"items\", \"*\", \"name\"])\n const segments = path.split(\".\");\n \n // Arrays to track all cumulative paths from root to each segment\n const cumulativePaths = [];\n const cumulativePathInfos: IPathInfo[] = [];\n \n // Arrays to track wildcard-specific information\n const wildcardPaths = [];\n const indexByWildcardPath: Record<string, number> = {}; // Maps wildcard path to its index position\n const wildcardPathInfos = [];\n const wildcardParentPaths = []; // Paths of parent segments for each wildcard\n const wildcardParentPathInfos = [];\n const wildcardPositions = [];\n \n let currentPatternPath = \"\", prevPatternPath = \"\";\n let wildcardCount = 0;\n \n // Iterate through each segment to build cumulative paths and identify wildcards\n for(let i = 0; i < segments.length; i++) {\n currentPatternPath += segments[i];\n \n // If this segment is a wildcard, track it with all wildcard-specific metadata\n if (segments[i] === WILDCARD) {\n wildcardPaths.push(currentPatternPath);\n indexByWildcardPath[currentPatternPath] = wildcardCount; // Store wildcard's ordinal position\n wildcardPathInfos.push(getPattern(currentPatternPath));\n wildcardParentPaths.push(prevPatternPath); // Parent path is the previous cumulative path\n wildcardParentPathInfos.push(getPattern(prevPatternPath));\n wildcardPositions.push(i);\n wildcardCount++;\n }\n \n // Track all cumulative paths for hierarchical navigation (e.g., \"items\", \"items.*\", \"items.*.name\")\n cumulativePaths.push(currentPatternPath);\n cumulativePathInfos.push(getPattern(currentPatternPath));\n \n // Save current path as previous for next iteration, then add separator\n prevPatternPath = currentPatternPath;\n currentPatternPath += \".\";\n }\n \n // Determine the deepest (last) wildcard path and the parent path of the entire pattern\n const lastWildcardPath = wildcardPaths.length > 0 ? wildcardPaths[wildcardPaths.length - 1] : null;\n const parentPath = cumulativePaths.length > 1 ? cumulativePaths[cumulativePaths.length - 2] : null;\n \n // Assign all analyzed data to readonly properties\n this.path = path;\n this.segments = segments;\n this.lastSegment = segments[segments.length - 1];\n this.cumulativePaths = cumulativePaths;\n this.cumulativePathSet = new Set(cumulativePaths); // Set for fast lookup\n this.cumulativePathInfos = cumulativePathInfos;\n this.cumulativePathInfoSet = new Set(cumulativePathInfos);\n this.wildcardPaths = wildcardPaths;\n this.wildcardPathSet = new Set(wildcardPaths);\n this.indexByWildcardPath = indexByWildcardPath;\n this.wildcardPathInfos = wildcardPathInfos;\n this.wildcardPathInfoSet = new Set(wildcardPathInfos);\n this.wildcardParentPaths = wildcardParentPaths;\n this.wildcardParentPathSet = new Set(wildcardParentPaths);\n this.wildcardParentPathInfos = wildcardParentPathInfos;\n this.wildcardParentPathInfoSet = new Set(wildcardParentPathInfos);\n this.wildcardPositions = wildcardPositions;\n this.lastWildcardPath = lastWildcardPath;\n this.lastWildcardInfo = lastWildcardPath ? getPattern(lastWildcardPath) : null;\n this.parentPath = parentPath;\n this.parentPathInfo = parentPath ? getPattern(parentPath) : null;\n this.wildcardCount = wildcardCount;\n }\n}\n","import { BindingType } from \"../types.js\";\n\nexport const STRUCTURAL_BINDING_TYPE_SET: Set<BindingType> = new Set([\n \"if\",\n \"elseif\",\n \"else\",\n \"for\",\n]);\n","/**\n * errorMessages.ts\n *\n * Error message generation utilities used by filter functions.\n *\n * Main responsibilities:\n * - Throws clear error messages when filter options or value type checks fail\n * - Takes function name as argument to specify which filter caused the error\n *\n * Design points:\n * - optionsRequired: Error when required option is not specified\n * - optionMustBeNumber: Error when option value is not a number\n * - valueMustBeNumber: Error when value is not a number\n * - valueMustBeBoolean: Error when value is not boolean\n * - valueMustBeDate: Error when value is not a Date\n */\nimport { raiseError } from \"../raiseError\";\n\n/**\n * Throws error when filter requires at least one option but none provided.\n * \n * @param fnName - Name of the filter function\n * @returns Never returns (always throws)\n */\nexport function optionsRequired(fnName:string): never {\n raiseError(`filter ${fnName} requires at least one option`);\n}\n\n/**\n * Throws error when filter option must be a number but invalid value provided.\n * \n * @param fnName - Name of the filter function\n * @returns Never returns (always throws)\n */\nexport function optionMustBeNumber(fnName:string): never {\n raiseError(`filter ${fnName} requires a number as option`);\n}\n\n/**\n * Throws error when filter requires numeric value but non-number provided.\n * \n * @param fnName - Name of the filter function\n * @returns Never returns (always throws)\n */\nexport function valueMustBeNumber(fnName:string): never {\n raiseError(`filter ${fnName} requires a number value`);\n}\n\n/**\n * Throws error when filter requires numeric value but non-number provided.\n * \n * @param fnName - Name of the filter function\n * @returns Never returns (always throws)\n */\nexport function valueMustBeString(fnName:string): never {\n raiseError(`filter ${fnName} requires a string value`);\n}\n\n/**\n * Throws error when filter requires boolean value but non-boolean provided.\n * \n * @param fnName - Name of the filter function\n * @returns Never returns (always throws)\n */\nexport function valueMustBeBoolean(fnName:string): never {\n raiseError(`filter ${fnName} requires a boolean value`);\n} \n\n/**\n * Throws error when filter requires Date value but non-Date provided.\n * \n * @param fnName - Name of the filter function\n * @returns Never returns (always throws)\n */\nexport function valueMustBeDate(fnName:string): never {\n raiseError(`filter ${fnName} requires a date value`);\n}","/**\n * builtinFilters.ts\n *\n * Implementation file for built-in filter functions available in Structive.\n *\n * Main responsibilities:\n * - Provides filters for conversion, comparison, formatting, and validation of numbers, strings, dates, booleans, etc.\n * - Defines functions with options for each filter name, enabling flexible use during binding\n * - Designed for common use as both input and output filters\n *\n * Design points:\n * - Comprehensive coverage of diverse filters: eq, ne, lt, gt, inc, fix, locale, uc, lc, cap, trim, slice, pad, int, float, round, date, time, ymd, falsy, truthy, defaults, boolean, number, string, null, etc.\n * - Rich type checking and error handling for option values\n * - Centralized management of filter functions with FilterWithOptions type, easy to extend\n * - Dynamic retrieval of filter functions from filter names and options via builtinFilterFn\n */\nimport { config } from \"../config.js\";\nimport { raiseError } from \"../raiseError.js\";\nimport { optionMustBeNumber, optionsRequired, valueMustBeBoolean, valueMustBeDate, valueMustBeNumber } from \"./errorMessages.js\";\nimport { FilterFn, FilterWithOptions } from \"./types\";\n\nfunction validateNumberString(value: string): boolean {\n if (!value || isNaN(Number(value))) {\n return false;\n }\n return true;\n}\n\n/**\n * Equality filter - compares value with option.\n * \n * @param options - Array with comparison value as first element\n * @returns Filter function that returns boolean\n */\nconst eq = (options?:string[]): FilterFn<boolean> => {\n const opt = options?.[0] ?? optionsRequired('eq');\n return (value: unknown): boolean => {\n // Align types for comparison\n if (typeof value === 'number') {\n if (!validateNumberString(opt)) {optionMustBeNumber('eq');}\n return value === Number(opt);\n }\n if (typeof value === 'string') {\n return value === opt;\n }\n // Strict equality for others\n return value === opt;\n }\n}\n\n/**\n * Inequality filter - compares value with option.\n * \n * @param options - Array with comparison value as first element\n * @returns Filter function that returns boolean\n */\nconst ne = (options?:string[]): FilterFn<boolean> => {\n const opt = options?.[0] ?? optionsRequired('ne');\n return (value: unknown): boolean => {\n // Align types for comparison\n if (typeof value === 'number') {\n if (!validateNumberString(opt)) {optionMustBeNumber('ne');}\n return value !== Number(opt);\n }\n if (typeof value === 'string') {\n return value !== opt;\n }\n // Strict equality for others\n return value !== opt;\n }\n}\n\n/**\n * Boolean NOT filter - inverts boolean value.\n * \n * @param options - Unused\n * @returns Filter function that returns inverted boolean\n */\nconst not = (_options?:string[]): FilterFn<boolean> => {\n return (value: unknown): boolean => {\n if (typeof value !== 'boolean') {valueMustBeBoolean('not');}\n return !value;\n }\n}\n\n/**\n * Less than filter - checks if value is less than option.\n * \n * @param options - Array with comparison number as first element\n * @returns Filter function that returns boolean\n */\nconst lt = (options?:string[]): FilterFn<boolean> => {\n const opt = options?.[0] ?? optionsRequired('lt');\n if (!validateNumberString(opt)) {optionMustBeNumber('lt');}\n return (value: unknown): boolean => {\n if (typeof value !== 'number') {valueMustBeNumber('lt');}\n return value < Number(opt);\n }\n}\n\n/**\n * Less than or equal filter - checks if value is less than or equal to option.\n * \n * @param options - Array with comparison number as first element\n * @returns Filter function that returns boolean\n */\nconst le = (options?:string[]): FilterFn<boolean> => {\n const opt = options?.[0] ?? optionsRequired('le');\n if (!validateNumberString(opt)) {optionMustBeNumber('le');}\n return (value: unknown): boolean => {\n if (typeof value !== 'number') {valueMustBeNumber('le');}\n return value <= Number(opt);\n }\n}\n\n/**\n * Greater than filter - checks if value is greater than option.\n * \n * @param options - Array with comparison number as first element\n * @returns Filter function that returns boolean\n */\nconst gt = (options?:string[]): FilterFn<boolean> => {\n const opt = options?.[0] ?? optionsRequired('gt');\n if (!validateNumberString(opt)) {optionMustBeNumber('gt');}\n return (value: unknown): boolean => {\n if (typeof value !== 'number') {valueMustBeNumber('gt');}\n return value > Number(opt);\n }\n}\n\n/**\n * Greater than or equal filter - checks if value is greater than or equal to option.\n * \n * @param options - Array with comparison number as first element\n * @returns Filter function that returns boolean\n */\nconst ge = (options?:string[]): FilterFn<boolean> => {\n const opt = options?.[0] ?? optionsRequired('ge');\n if (!validateNumberString(opt)) {optionMustBeNumber('ge');}\n return (value: unknown): boolean => {\n if (typeof value !== 'number') {valueMustBeNumber('ge');}\n return value >= Number(opt);\n }\n}\n\n/**\n * Increment filter - adds option value to input value.\n * \n * @param options - Array with increment number as first element\n * @returns Filter function that returns incremented number\n */\nconst inc = (options?:string[]): FilterFn<number> => {\n const opt = options?.[0] ?? optionsRequired('inc');\n if (!validateNumberString(opt)) {optionMustBeNumber('inc');}\n return (value: unknown): number => {\n if (typeof value !== 'number') {valueMustBeNumber('inc');}\n return value + Number(opt);\n }\n}\n\n/**\n * Decrement filter - subtracts option value from input value.\n * \n * @param options - Array with decrement number as first element\n * @returns Filter function that returns decremented number\n */\nconst dec = (options?:string[]): FilterFn<number> => {\n const opt = options?.[0] ?? optionsRequired('dec');\n if (!validateNumberString(opt)) {optionMustBeNumber('dec');}\n return (value: unknown): number => {\n if (typeof value !== 'number') {valueMustBeNumber('dec');}\n return value - Number(opt);\n }\n}\n\n/**\n * Multiply filter - multiplies value by option.\n * \n * @param options - Array with multiplier number as first element\n * @returns Filter function that returns multiplied number\n */\nconst mul = (options?:string[]): FilterFn<number> => {\n const opt = options?.[0] ?? optionsRequired('mul');\n if (!validateNumberString(opt)) {optionMustBeNumber('mul');}\n return (value: unknown): number => {\n if (typeof value !== 'number') {valueMustBeNumber('mul');}\n return value * Number(opt);\n }\n}\n\n/**\n * Divide filter - divides value by option.\n * \n * @param options - Array with divisor number as first element\n * @returns Filter function that returns divided number\n */\nconst div = (options?:string[]): FilterFn<number> => {\n const opt = options?.[0] ?? optionsRequired('div');\n if (!validateNumberString(opt)) {optionMustBeNumber('div');}\n return (value: unknown): number => {\n if (typeof value !== 'number') {valueMustBeNumber('div');}\n return value / Number(opt);\n }\n}\n\n/**\n * Modulo filter - returns remainder of division.\n * \n * @param options - Array with divisor number as first element\n * @returns Filter function that returns remainder\n */\nconst mod = (options?:string[]): FilterFn<number> => {\n const opt = options?.[0] ?? optionsRequired('mod');\n if (!validateNumberString(opt)) {optionMustBeNumber('mod');}\n return (value: unknown): number => {\n if (typeof value !== 'number') {valueMustBeNumber('mod');}\n return value % Number(opt);\n }\n}\n\n/**\n * Fixed decimal filter - formats number to fixed decimal places.\n * \n * @param options - Array with decimal places as first element (default: 0)\n * @returns Filter function that returns formatted string\n */\nconst fix = (options?:string[]): FilterFn<string> => {\n const opt = options?.[0] ?? \"0\";\n if (!validateNumberString(opt)) {optionMustBeNumber('fix');}\n return (value: unknown): string => {\n if (typeof value !== 'number') {valueMustBeNumber('fix');}\n return value.toFixed(Number(opt));\n }\n}\n\n/**\n * Locale number filter - formats number according to locale.\n * \n * @param options - Array with locale string as first element (default: config.locale)\n * @returns Filter function that returns localized number string\n */\nconst locale = (options?:string[]): FilterFn<string> => {\n const opt = options?.[0] ?? config.locale;\n return (value: unknown): string => {\n if (typeof value !== 'number') {valueMustBeNumber('locale');}\n return value.toLocaleString(opt);\n }\n}\n\n/**\n * Uppercase filter - converts string to uppercase.\n * \n * @param options - Unused\n * @returns Filter function that returns uppercase string\n */\nconst uc = (_options?:string[]): FilterFn<string> => {\n return (value: unknown): string => {\n return String(value).toUpperCase();\n }\n}\n\n/**\n * Lowercase filter - converts string to lowercase.\n * \n * @param options - Unused\n * @returns Filter function that returns lowercase string\n */\nconst lc = (_options?:string[]): FilterFn<string> => {\n return (value: unknown): string => {\n return String(value).toLowerCase();\n }\n}\n\n/**\n * Capitalize filter - capitalizes first character of string.\n * \n * @param options - Unused\n * @returns Filter function that returns capitalized string\n */\nconst cap = (_options?:string[]): FilterFn<string> => {\n return (value: unknown): string => {\n const v = String(value);\n if (v.length === 0) {return v;}\n if (v.length === 1) {return v.toUpperCase();}\n return v.charAt(0).toUpperCase() + v.slice(1);\n }\n}\n\n/**\n * Trim filter - removes whitespace from both ends of string.\n * \n * @param options - Unused\n * @returns Filter function that returns trimmed string\n */\nconst trim = (_options?:string[]): FilterFn<string> => {\n return (value: unknown): string => {\n return String(value).trim();\n }\n}\n\n/**\n * Slice filter - extracts portion of string from specified index.\n * \n * @param options - Array with start index and optional end index\n * @returns Filter function that returns sliced string\n */\nconst slice = (options?:string[]): FilterFn<string> => {\n const numberedOpts: number[] = [];\n const opt1 = options?.[0] ?? optionsRequired('slice');\n if (!validateNumberString(opt1)) {optionMustBeNumber('slice');}\n numberedOpts.push(Number(opt1));\n const opt2 = options?.[1];\n if (typeof opt2 !== 'undefined') {\n if (!validateNumberString(opt2)) {optionMustBeNumber('slice');}\n numberedOpts.push(Number(opt2));\n }\n return (value: unknown): string => {\n return String(value).slice(...numberedOpts);\n }\n}\n\n/**\n * Substring filter - extracts substring from specified position and length.\n * \n * @param options - Array with start index and length\n * @returns Filter function that returns substring\n */\nconst substr = (options?:string[]): FilterFn<string> => {\n const opt1 = options?.[0] ?? optionsRequired('substr');\n if (!validateNumberString(opt1)) {optionMustBeNumber('substr');}\n const opt2 = options?.[1] ?? optionsRequired('substr');\n if (!validateNumberString(opt2)) {optionMustBeNumber('substr');}\n return (value: unknown): string => {\n return String(value).substr(Number(opt1), Number(opt2));\n }\n}\n\n/**\n * Pad filter - pads string to specified length from start.\n * \n * @param options - Array with target length and pad string (default: '0')\n * @returns Filter function that returns padded string\n */\nconst pad = (options?:string[]): FilterFn<string> => {\n const opt1 = options?.[0] ?? optionsRequired('pad');\n if (!validateNumberString(opt1)) {optionMustBeNumber('pad');}\n const opt2 = options?.[1] ?? '0';\n return (value: unknown): string => {\n return String(value).padStart(Number(opt1), opt2);\n }\n}\n\n/**\n * Repeat filter - repeats string specified number of times.\n * \n * @param options - Array with repeat count as first element\n * @returns Filter function that returns repeated string\n */\nconst rep = (options?:string[]): FilterFn<string> => {\n const opt = options?.[0] ?? optionsRequired('rep');\n if (!validateNumberString(opt)) {optionMustBeNumber('rep');}\n return (value: unknown): string => {\n return String(value).repeat(Number(opt));\n }\n}\n\n/**\n * Reverse filter - reverses character order in string.\n * \n * @param options - Unused\n * @returns Filter function that returns reversed string\n */\nconst rev = (_options?:string[]): FilterFn<string> => {\n return (value: unknown): string => {\n return String(value).split('').reverse().join('');\n }\n}\n\n/**\n * Integer filter - parses value to integer.\n * \n * @param options - Unused\n * @returns Filter function that returns integer\n */\nconst int = (_options?:string[]): FilterFn<number> => {\n return (value: unknown): number => {\n return parseInt(String(value), 10);\n }\n}\n\n/**\n * Float filter - parses value to floating point number.\n * \n * @param options - Unused\n * @returns Filter function that returns float\n */\nconst float = (_options?:string[]): FilterFn<number> => {\n return (value: unknown): number => {\n return parseFloat(String(value));\n }\n}\n\n/**\n * Round filter - rounds number to specified decimal places.\n * \n * @param options - Array with decimal places as first element (default: 0)\n * @returns Filter function that returns rounded number\n */\nconst round = (options?:string[]): FilterFn<number> => {\n const opt = options?.[0] ?? '0';\n if (!validateNumberString(opt)) {optionMustBeNumber('round');}\n return (value: unknown): number => {\n if (typeof value !== 'number') {valueMustBeNumber('round');}\n const optValue = Math.pow(10, Number(opt));\n return Math.round(value * optValue) / optValue;\n }\n}\n\n/**\n * Floor filter - rounds number down to specified decimal places.\n * \n * @param options - Array with decimal places as first element (default: 0)\n * @returns Filter function that returns floored number\n */\nconst floor = (options?:string[]): FilterFn<number> => {\n const opt = options?.[0] ?? '0';\n if (!validateNumberString(opt)) {optionMustBeNumber('floor');}\n return (value: unknown): number => {\n if (typeof value !== 'number') {valueMustBeNumber('floor');}\n const optValue = Math.pow(10, Number(opt));\n return Math.floor(value * optValue) / optValue;\n }\n}\n\n/**\n * Ceiling filter - rounds number up to specified decimal places.\n * \n * @param options - Array with decimal places as first element (default: 0)\n * @returns Filter function that returns ceiled number\n */\nconst ceil = (options?:string[]): FilterFn<number> => {\n const opt = options?.[0] ?? '0';\n if (!validateNumberString(opt)) {optionMustBeNumber('ceil');}\n return (value: unknown): number => {\n if (typeof value !== 'number') {valueMustBeNumber('ceil');}\n const optValue = Math.pow(10, Number(opt));\n return Math.ceil(value * optValue) / optValue;\n }\n}\n\n/**\n * Percent filter - formats number as percentage string.\n * \n * @param options - Array with decimal places as first element (default: 0)\n * @returns Filter function that returns percentage string with '%'\n */\nconst percent = (options?:string[]): FilterFn<string> => {\n const opt = options?.[0] ?? '0';\n if (!validateNumberString(opt)) {optionMustBeNumber('percent');}\n return (value: unknown): string => {\n if (typeof value !== 'number') {valueMustBeNumber('percent');}\n return `${(value * 100).toFixed(Number(opt))}%`;\n }\n}\n\n/**\n * Date filter - formats Date object as localized date string.\n * \n * @param options - Array with locale string as first element (default: config.locale)\n * @returns Filter function that returns date string\n */\nconst date = (options?:string[]): FilterFn<string> => {\n const opt = options?.[0] ?? config.locale;\n return (value: unknown): string => {\n if (!(value instanceof Date)) {valueMustBeDate('date');}\n return value.toLocaleDateString(opt);\n }\n}\n\n/**\n * Time filter - formats Date object as localized time string.\n * \n * @param options - Array with locale string as first element (default: config.locale)\n * @returns Filter function that returns time string\n */\nconst time = (options?:string[]): FilterFn<string> => {\n const opt = options?.[0] ?? config.locale;\n return (value: unknown): string => {\n if (!(value instanceof Date)) {valueMustBeDate('time');}\n return value.toLocaleTimeString(opt);\n }\n}\n\n/**\n * DateTime filter - formats Date object as localized date and time string.\n * \n * @param options - Array with locale string as first element (default: config.locale)\n * @returns Filter function that returns datetime string\n */\nconst datetime = (options?:string[]): FilterFn<string> => {\n const opt = options?.[0] ?? config.locale;\n return (value: unknown): string => {\n if (!(value instanceof Date)) {valueMustBeDate('datetime');}\n return value.toLocaleString(opt);\n }\n}\n\n/**\n * Year-Month-Day filter - formats Date object as YYYY-MM-DD string.\n * \n * @param options - Array with separator string as first element (default: '-')\n * @returns Filter function that returns formatted date string\n */\nconst ymd = (options?:string[]): FilterFn<string> => {\n const opt = options?.[0] ?? '-';\n return (value: unknown): string => {\n if (!(value instanceof Date)) {valueMustBeDate('ymd');}\n const year = value.getFullYear().toString();\n const month = (value.getMonth() + 1).toString().padStart(2, '0');\n const day = value.getDate().toString().padStart(2, '0');\n return `${year}${opt}${month}${opt}${day}`;\n }\n}\n\n/**\n * Falsy filter - checks if value is falsy.\n * \n * @param options - Unused\n * @returns Filter function that returns true for false/null/undefined/0/''/NaN\n */\nconst falsy = (_options?:string[]): FilterFn<boolean> => {\n return (value: unknown): boolean => value === false || value === null || value === undefined || value === 0 || value === '' || Number.isNaN(value);\n}\n\n/**\n * Truthy filter - checks if value is truthy.\n * \n * @param options - Unused\n * @returns Filter function that returns true for non-falsy values\n */\nconst truthy = (_options?:string[]): FilterFn<boolean> => {\n return (value: unknown): boolean =>value !== false && value !== null && value !== undefined && value !== 0 && value !== '' && !Number.isNaN(value);\n}\n\n/**\n * Default filter - returns default value if input is falsy.\n * \n * @param options - Array with default value as first element\n * @returns Filter function that returns value or default\n */\nconst defaults = (options?:string[]): FilterFn<unknown> => {\n const opt = options?.[0] ?? optionsRequired('defaults');\n return (value: unknown): unknown => {\n if (value === false || value === null || value === undefined || value === 0 || value === '' || Number.isNaN(value)) {return opt;}\n return value;\n }\n}\n\n/**\n * Boolean filter - converts value to boolean.\n * \n * @param options - Unused\n * @returns Filter function that returns boolean\n */\nconst boolean = (_options?:string[]): FilterFn<boolean> => {\n return (value: unknown): boolean => {\n return Boolean(value);\n }\n}\n\n/**\n * Number filter - converts value to number.\n * \n * @param options - Unused\n * @returns Filter function that returns number\n */\nconst number = (_options?:string[]): FilterFn<number> => {\n return (value: unknown): number => {\n return Number(value);\n }\n}\n\n/**\n * String filter - converts value to string.\n * \n * @param options - Unused\n * @returns Filter function that returns string\n */\nconst string = (_options?:string[]): FilterFn<string> => {\n return (value: unknown): string => {\n return String(value);\n }\n}\n\n/**\n * Null filter - converts empty string to null.\n * \n * @param options - Unused\n * @returns Filter function that returns null for empty string, otherwise original value\n */\nconst _null = (_options?:string[]): FilterFn<unknown> => {\n return (value: unknown): unknown => {\n return (value === \"\") ? null : value;\n } \n}\n\nconst builtinFilters: FilterWithOptions = {\n \"eq\": eq,\n \"ne\": ne,\n \"not\": not,\n\n \"lt\": lt,\n \"le\": le,\n \"gt\": gt,\n \"ge\": ge,\n\n \"inc\": inc,\n \"dec\": dec,\n \"mul\": mul,\n \"div\": div,\n \"mod\": mod,\n\n \"fix\": fix,\n \"locale\": locale,\n \"uc\": uc,\n \"lc\": lc,\n \"cap\": cap,\n \"trim\": trim,\n \"slice\": slice,\n \"substr\": substr,\n \"pad\": pad,\n \"rep\": rep,\n \"rev\": rev,\n\n \"int\": int,\n \"float\": float,\n \"round\": round,\n \"floor\": floor,\n \"ceil\": ceil,\n \"percent\": percent,\n\n \"date\": date,\n \"time\": time,\n \"datetime\": datetime,\n \"ymd\": ymd,\n\n \"falsy\": falsy,\n \"truthy\": truthy,\n \"defaults\": defaults,\n\n \"boolean\": boolean,\n \"number\": number,\n \"string\": string,\n \"null\": _null,\n};\n\nexport const outputBuiltinFilters = builtinFilters;\nexport const inputBuiltinFilters = builtinFilters;\n\nexport const builtinFiltersByFilterIOType = {\n \"input\": inputBuiltinFilters,\n \"output\": outputBuiltinFilters,\n} as const;\n\n/**\n * Retrieves built-in filter function by name and options.\n * \n * @param name - Filter name\n * @param options - Array of option strings\n * @returns Function that takes FilterWithOptions and returns filter function\n */\nexport const builtinFilterFn = (name:string, options: string[]) => (filters: FilterWithOptions) => {\n const filter = filters[name];\n if (!filter) {\n raiseError(`filter not found: ${name}`);\n }\n return filter(options);\n}\n\n","import { builtinFilterFn, builtinFiltersByFilterIOType } from \"../filters/builtinFilters\";\nimport { FilterFn, FilterIOType } from \"../filters/types\";\nimport { raiseError } from \"../raiseError\";\nimport { IFilterInfo } from \"../types\";\nimport { parseFilterArgs } from \"./parseFilterArgs\";\n\nconst filterFnByKey: Map<string, FilterFn<unknown>> = new Map();\n\n// format: filterName(arg1,arg2) or filterName\n\nexport function parseFilters(filterTextList: string[], filterIOType: FilterIOType): IFilterInfo[] {\n const builtinFilters = builtinFiltersByFilterIOType[filterIOType];\n const filters: IFilterInfo[] = filterTextList.map((filterText) => {\n const openParenIndex = filterText.indexOf('(');\n const closeParenIndex = filterText.lastIndexOf(')');\n // check parentheses\n if (openParenIndex !== -1 && closeParenIndex === -1) {\n raiseError(`Invalid filter format: missing closing parenthesis in \"${filterText}\"`);\n }\n if (closeParenIndex !== -1 && openParenIndex === -1) {\n raiseError(`Invalid filter format: missing opening parenthesis in \"${filterText}\"`);\n }\n if (openParenIndex === -1) {\n // no arguments\n const filterName = filterText.trim();\n const filterKey = `${filterName}():${filterIOType}`;\n let filterFn = filterFnByKey.get(filterKey);\n if (typeof filterFn === 'undefined') {\n filterFn = builtinFilterFn(filterName, [])(builtinFilters);\n filterFnByKey.set(filterKey, filterFn);\n }\n return {\n filterName: filterName,\n args: [],\n filterFn: filterFn,\n };\n } else {\n const argsText = filterText.substring(openParenIndex + 1, closeParenIndex);\n const filterName = filterText.substring(0, openParenIndex).trim();\n const args = parseFilterArgs(argsText);\n const filterKey = `${filterName}(${args.join(',')}):${filterIOType}`;\n let filterFn = filterFnByKey.get(filterKey);\n if (typeof filterFn === 'undefined') {\n filterFn = builtinFilterFn(filterName, args)(builtinFilters);\n filterFnByKey.set(filterKey, filterFn);\n }\n return {\n filterName,\n args,\n filterFn,\n };\n }\n });\n return filters;\n}","export function parseFilterArgs(argsText: string): string[] {\n const args: string[] = [];\n let current = '';\n let inQuote: string | null = null;\n let hasQuote = false;\n\n for (let i = 0; i < argsText.length; i++) {\n const char = argsText[i];\n\n if (inQuote) {\n if (char === inQuote) {\n inQuote = null;\n } else {\n current += char;\n }\n } else if (char === '\"' || char === \"'\") {\n inQuote = char;\n hasQuote = true;\n } else if (char === ',') {\n args.push(current.trim());\n current = '';\n hasQuote = false;\n } else {\n current += char;\n }\n }\n\n const last = current.trim();\n if (last || hasQuote) {\n args.push(last);\n }\n\n return args;\n}\n","\nexport const trimFn = (s: string): string => s.trim();\n","import { IBindingInfo, IFilterInfo } from \"../types\";\nimport { parseFilters } from \"./parseFilters\";\nimport { trimFn } from \"./utils\";\n\ntype PropPartParseResult = Pick<IBindingInfo, 'propName' | 'propSegments' | 'propModifiers' | 'inFilters'>;\n\nconst cacheFilterInfos = new Map<string, IFilterInfo[]>();\n\n// format: propName#moodifier1,modifier2\n// propName-format: path.to.property (e.g., textContent, style.color, not include :)\n// special path: \n// 'attr.attributeName' for attributes (e.g., attr.href, attr.data-id)\n// 'style.propertyName' for style properties (e.g., style.backgroundColor, style.fontSize)\n// 'class.className' for class names (e.g., class.active, class.hidden)\n// 'onclick', 'onchange' etc. for event listeners\n\nexport function parsePropPart(propPart: string): PropPartParseResult {\n const pos = propPart.indexOf('|');\n let propText: string = '';\n let filterTexts: string[] = [];\n let filtersText = '';\n let filters: IFilterInfo[] = [];\n if (pos !== -1) {\n propText = propPart.slice(0, pos).trim();\n filtersText = propPart.slice(pos + 1).trim();\n if (cacheFilterInfos.has(filtersText)) {\n filters = cacheFilterInfos.get(filtersText)!;\n } else {\n filterTexts = filtersText.split('|').map(trimFn);\n filters = parseFilters(filterTexts, \"input\");\n cacheFilterInfos.set(filtersText, filters);\n }\n } else {\n propText = propPart.trim();\n }\n\n const [propName, propModifiersText] = propText.split('#').map(trimFn);\n const propSegments = propName.split('.').map(trimFn);\n const propModifiers = propModifiersText\n ? propModifiersText.split(',').map(trimFn)\n : [];\n return {\n propName,\n propSegments,\n propModifiers,\n inFilters: filters,\n };\n}","import { getPathInfo } from \"../address/PathInfo\";\nimport { IBindingInfo, IFilterInfo } from \"../types\";\nimport { parseFilters } from \"./parseFilters\";\nimport { trimFn } from \"./utils\";\n\ntype StatePartParseResult = Pick<IBindingInfo, \n 'stateName' | 'statePathName' | 'statePathInfo' | 'outFilters'>;\n\nconst cacheFilterInfos = new Map<string, IFilterInfo[]>();\n\n// format: statePath@stateName|filter|filter\n// statePath-format: path.to.property (e.g., user.name.first, users.*.name, users.0.name, not include @)\n// stateName: optional, default is 'default'\n// filters-format: filterName or filterName(arg1,arg2)\nexport function parseStatePart(statePart: string): StatePartParseResult {\n const pos = statePart.indexOf('|');\n let stateAndPath: string = '';\n let filterTexts: string[] = [];\n let filtersText = '';\n let filters: IFilterInfo[] = [];\n if (pos !== -1) {\n stateAndPath = statePart.slice(0, pos).trim();\n filtersText = statePart.slice(pos + 1).trim();\n if (cacheFilterInfos.has(filtersText)) {\n filters = cacheFilterInfos.get(filtersText)!;\n } else {\n filterTexts = filtersText.split('|').map(trimFn);\n filters = parseFilters(filterTexts, \"output\");\n cacheFilterInfos.set(filtersText, filters);\n }\n } else {\n stateAndPath = statePart.trim();\n }\n const [statePathName, stateName = 'default'] = stateAndPath.split('@').map(trimFn);\n const pathInfo = getPathInfo(statePathName);\n return {\n stateName,\n statePathName,\n statePathInfo: pathInfo,\n outFilters: filters,\n };\n}\n","import { getPathInfo } from \"../address/PathInfo.js\";\nimport { raiseError } from \"../raiseError.js\";\nimport { STRUCTURAL_BINDING_TYPE_SET } from \"../structural/define.js\";\nimport { parsePropPart } from \"./parsePropPart.js\";\nimport { parseStatePart } from \"./parseStatePart.js\";\nimport { ParseBindTextResult } from \"./types.js\";\nimport { trimFn } from \"./utils.js\";\n\n// format: propPart:statePart; propPart:statePart; ...\n// special-propPart:\n// if: statePart (single binding for conditional rendering)\n// else: (single binding for conditional rendering, and statePart is ignored)\n// elseif: statePart only (single binding for conditional rendering)\n// for: statePart only (single binding for loop rendering)\n// onclick: statePart, onchange: statePart etc. (event listeners)\n\nexport function parseBindTextsForElement(bindText: string): ParseBindTextResult[] {\n const [ ...bindTexts ] = bindText.split(';').map(trimFn).filter(s => s.length > 0);\n const results = bindTexts.map((bindText): ParseBindTextResult => {\n const separatorIndex = bindText.indexOf(':');\n if (separatorIndex === -1) {\n raiseError(`Invalid bindText: \"${bindText}\". Missing ':' separator between propPart and statePart.`);\n }\n const propPart = bindText.slice(0, separatorIndex).trim();\n const statePart = bindText.slice(separatorIndex + 1).trim();\n if (propPart === 'else') {\n const pathInfo = getPathInfo('#else');\n return {\n propName: 'else',\n propSegments: ['else'],\n propModifiers: [],\n statePathName: '#else',\n statePathInfo: pathInfo,\n stateName: '',\n inFilters: [],\n outFilters: [],\n bindingType: 'else',\n };\n } else if (propPart === 'if' \n || propPart === 'elseif' \n || propPart === 'for'\n || propPart === 'radio'\n || propPart === 'checkbox'\n ) {\n const stateResult = parseStatePart(statePart);\n return {\n propName: propPart,\n propSegments: [propPart],\n propModifiers: [],\n inFilters: [],\n ...stateResult,\n bindingType: propPart,\n };\n } else {\n const stateResult = parseStatePart(statePart);\n const propResult = parsePropPart(propPart);\n if (propResult.propSegments[0].startsWith('on')) {\n return {\n ...propResult,\n ...stateResult,\n bindingType: 'event',\n };\n } else {\n return {\n ...propResult,\n ...stateResult,\n bindingType: 'prop',\n };\n }\n }\n });\n // check for sigle binding for 'if', 'elseif', 'else', 'for'\n if (results.length > 1) {\n const isIncludeSingleBinding = results.some(r => STRUCTURAL_BINDING_TYPE_SET.has(r.bindingType));\n if (isIncludeSingleBinding) {\n raiseError(`Invalid bindText: \"${bindText}\". 'if', 'elseif', 'else', and 'for' bindings must be single binding.`);\n }\n }\n return results;\n}\n\n","import { config } from \"../config\";\n\nconst bindTextByNode = new WeakMap<Node, string>();\n\n// format: <!--@@wcs-text:path-->\n// bind-stateはconfig.commentTextPrefixで変更可能\n// format: <!--@@wcs-for:UUID-->\n// bind-stateはconfig.commentForPrefixで変更可能\n// format: <!--@@wcs-if:UUID-->\n// bind-stateはconfig.commentIfPrefixで変更可能\n// format: <!--@@wcs-else:UUID-->\n// bind-stateはconfig.commentElsePrefixで変更可能\n// format: <!--@@wcs-elseif:UUID-->\n// bind-stateはconfig.commentElseIfPrefixで変更可能\nconst bindingTypeKeywordSet: Set<string> = new Set<string>([\n config.commentTextPrefix,\n config.commentForPrefix,\n config.commentIfPrefix,\n config.commentElseIfPrefix,\n config.commentElsePrefix,\n]);\n\n// format: <!--@@:path-->は<!--@@wcs-text:path-->と同義にする\nconst EMBEDDED_REGEX = new RegExp(`^\\\\s*@@\\\\s*(.*?)\\\\s*:\\\\s*(.+?)\\\\s*$`);\n\nexport function parseCommentNode(node: Node): string | null {\n const savedText = bindTextByNode.get(node);\n if (typeof savedText === \"string\") {\n return savedText;\n }\n if (node.nodeType !== Node.COMMENT_NODE) {\n return null;\n }\n const commentNode = node as Comment;\n const text = commentNode.data.trim();\n const match = EMBEDDED_REGEX.exec(text);\n if (match === null) {\n return null;\n }\n // 空の場合は wcs-text として扱う\n const keyword = match[1] || config.commentTextPrefix;\n if (!bindingTypeKeywordSet.has(keyword)) {\n return null;\n }\n bindTextByNode.set(node, match[2]);\n return match[2];\n}\n\nexport function getCommentNodeBindText(node: Node): string | null {\n return bindTextByNode.get(node) || null;\n}","import { config } from \"../config\";\nimport { raiseError } from \"../raiseError\";\nimport { parseBindTextsForElement } from \"../bindTextParser/parseBindTextsForElement\";\nimport { parseCommentNode } from \"./parseCommentNode\";\nimport { parseBindTextForEmbeddedNode } from \"../bindTextParser/parseBindTextForEmbeddedNode\";\nimport { ParseBindTextResult } from \"../bindTextParser/types\";\nimport { getFragmentInfoByUUID } from \"../structural/fragmentInfoByUUID\";\n\nexport function getParseBindTextResults(node: Node): ParseBindTextResult[] {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const element = node as Element;\n const bindText = element.getAttribute(config.bindAttributeName) || '';\n return parseBindTextsForElement(bindText);\n } else if (node.nodeType === Node.COMMENT_NODE) {\n const bindTextOrUUID = parseCommentNode(node);\n if (bindTextOrUUID === null) {\n raiseError(`Comment node binding text not found.`);\n }\n const fragmentInfo = getFragmentInfoByUUID(bindTextOrUUID);\n let parseBindingTextResult = fragmentInfo?.parseBindTextResult ?? null;\n let uuid: string | null = null;\n if (parseBindingTextResult === null) {\n // It is not a structural fragment UUID, so treat it as bindText\n parseBindingTextResult = parseBindTextForEmbeddedNode(bindTextOrUUID);\n uuid = null;\n } else {\n uuid = bindTextOrUUID;\n }\n return [{\n ...parseBindingTextResult,\n uuid: uuid,\n }]\n }\n return [];\n}","import { parseStatePart } from \"./parseStatePart.js\";\nimport { ParseBindTextResult } from \"./types.js\";\n\nexport function parseBindTextForEmbeddedNode(bindText: string): ParseBindTextResult {\n const stateResult = parseStatePart(bindText);\n return {\n propName: 'textContent',\n propSegments: ['textContent'],\n propModifiers: [],\n inFilters: [],\n ...stateResult,\n bindingType: 'text',\n }\n}","import { config } from \"../config\";\nimport { parseCommentNode } from \"./parseCommentNode\";\n\n/**\n * data-wcs 属性または埋め込みノード<!--{{}}-->を持つノードをすべて取得する\n * @param root \n * @returns \n */\n\nexport function getSubscriberNodes(root: Document | Element | DocumentFragment): Node[] {\n const subscriberNodes: Node[] = [];\n const walker = document.createTreeWalker(\n root, \n NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT, \n {\n acceptNode(node: Node) {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const element = node as Element;\n const hasBinding = element.hasAttribute(config.bindAttributeName);\n return hasBinding\n ? NodeFilter.FILTER_ACCEPT\n : NodeFilter.FILTER_SKIP;\n } else {\n // Comment node\n return parseCommentNode(node) !== null\n ? NodeFilter.FILTER_ACCEPT \n : NodeFilter.FILTER_SKIP;\n }\n }\n }\n );\n \n while (walker.nextNode()) {\n subscriberNodes.push(walker.currentNode);\n }\n return subscriberNodes;\n}","import { raiseError } from \"../raiseError\";\nimport { resolveNodePath } from \"../structural/resolveNodePath\";\nimport { IFragmentNodeInfo } from \"../structural/types\";\nimport { IBindingInfo } from \"../types\";\nimport { getBindingInfos } from \"./getBindingInfos\";\nimport { setBindingsByNode } from \"./getBindingsByNode\";\nimport { getParseBindTextResults } from \"./getParseBindTextResults\";\nimport { getSubscriberNodes } from \"./getSubscriberNodes\";\nimport { resolveInitializedBinding } from \"./initializeBindingPromiseByNode\";\n\nconst registeredNodeSet = new WeakSet<Node>();\n\nexport function collectNodesAndBindingInfos(\n root: Document | Element | DocumentFragment\n): [ Node[], IBindingInfo[] ] {\n const subscriberNodes = getSubscriberNodes(root);\n const allBindings: IBindingInfo[] = [];\n for(const node of subscriberNodes) {\n if (!registeredNodeSet.has(node)) {\n registeredNodeSet.add(node);\n const parseBindingTextResults = getParseBindTextResults(node);\n const bindings = getBindingInfos(node, parseBindingTextResults);\n setBindingsByNode(node, bindings);\n resolveInitializedBinding(node);\n allBindings.push(...bindings);\n }\n }\n return [subscriberNodes, allBindings];\n}\n\nexport function collectNodesAndBindingInfosByFragment(\n root: DocumentFragment,\n nodeInfos: IFragmentNodeInfo[],\n): [ Node[], IBindingInfo[] ] {\n const nodes: Node[] = [];\n const allBindings: IBindingInfo[] = [];\n for(const nodeInfo of nodeInfos) {\n const node = resolveNodePath(root, nodeInfo.nodePath);\n if (node === null) {\n raiseError(`Node not found by path [${nodeInfo.nodePath.join(', ')}] in fragment.`);\n }\n if (!registeredNodeSet.has(node)) {\n registeredNodeSet.add(node);\n const bindings = getBindingInfos(node, nodeInfo.parseBindTextResults);\n setBindingsByNode(node, bindings);\n resolveInitializedBinding(node);\n allBindings.push(...bindings);\n nodes.push(node);\n }\n }\n return [nodes, allBindings];\n}\n\nexport function unregisterNode(node: Node): void {\n registeredNodeSet.delete(node);\n}","import { ILoopContext } from \"./types\";\n\nconst loopContextByNode = new WeakMap<Node, ILoopContext>();\n\nexport function getLoopContextByNode(node: Node): ILoopContext | null {\n let paramNode: Node | null = node;\n while (paramNode) {\n const loopContext = loopContextByNode.get(paramNode);\n if (loopContext) {\n return loopContext;\n }\n paramNode = paramNode.parentNode;\n }\n return null;\n}\n\nexport function setLoopContextByNode(node: Node, loopContext: ILoopContext | null): void {\n if (loopContext === null) {\n loopContextByNode.delete(node);\n return;\n }\n loopContextByNode.set(node, loopContext);\n}\n","\nexport const setLoopContextAsyncSymbol: unique symbol = Symbol(\"$$setLoopContextAsync\");\nexport const setLoopContextSymbol: unique symbol = Symbol(\"$$setLoopContext\");\nexport const getByAddressSymbol: unique symbol = Symbol(\"$$getByAddress\");\nexport const setByAddressSymbol: unique symbol = Symbol(\"$$setByAddress\");\nexport const connectedCallbackSymbol: unique symbol = Symbol(\"$$connectedCallback\");\nexport const disconnectedCallbackSymbol: unique symbol = Symbol(\"$$disconnectedCallback\");\nexport const updatedCallbackSymbol: unique symbol = Symbol(\"$$updatedCallback\");\n","import { getLoopContextByNode } from \"../list/loopContextByNode\";\nimport { setLoopContextSymbol } from \"../proxy/symbols\";\nimport { raiseError } from \"../raiseError\";\nimport { getStateElementByName } from \"../stateElementByName\";\nimport { IBindingInfo } from \"../types\";\n\nconst handlerByHandlerKey: Map<string, (event: Event) => any> = new Map();\nconst bindingSetByHandlerKey: Map<string, Set<IBindingInfo>> = new Map();\n\nfunction getHandlerKey(binding: IBindingInfo): string {\n const modifierKey = binding.propModifiers.filter(m => m === 'prevent' || m === 'stop').sort().join(',');\n return `${binding.stateName}::${binding.statePathName}::${modifierKey}`;\n}\n\nconst stateEventHandlerFunction = (\n stateName: string,\n handlerName: string,\n modifiers: string[]\n) => (event: Event): any => {\n if (modifiers.includes('prevent')) event.preventDefault();\n if (modifiers.includes('stop')) event.stopPropagation();\n\n const node = event.target as Element;\n const rootNode = node.getRootNode() as Node;\n const stateElement = getStateElementByName(rootNode, stateName);\n if (stateElement === null) {\n raiseError(`State element with name \"${stateName}\" not found for event handler.`);\n }\n\n const loopContext = getLoopContextByNode(node);\n stateElement.createStateAsync(\"writable\", async (state) => {\n state[setLoopContextSymbol](loopContext, () => {\n const handler = state[handlerName];\n if (typeof handler !== \"function\") {\n raiseError(`Handler \"${handlerName}\" is not a function on state \"${stateName}\".`);\n }\n return Reflect.apply(handler, state, [event, ...(loopContext?.listIndex.indexes ?? [])]);\n });\n });\n}\n\nexport function attachEventHandler(binding: IBindingInfo): boolean {\n if (!binding.propName.startsWith(\"on\")) {\n return false;\n }\n const key = getHandlerKey(binding);\n let stateEventHandler = handlerByHandlerKey.get(key);\n if (typeof stateEventHandler === \"undefined\") {\n stateEventHandler = stateEventHandlerFunction(binding.stateName, binding.statePathName, binding.propModifiers);\n handlerByHandlerKey.set(key, stateEventHandler);\n }\n\n const eventName = binding.propName.slice(2);\n (binding.node as Element).addEventListener(eventName, stateEventHandler);\n\n let bindingSet = bindingSetByHandlerKey.get(key);\n if (typeof bindingSet === \"undefined\") {\n bindingSet = new Set<IBindingInfo>([binding]);\n bindingSetByHandlerKey.set(key, bindingSet);\n } else {\n bindingSet.add(binding);\n }\n return true;\n}\n\nexport function detachEventHandler(binding: IBindingInfo): boolean {\n if (!binding.propName.startsWith(\"on\")) {\n return false;\n }\n const key = getHandlerKey(binding);\n const stateEventHandler = handlerByHandlerKey.get(key);\n if (typeof stateEventHandler === \"undefined\") {\n return false;\n }\n const eventName = binding.propName.slice(2);\n (binding.node as Element).removeEventListener(eventName, stateEventHandler);\n\n const bindingSet = bindingSetByHandlerKey.get(key);\n if (typeof bindingSet === \"undefined\") {\n return false;\n }\n bindingSet.delete(binding);\n if (bindingSet.size === 0) {\n handlerByHandlerKey.delete(key);\n bindingSetByHandlerKey.delete(key);\n }\n return true;\n}\n\nexport const __private__ = {\n handlerByHandlerKey,\n bindingSetByHandlerKey,\n};\n\n","\nconst cache = new WeakMap<Node, string | null>();\n\nexport function getCustomElement(node: Node): string | null {\n const cached = cache.get(node);\n if (cached !== undefined) {\n return cached;\n }\n let value: string | null = null;\n try {\n if (node.nodeType !== Node.ELEMENT_NODE) {\n return value;\n }\n const element = node as Element;\n const tagName = element.tagName.toLowerCase();\n if (tagName.includes(\"-\")) {\n return value = tagName;\n }\n if (element.hasAttribute(\"is\")) {\n const is = element.getAttribute(\"is\")!;\n if (is.includes(\"-\")) {\n return value = is;\n }\n }\n return value;\n } finally {\n cache.set(node, value);\n }\n}\n","import { getCustomElement } from \"../getCustomElement\";\nimport { raiseError } from \"../raiseError\";\nimport { IWcBindable } from \"./types\";\n\nconst CHECK_TYPES = new Set([ 'radio', 'checkbox' ]);\nconst DEFAULT_VALUE_PROP_NAMES = new Set([ 'value', 'valueAsNumber', 'valueAsDate' ]);\n\nexport function isPossibleTwoWay(node: Node, propName: string): boolean {\n if (node.nodeType !== Node.ELEMENT_NODE) {\n return false;\n }\n const element = node as Element;\n const tagName = element.tagName.toLowerCase();\n if (tagName === 'input') {\n const inputType = (element.getAttribute('type') || 'text').toLowerCase();\n if (inputType === 'button') {\n return false;\n }\n if (CHECK_TYPES.has(inputType) && propName === 'checked') {\n return true;\n }\n if (DEFAULT_VALUE_PROP_NAMES.has(propName)) {\n return true;\n }\n }\n if (tagName === 'select' && propName === 'value') {\n return true;\n }\n if (tagName === 'textarea' && propName === 'value') {\n return true;\n }\n const customTagName = getCustomElement(element);\n if (customTagName !== null) {\n const customClass = customElements.get(customTagName) as any;\n if (typeof customClass === \"undefined\") {\n raiseError(`Custom element <${customTagName}> is not defined. Cannot determine if property \"${propName}\" is suitable for two-way binding.`);\n }\n const bindable: IWcBindable | undefined = customClass.wcBindable;\n if (bindable?.protocol === \"wc-bindable\" && bindable?.version === 1) {\n if (bindable.properties.some(p => p.name === propName)) {\n return true;\n }\n }\n }\n return false;\n}","import { isPossibleTwoWay } from \"./isPossibleTwoWay\";\nimport { getLoopContextByNode } from \"../list/loopContextByNode\";\nimport { raiseError } from \"../raiseError\";\nimport { getStateElementByName } from \"../stateElementByName\";\nimport { IBindingInfo, IFilterInfo } from \"../types\";\nimport { setLoopContextSymbol } from \"../proxy/symbols\";\nimport { getCustomElement } from \"../getCustomElement\";\nimport { IWcBindable } from \"./types\";\n\nconst handlerByHandlerKey: Map<string, (event: Event) => any> = new Map();\nconst bindingSetByHandlerKey: Map<string, Set<IBindingInfo>> = new Map();\n\nconst DEFAULT_GETTER = (e: Event) => (e as CustomEvent).detail;\n\nfunction getHandlerKey(binding: IBindingInfo, eventName: string, hasGetter: boolean): string {\n const filterKey = binding.inFilters.map(f => f.filterName + '(' + f.args.join(',') + ')').join('|');\n return `${binding.stateName}::${binding.propName}::${binding.statePathName}::${eventName}::${filterKey}::${hasGetter ? 'g' : 'n'}`;\n}\n\nfunction getEventName(binding: IBindingInfo): string {\n const tagName = (binding.node as Element).tagName.toLowerCase();\n // 1.default event name\n let eventName = (tagName === 'select') ? 'change' : 'input';\n // 2.wcBindable protocol\n const customTagName = getCustomElement(binding.node as Element);\n if (customTagName !== null) {\n const customClass = customElements.get(customTagName) as any;\n if (typeof customClass === \"undefined\") {\n raiseError(`Custom element <${customTagName}> is not defined. Cannot determine event name for two-way binding.`);\n }\n const bindable: IWcBindable | undefined = customClass.wcBindable;\n if (bindable?.protocol === \"wc-bindable\" && bindable?.version === 1) {\n const propDesc = bindable.properties.find(p => p.name === binding.propName);\n if (propDesc) {\n eventName = propDesc.event;\n }\n }\n }\n // 3.modifier\n for(const modifier of binding.propModifiers) {\n if (modifier.startsWith('on')) {\n eventName = modifier.slice(2);\n }\n }\n return eventName;\n}\n\nfunction getValueGetter(binding: IBindingInfo): ((event: Event) => any) | null {\n const customTagName = getCustomElement(binding.node as Element);\n if (customTagName !== null) {\n const customClass = customElements.get(customTagName) as any;\n if (customClass) {\n const bindable: IWcBindable | undefined = customClass.wcBindable;\n if (bindable?.protocol === \"wc-bindable\" && bindable?.version === 1) {\n const propDesc = bindable.properties.find(p => p.name === binding.propName);\n if (propDesc) {\n return propDesc.getter ?? DEFAULT_GETTER;\n }\n }\n }\n }\n return null;\n}\n\nconst twowayEventHandlerFunction = (\n stateName: string,\n propName: string,\n statePathName: string,\n inFilters: IFilterInfo[],\n valueGetter: ((event: Event) => any) | null,\n) => (event: Event): any => {\n const node = event.target as Element;\n if (node === null) {\n console.warn(`[@wcstack/state] event.target is null.`);\n return;\n }\n let newValue: any;\n if (valueGetter !== null) {\n newValue = valueGetter(event);\n } else {\n if (!(propName in node)) {\n console.warn(`[@wcstack/state] Property \"${propName}\" does not exist on target element.`);\n return;\n }\n newValue = (node as any)[propName];\n }\n let filteredNewValue = newValue;\n for(const filter of inFilters) {\n filteredNewValue = filter.filterFn(filteredNewValue);\n }\n\n const rootNode = node.getRootNode() as Node;\n const stateElement = getStateElementByName(rootNode, stateName);\n if (stateElement === null) {\n raiseError(`State element with name \"${stateName}\" not found for two-way binding.`);\n }\n\n const loopContext = getLoopContextByNode(node);\n stateElement.createState(\"writable\", (state) => {\n state[setLoopContextSymbol](loopContext, () => {\n state[statePathName] = filteredNewValue;\n });\n });\n}\n\nexport function attachTwowayEventHandler(binding: IBindingInfo): void {\n const customTagName = getCustomElement(binding.node as Element);\n if (customTagName !== null) {\n const customClass = customElements.get(customTagName);\n if (typeof customClass === \"undefined\") {\n customElements.whenDefined(customTagName).then(() => {\n attachTwowayEventHandler(binding);\n });\n return;\n }\n }\n\n if (isPossibleTwoWay(binding.node, binding.propName) && binding.propModifiers.indexOf('ro') === -1) {\n const eventName = getEventName(binding);\n const valueGetter = getValueGetter(binding);\n const key = getHandlerKey(binding, eventName, valueGetter !== null);\n let twowayEventHandler = handlerByHandlerKey.get(key);\n if (typeof twowayEventHandler === \"undefined\") {\n twowayEventHandler = twowayEventHandlerFunction(\n binding.stateName,\n binding.propName,\n binding.statePathName,\n binding.inFilters,\n valueGetter\n );\n handlerByHandlerKey.set(key, twowayEventHandler);\n }\n (binding.node as Element).addEventListener(eventName, twowayEventHandler);\n let bindingSet = bindingSetByHandlerKey.get(key);\n if (typeof bindingSet === \"undefined\") {\n bindingSet = new Set<IBindingInfo>([binding]);\n bindingSetByHandlerKey.set(key, bindingSet);\n } else {\n bindingSet.add(binding);\n }\n }\n}\n\nexport function detachTwowayEventHandler(binding: IBindingInfo): void {\n const customTagName = getCustomElement(binding.node as Element);\n if (customTagName !== null) {\n const customClass = customElements.get(customTagName);\n if (typeof customClass === \"undefined\") {\n customElements.whenDefined(customTagName).then(() => {\n detachTwowayEventHandler(binding);\n });\n return;\n }\n }\n\n if (isPossibleTwoWay(binding.node, binding.propName) && binding.propModifiers.indexOf('ro') === -1) {\n const eventName = getEventName(binding);\n const valueGetter = getValueGetter(binding);\n const key = getHandlerKey(binding, eventName, valueGetter !== null);\n const twowayEventHandler = handlerByHandlerKey.get(key);\n if (typeof twowayEventHandler === \"undefined\") {\n return;\n }\n (binding.node as Element).removeEventListener(eventName, twowayEventHandler);\n\n const bindingSet = bindingSetByHandlerKey.get(key);\n if (typeof bindingSet === \"undefined\") {\n return;\n }\n bindingSet.delete(binding);\n if (bindingSet.size === 0) {\n handlerByHandlerKey.delete(key);\n bindingSetByHandlerKey.delete(key);\n }\n }\n}\n\nexport const __private__ = {\n handlerByHandlerKey,\n bindingSetByHandlerKey,\n getHandlerKey,\n getEventName,\n getValueGetter,\n twowayEventHandlerFunction,\n DEFAULT_GETTER,\n};\n","import { IAbsoluteStateAddress } from \"../address/types\";\n\nconst lastListValueByAbsoluteStateAddress: WeakMap<IAbsoluteStateAddress, readonly unknown[]> = new WeakMap();\n\nexport function getLastListValueByAbsoluteStateAddress(address: IAbsoluteStateAddress): readonly unknown[] {\n return lastListValueByAbsoluteStateAddress.get(address) ?? [];\n}\n\nexport function setLastListValueByAbsoluteStateAddress(address: IAbsoluteStateAddress, value: readonly unknown[]): void {\n lastListValueByAbsoluteStateAddress.set(address, value);\n}\n\nexport function clearLastListValueByAbsoluteStateAddress(address: IAbsoluteStateAddress): void {\n lastListValueByAbsoluteStateAddress.delete(address);\n}\n\nexport function hasLastListValueByAbsoluteStateAddress(address: IAbsoluteStateAddress): boolean {\n return lastListValueByAbsoluteStateAddress.has(address);\n}\n","import { IStateElement } from \"../components/types\";\nimport { IAbsolutePathInfo, IPathInfo } from \"./types\";\n\nconst _cache: WeakMap<IStateElement, WeakMap<IPathInfo, IAbsolutePathInfo>> = new WeakMap();\n\nexport function getAbsolutePathInfo(stateElement: IStateElement, pathInfo: IPathInfo): IAbsolutePathInfo {\n if (_cache.has(stateElement)) {\n const pathMap = _cache.get(stateElement)!;\n if (pathMap.has(pathInfo)) {\n return pathMap.get(pathInfo)!;\n }\n } else {\n _cache.set(stateElement, new WeakMap());\n }\n const absolutePathInfo = Object.freeze(new AbsolutePathInfo(stateElement, pathInfo));\n _cache.get(stateElement)!.set(pathInfo, absolutePathInfo);\n return absolutePathInfo;\n}\n\nclass AbsolutePathInfo implements IAbsolutePathInfo {\n readonly pathInfo: IPathInfo;\n readonly stateName: string;\n readonly stateElement: IStateElement;\n readonly parentAbsolutePathInfo: IAbsolutePathInfo | null;\n constructor(stateElement: IStateElement, pathInfo: IPathInfo) {\n this.pathInfo = pathInfo;\n this.stateName = stateElement.name;\n this.stateElement = stateElement;\n if (pathInfo.parentPathInfo === null) {\n this.parentAbsolutePathInfo = null;\n } else {\n this.parentAbsolutePathInfo = getAbsolutePathInfo(stateElement, pathInfo.parentPathInfo);\n }\n }\n}","import { WILDCARD } from \"../define\";\nimport { IListIndex } from \"../list/types\";\nimport { IAbsolutePathInfo, IAbsoluteStateAddress } from \"./types\";\n\nconst _cache: WeakMap<IListIndex, WeakMap<IAbsolutePathInfo, IAbsoluteStateAddress>> = new WeakMap();\nconst _cacheNullListIndex: WeakMap<IAbsolutePathInfo, IAbsoluteStateAddress> = new WeakMap();\n\nclass AbsoluteStateAddress implements IAbsoluteStateAddress {\n readonly absolutePathInfo: IAbsolutePathInfo;\n readonly listIndex: IListIndex | null;\n private _parentAbsoluteAddress: IAbsoluteStateAddress | null | undefined;\n\n constructor(absolutePathInfo: IAbsolutePathInfo, listIndex: IListIndex | null) {\n this.absolutePathInfo = absolutePathInfo;\n this.listIndex = listIndex;\n }\n\n get parentAbsoluteAddress(): IAbsoluteStateAddress | null {\n if (typeof this._parentAbsoluteAddress !== 'undefined') {\n return this._parentAbsoluteAddress;\n }\n const parentAbsolutePathInfo = this.absolutePathInfo.parentAbsolutePathInfo;\n if (parentAbsolutePathInfo === null) {\n return null;\n }\n const lastSegment = this.absolutePathInfo.pathInfo.segments[this.absolutePathInfo.pathInfo.segments.length - 1];\n let parentListIndex: IListIndex | null = null;\n if (lastSegment === WILDCARD) {\n parentListIndex = this.listIndex?.parentListIndex ?? null;\n } else {\n parentListIndex = this.listIndex;\n }\n return this._parentAbsoluteAddress = createAbsoluteStateAddress(\n parentAbsolutePathInfo,\n parentListIndex\n );\n }\n}\n\nexport function createAbsoluteStateAddress(absolutePathInfo: IAbsolutePathInfo, listIndex: IListIndex | null): IAbsoluteStateAddress {\n if (listIndex === null) {\n let cached = _cacheNullListIndex.get(absolutePathInfo);\n if (typeof cached !== \"undefined\") {\n return cached;\n }\n cached = new AbsoluteStateAddress(absolutePathInfo, null);\n _cacheNullListIndex.set(absolutePathInfo, cached);\n return cached;\n } else {\n let cacheByAbsolutePathInfo = _cache.get(listIndex);\n if (typeof cacheByAbsolutePathInfo === \"undefined\") {\n cacheByAbsolutePathInfo = new WeakMap<IAbsolutePathInfo, IAbsoluteStateAddress>();\n _cache.set(listIndex, cacheByAbsolutePathInfo);\n }\n let cached = cacheByAbsolutePathInfo.get(absolutePathInfo);\n if (typeof cached !== \"undefined\") {\n return cached;\n }\n cached = new AbsoluteStateAddress(absolutePathInfo, listIndex);\n cacheByAbsolutePathInfo.set(absolutePathInfo, cached);\n return cached;\n }\n}\n","\nconst rootNodeByFragment: WeakMap<DocumentFragment, Node> = new WeakMap();\n\nexport function setRootNodeByFragment(fragment: DocumentFragment, rootNode: Node | null): void {\n if (rootNode === null) {\n rootNodeByFragment.delete(fragment);\n } else {\n rootNodeByFragment.set(fragment, rootNode);\n }\n}\n\nexport function getRootNodeByFragment(fragment: DocumentFragment): Node | null {\n return rootNodeByFragment.get(fragment) || null;\n}\n","import { IPathInfo } from \"./types.js\";\n\nconst cacheCalcWildcardLen: Map<string, number> = new Map(); \n\nexport function calcWildcardLen(pathInfo: IPathInfo, targetPathInfo: IPathInfo): number {\n let path1: IPathInfo;\n let path2: IPathInfo;\n if (pathInfo.wildcardCount === 0 || targetPathInfo.wildcardCount === 0) {\n return 0;\n }\n if (pathInfo.wildcardCount === 1 \n && targetPathInfo.wildcardCount > 0 \n && targetPathInfo.wildcardPathSet.has(pathInfo.path)) {\n return 1;\n }\n if (pathInfo.id < targetPathInfo.id) {\n path1 = pathInfo;\n path2 = targetPathInfo;\n } else {\n path1 = targetPathInfo;\n path2 = pathInfo;\n }\n const key = `${path1.path}\\t${path2.path}`;\n let len = cacheCalcWildcardLen.get(key);\n if (typeof len !== \"undefined\") {\n return len;\n }\n const matchPath = path1.wildcardPathSet.intersection(path2.wildcardPathSet);\n len = matchPath.size;\n cacheCalcWildcardLen.set(key, len);\n return len;\n}\n\n","import { calcWildcardLen } from \"../address/calcWildcardLen\";\nimport { IBindingInfo } from \"../types\";\nimport { getLoopContextByNode } from \"./loopContextByNode\";\nimport { IListIndex, ILoopContext } from \"./types\";\n\nconst listIndexByBindingInfoByLoopContext: WeakMap<ILoopContext, WeakMap<IBindingInfo, IListIndex | null>> = new WeakMap();\n\nexport function getListIndexByBindingInfo(bindingInfo: IBindingInfo): IListIndex | null {\n const loopContext = getLoopContextByNode(bindingInfo.node);\n if (loopContext === null) {\n return null;\n }\n let listIndexByBindingInfo = listIndexByBindingInfoByLoopContext.get(loopContext);\n if (typeof listIndexByBindingInfo === \"undefined\") {\n listIndexByBindingInfo = new WeakMap<IBindingInfo, IListIndex | null>();\n listIndexByBindingInfoByLoopContext.set(loopContext, listIndexByBindingInfo);\n } else {\n const listIndex = listIndexByBindingInfo.get(bindingInfo);\n if (typeof listIndex !== \"undefined\") {\n return listIndex;\n }\n }\n\n let listIndex: IListIndex | null = null;\n try {\n const wildcardLen = calcWildcardLen(loopContext.pathInfo, bindingInfo.statePathInfo);\n if (wildcardLen > 0) {\n listIndex = loopContext.listIndex.at(wildcardLen - 1);\n }\n return listIndex;\n } finally {\n listIndexByBindingInfo.set(bindingInfo, listIndex);\n }\n\n}\n","import { getAbsolutePathInfo } from \"../address/AbsolutePathInfo\";\nimport { createAbsoluteStateAddress } from \"../address/AbsoluteStateAddress\";\nimport { IAbsoluteStateAddress } from \"../address/types\";\nimport { getRootNodeByFragment } from \"../apply/rootNodeByFragment\";\nimport { getListIndexByBindingInfo } from \"../list/getListIndexByBindingInfo\";\nimport { raiseError } from \"../raiseError\";\nimport { getStateElementByName } from \"../stateElementByName\";\nimport { IBindingInfo } from \"./types\";\n\nconst absoluteStateAddressByBinding: WeakMap<IBindingInfo, IAbsoluteStateAddress> = new WeakMap();\n\nexport function getAbsoluteStateAddressByBinding(binding: IBindingInfo): IAbsoluteStateAddress {\n // 切断されていても、キャッシュされていれば絶対状態アドレスを返す。\n let absoluteStateAddress: IAbsoluteStateAddress | null = null;\n absoluteStateAddress = absoluteStateAddressByBinding.get(binding) || null;\n if (absoluteStateAddress !== null) {\n return absoluteStateAddress;\n }\n\n let rootNode: Node | null = binding.replaceNode.getRootNode() as Node;\n // binding.replaceNodeはisConnected=trueになっていることが前提、切断されている場合はraiseErrorを返す\n if (binding.replaceNode.isConnected === false) {\n // DocumentFragmentでバッファリングされている場合は、ルートノードをDocumentFragmentから実際のルートノードに切り替える\n const rootNodeByFragment = getRootNodeByFragment(rootNode as DocumentFragment);\n if (rootNodeByFragment === null) {\n raiseError(`Cannot get absolute state address for disconnected binding: ${binding.bindingType} ${binding.statePathName} on ${binding.node.nodeName}`);\n } else {\n rootNode = rootNodeByFragment;\n }\n }\n\n const listIndex = getListIndexByBindingInfo(binding);\n const stateElement = getStateElementByName(rootNode, binding.stateName);\n if (stateElement === null) {\n raiseError(`State element with name \"${binding.stateName}\" not found for binding.`);\n }\n const absolutePathInfo = getAbsolutePathInfo(stateElement, binding.statePathInfo);\n absoluteStateAddress = \n createAbsoluteStateAddress(absolutePathInfo, listIndex);\n absoluteStateAddressByBinding.set(binding, absoluteStateAddress);\n return absoluteStateAddress;\n}\n\nexport function clearAbsoluteStateAddressByBinding(binding: IBindingInfo) {\n absoluteStateAddressByBinding.delete(binding);\n}","import { IStateElement } from \"../components/types\";\n\nconst completeByStateElementByWebComponent = new WeakMap<Element, WeakMap<IStateElement, boolean>>();\n\nexport function markWebComponentAsComplete(webComponent: Element, stateElement: IStateElement): void {\n let completeByStateElement = completeByStateElementByWebComponent.get(webComponent);\n if (!completeByStateElement) {\n completeByStateElement = new WeakMap<IStateElement, boolean>();\n completeByStateElementByWebComponent.set(webComponent, completeByStateElement);\n }\n completeByStateElement.set(stateElement, true);\n}\n\nexport function isWebComponentComplete(webComponent: Element, stateElement: IStateElement): boolean {\n const completeByStateElement = completeByStateElementByWebComponent.get(webComponent);\n if (!completeByStateElement) {\n return false;\n }\n return completeByStateElement.get(stateElement) === true;\n}\n","import { IFilterInfo } from \"../binding/types.js\";\n\nexport function getFilteredValue(value: any, filters: IFilterInfo[]) {\n let filteredValue = value;\n for(const filter of filters) {\n filteredValue = filter.filterFn(filteredValue);\n }\n return filteredValue;\n}\n","import { createEmptyArray } from \"../createEmptyArray\";\nimport { IBindingInfo } from \"../types\";\nimport { getFilteredValue } from \"./getFilteredValue\";\nimport { IApplyContext } from \"./types\";\n\nconst EMPTY_ARRAY = createEmptyArray<unknown>();\n\nexport function applyChangeToCheckbox(binding: IBindingInfo, _context: IApplyContext, newValue: unknown): void {\n const element = binding.node as HTMLInputElement;\n const elementValue = element.value;\n const elementFilteredValue = getFilteredValue(elementValue, binding.inFilters);\n const normalizedNewValue = Array.isArray(newValue) ? newValue : EMPTY_ARRAY;\n element.checked = normalizedNewValue.includes(elementFilteredValue);\n}\n","\nexport function createEmptyArray<T>(): Readonly<Array<T>> {\n return Object.freeze<Array<T>>([]);\n}\n","import { WILDCARD } from \"../define\";\nimport { IListIndex } from \"../list/types\";\nimport { IPathInfo, IStateAddress } from \"./types\";\n\nconst _cache: WeakMap<IListIndex, WeakMap<IPathInfo, IStateAddress>> = new WeakMap();\nconst _cacheNullListIndex: WeakMap<IPathInfo, IStateAddress> = new WeakMap();\n\nclass StateAddress implements IStateAddress {\n readonly pathInfo: IPathInfo;\n readonly listIndex: IListIndex | null;\n private _parentAddress: IStateAddress | null | undefined;\n\n constructor(pathInfo: IPathInfo, listIndex: IListIndex | null) {\n this.pathInfo = pathInfo;\n this.listIndex = listIndex;\n }\n\n get parentAddress(): IStateAddress | null {\n if (typeof this._parentAddress !== 'undefined') {\n return this._parentAddress;\n }\n const parentPathInfo = this.pathInfo.parentPathInfo;\n if (parentPathInfo === null) {\n return null;\n }\n const lastSegment = this.pathInfo.segments[this.pathInfo.segments.length - 1];\n let parentListIndex: IListIndex | null = null;\n if (lastSegment === WILDCARD) {\n parentListIndex = this.listIndex?.parentListIndex ?? null;\n } else {\n parentListIndex = this.listIndex;\n }\n return this._parentAddress = createStateAddress(parentPathInfo, parentListIndex);\n }\n}\n\nexport function createStateAddress(pathInfo: IPathInfo, listIndex: IListIndex | null): IStateAddress {\n if (listIndex === null) {\n let cached = _cacheNullListIndex.get(pathInfo);\n if (typeof cached !== \"undefined\") {\n return cached;\n }\n cached = new StateAddress(pathInfo, null);\n _cacheNullListIndex.set(pathInfo, cached);\n return cached;\n } else {\n let cacheByPathInfo = _cache.get(listIndex);\n if (typeof cacheByPathInfo === \"undefined\") {\n cacheByPathInfo = new WeakMap<IPathInfo, IStateAddress>();\n _cache.set(listIndex, cacheByPathInfo);\n }\n let cached = cacheByPathInfo.get(pathInfo);\n if (typeof cached !== \"undefined\") {\n return cached;\n }\n cached = new StateAddress(pathInfo, listIndex);\n cacheByPathInfo.set(pathInfo, cached);\n return cached;\n }\n}","import { IContent } from \"../structural/types\";\nimport { IBindingInfo } from \"../types\";\n\nconst indexBindingsByContent: WeakMap<IContent, IBindingInfo[]> = new WeakMap();\n\nexport function getIndexBindingsByContent(content: IContent): IBindingInfo[] {\n return indexBindingsByContent.get(content) ?? [];\n}\n\nexport function setIndexBindingsByContent(content: IContent, bindings: IBindingInfo[]): void {\n indexBindingsByContent.set(content, bindings);\n}\n","/* v8 ignore file */\nexport {};\n\ndeclare global {\n interface Set<T> {\n difference(other: Set<T>): Set<T>;\n intersection(other: Set<T>): Set<T>;\n }\n}\n\nif (!Set.prototype.difference) {\n Set.prototype.difference = function <T>(this: Set<T>, other: Set<T>): Set<T> {\n const result = new Set(this);\n for (const elem of other) {\n result.delete(elem);\n }\n return result;\n };\n}\n\nif (!Set.prototype.intersection) {\n Set.prototype.intersection = function <T>(this: Set<T>, other: Set<T>): Set<T> {\n const result = new Set<T>();\n for (const elem of other) {\n if (this.has(elem)) {\n result.add(elem);\n }\n }\n return result;\n };\n}\n","\nlet count = 0;\nexport function getUUID(): string {\n return `u${(count++).toString(36)}`;\n}\n","import { getUUID } from \"../getUUID\";\nimport { IListIndex } from \"./types\";\n\nlet version = 0;\n\nclass ListIndex implements IListIndex {\n readonly uuid = getUUID();\n readonly parentListIndex: IListIndex | null;\n readonly position: number;\n readonly length: number;\n\n private _index: number;\n private _version: number;\n private _indexes: number[] | undefined;\n private _listIndexes: WeakRef<IListIndex>[] | undefined;\n\n /**\n * Creates a new ListIndex instance.\n * \n * @param parentListIndex - Parent list index for nested loops, or null for top-level\n * @param index - Current index value in the loop\n */\n constructor(parentListIndex: IListIndex | null, index: number) {\n this.parentListIndex = parentListIndex;\n this.position = parentListIndex ? parentListIndex.position + 1 : 0;\n this.length = this.position + 1;\n this._index = index;\n this._version = version;\n }\n\n /**\n * Gets current index value.\n * \n * @returns Current index number\n */\n get index() {\n return this._index;\n }\n \n /**\n * Sets index value and updates version.\n * \n * @param value - New index value\n */\n set index(value: number) {\n this._index = value;\n this._version = ++version;\n this.indexes[this.position] = value;\n }\n\n /**\n * Gets current version number for change detection.\n * \n * @returns Version number\n */\n get version(): number {\n return this._version;\n }\n\n /**\n * Checks if parent indexes have changed since last access.\n * \n * @returns true if parent has newer version, false otherwise\n */\n get dirty(): boolean {\n if (this.parentListIndex === null) {\n return false;\n } else {\n return this.parentListIndex.dirty || this.parentListIndex.version > this._version;\n }\n }\n\n /**\n * Gets array of all index values from root to current level.\n * Rebuilds array if parent indexes have changed (dirty).\n * \n * @returns Array of index values\n */\n get indexes(): number[] {\n if (this.parentListIndex === null) {\n if (typeof this._indexes === \"undefined\") {\n this._indexes = [this._index];\n }\n } else {\n if (typeof this._indexes === \"undefined\" || this.dirty) {\n this._indexes = [...this.parentListIndex.indexes, this._index];\n this._version = version;\n }\n }\n return this._indexes;\n }\n\n /**\n * Gets array of WeakRef to all ListIndex instances from root to current level.\n * \n * @returns Array of WeakRef<IListIndex>\n */\n get listIndexes(): WeakRef<IListIndex>[] {\n if (this.parentListIndex === null) {\n if (typeof this._listIndexes === \"undefined\") {\n this._listIndexes = [new WeakRef(this)];\n }\n } else {\n if (typeof this._listIndexes === \"undefined\") {\n this._listIndexes = [...this.parentListIndex.listIndexes, new WeakRef(this)];\n }\n }\n return this._listIndexes;\n }\n\n /**\n * Gets variable name for this loop index ($1, $2, etc.).\n * \n * @returns Variable name string\n */\n get varName(): string {\n return `$${this.position + 1}`;\n }\n\n /**\n * Gets ListIndex at specified position in hierarchy.\n * Supports negative indexing from end.\n * \n * @param pos - Position index (0-based, negative for from end)\n * @returns ListIndex at position or null if not found/garbage collected\n */\n at(pos: number): IListIndex | null {\n if (pos >= 0) {\n return this.listIndexes[pos]?.deref() || null;\n } else {\n return this.listIndexes[this.listIndexes.length + pos]?.deref() || null;\n }\n }\n}\n\n/**\n * Factory function to create ListIndex instance.\n * \n * @param parentListIndex - Parent list index for nested loops, or null for top-level\n * @param index - Current index value in the loop\n * @returns New IListIndex instance\n */\nexport function createListIndex(parentListIndex: IListIndex | null, index: number): IListIndex {\n return new ListIndex(parentListIndex, index);\n}\n","import { IListIndex } from \"./types\";\n\nconst listIndexesByList = new WeakMap<readonly unknown[], IListIndex[]>();\n\nexport function getListIndexesByList(list: readonly unknown[]): IListIndex[] | null {\n return listIndexesByList.get(list) || null;\n}\n\nexport function setListIndexesByList(list: readonly unknown[], listIndexes: IListIndex[] | null): void {\n if (listIndexes === null) {\n listIndexesByList.delete(list);\n return;\n }\n listIndexesByList.set(list, listIndexes);\n}","import \"../polyfills\";\nimport { createListIndex } from \"./createListIndex\";\nimport { getListIndexesByList, setListIndexesByList } from \"./listIndexesByList\";\nimport { IListDiff, IListIndex } from \"./types\";\n\nconst listDiffByOldListByNewList = new WeakMap<readonly unknown[], WeakMap<readonly unknown[], IListDiff>>();\n\nconst EMPTY_LIST = Object.freeze([]);\nconst EMPTY_SET = new Set<IListIndex>();\n\nfunction getListDiff(rawOldList: readonly unknown[], rawNewList: readonly unknown[]): IListDiff | null {\n const oldList = (Array.isArray(rawOldList) && rawOldList.length > 0) ? rawOldList : EMPTY_LIST;\n const newList = (Array.isArray(rawNewList) && rawNewList.length > 0) ? rawNewList : EMPTY_LIST;\n let diffByNewList = listDiffByOldListByNewList.get(oldList);\n if (!diffByNewList) {\n return null;\n }\n return diffByNewList.get(newList) || null;\n}\n\nfunction setListDiff(oldList: readonly unknown[], newList: readonly unknown[], diff: IListDiff): void {\n let diffByNewList = listDiffByOldListByNewList.get(oldList);\n if (!diffByNewList) {\n diffByNewList = new WeakMap<readonly unknown[], IListDiff>();\n listDiffByOldListByNewList.set(oldList, diffByNewList);\n }\n diffByNewList.set(newList, diff);\n}\n/**\n * Checks if two lists are identical by comparing length and each element.\n * @param oldList - Previous list to compare\n * @param newList - New list to compare\n * @returns True if lists are identical, false otherwise\n */\nfunction isSameList(oldList: readonly unknown[], newList: readonly unknown[]): boolean {\n if (oldList.length !== newList.length) {\n return false;\n }\n\n for (let i = 0; i < oldList.length; i++) {\n if (oldList[i] !== newList[i]) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Creates or updates list indexes by comparing old and new lists.\n * Optimizes by reusing existing list indexes when values match.\n * @param parentListIndex - Parent list index for nested lists, or null for top-level\n * @param oldList - Previous list (will be normalized to array)\n * @param newList - New list (will be normalized to array)\n * @param oldIndexes - Array of existing list indexes to potentially reuse\n * @returns Array of list indexes for the new list\n */\nexport function createListDiff(\n parentListIndex: IListIndex | null,\n rawOldList: unknown,\n rawNewList: unknown,\n): IListDiff {\n // Normalize inputs to arrays (handles null/undefined)\n const oldList: readonly unknown[] = (Array.isArray(rawOldList) && rawOldList.length > 0) ? rawOldList : EMPTY_LIST;\n const newList: readonly unknown[] = (Array.isArray(rawNewList) && rawNewList.length > 0) ? rawNewList : EMPTY_LIST;\n const cachedDiff = getListDiff(oldList, newList);\n if (cachedDiff) {\n return cachedDiff;\n }\n const oldIndexes = getListIndexesByList(oldList) || [];\n let retValue: IListDiff | undefined;\n try {\n // Early return for empty list\n if (newList.length === 0) {\n return retValue = {\n oldIndexes: oldIndexes,\n newIndexes: [] as IListIndex[],\n changeIndexSet: EMPTY_SET,\n deleteIndexSet: new Set<IListIndex>(oldIndexes),\n addIndexSet: EMPTY_SET,\n };\n }\n // If old list was empty, create all new indexes\n let newIndexes: IListIndex[] | null = getListIndexesByList(newList);\n if (oldList.length === 0) {\n if (newIndexes === null) {\n newIndexes = [];\n for(let i = 0; i < newList.length; i++) {\n const newListIndex = createListIndex(parentListIndex, i);\n newIndexes.push(newListIndex);\n }\n }\n return retValue = {\n oldIndexes: oldIndexes,\n newIndexes: newIndexes,\n changeIndexSet: EMPTY_SET,\n deleteIndexSet: EMPTY_SET,\n addIndexSet: new Set<IListIndex>(newIndexes),\n };\n }\n // If lists are identical, return existing indexes unchanged (optimization)\n if (isSameList(oldList, newList)) {\n return retValue = {\n oldIndexes: oldIndexes,\n newIndexes: oldIndexes,\n changeIndexSet: EMPTY_SET,\n deleteIndexSet: EMPTY_SET,\n addIndexSet: EMPTY_SET,\n };\n }\n // Use index-based map for efficiency\n // Supports duplicate values by storing array of indexes\n const indexByValue = new Map<unknown, number[]>();\n for(let i = 0; i < oldList.length; i++) {\n const val = oldList[i];\n let indexes = indexByValue.get(val);\n if (!indexes) {\n indexes = [];\n indexByValue.set(val, indexes);\n }\n indexes.push(i);\n }\n if (newIndexes !== null) {\n return calcDiffIndexes(oldList, newList, oldIndexes, newIndexes, indexByValue);\n }\n newIndexes = [];\n\n // Build new indexes array by matching values with old list\n const changeIndexSet: Set<IListIndex> = new Set();\n const addIndexSet: Set<IListIndex> = new Set();\n for(let i = 0; i < newList.length; i++) {\n const newValue = newList[i];\n const existingIndexes = indexByValue.get(newValue);\n const oldIndex = existingIndexes && existingIndexes.length > 0 ? existingIndexes.shift() : undefined;\n \n if (typeof oldIndex === \"undefined\") {\n // New element\n const newListIndex = createListIndex(parentListIndex, i);\n newIndexes.push(newListIndex);\n addIndexSet.add(newListIndex);\n } else {\n // Reuse existing element\n const existingListIndex = oldIndexes[oldIndex];\n // Update index if position changed\n if (existingListIndex.index !== i) {\n existingListIndex.index = i;\n changeIndexSet.add(existingListIndex);\n }\n newIndexes.push(existingListIndex);\n }\n }\n \n const deleteIndexSet: Set<IListIndex> = (new Set(oldIndexes)).difference(new Set(newIndexes));\n return retValue = {\n oldIndexes: oldIndexes,\n newIndexes: newIndexes,\n changeIndexSet: changeIndexSet,\n deleteIndexSet: deleteIndexSet,\n addIndexSet: addIndexSet,\n };\n } finally {\n if (typeof retValue !== \"undefined\") {\n setListDiff(oldList, newList, retValue);\n setListIndexesByList(newList, retValue.newIndexes);\n }\n }\n}\n\nfunction calcDiffIndexes(\n oldList: readonly unknown[],\n newList: readonly unknown[],\n oldIndexes: IListIndex[],\n newIndexes: IListIndex[],\n indexByValue: Map<unknown, number[]>\n): IListDiff {\n const newIndexSet: Set<IListIndex> = new Set(newIndexes);\n const oldIndexSet: Set<IListIndex> = new Set(oldIndexes);\n const changeIndexSet: Set<IListIndex> = new Set();\n const addIndexSet: Set<IListIndex> = newIndexSet.difference(oldIndexSet);\n const deleteIndexSet: Set<IListIndex> = oldIndexSet.difference(newIndexSet);\n for(let i = 0; i < newList.length; i++) {\n const newValue = newList[i];\n const existingIndexes = indexByValue.get(newValue);\n const oldIndex = existingIndexes && existingIndexes.length > 0 ? existingIndexes.shift() : undefined;\n if (typeof oldIndex !== \"undefined\") {\n const existingListIndex = oldIndexes[oldIndex];\n if (existingListIndex.index !== i) {\n // 位置が違うことだけを記録 \n changeIndexSet.add(existingListIndex);\n }\n }\n }\n return {\n oldIndexes: oldIndexes,\n newIndexes: newIndexes,\n changeIndexSet: changeIndexSet,\n deleteIndexSet: deleteIndexSet,\n addIndexSet: addIndexSet,\n };\n}","import { IAbsoluteStateAddress } from \"../address/types\";\nimport { IBindingInfo } from \"./types\";\n\nconst bindingSetByAbsoluteStateAddress: WeakMap<IAbsoluteStateAddress, Set<IBindingInfo>> = new WeakMap();\n\nexport function getBindingSetByAbsoluteStateAddress(absoluteStateAddress: IAbsoluteStateAddress): Set<IBindingInfo> {\n let bindingSet: Set<IBindingInfo> | null = null;\n bindingSet = bindingSetByAbsoluteStateAddress.get(absoluteStateAddress) || null;\n if (bindingSet === null) {\n bindingSet = new Set();\n bindingSetByAbsoluteStateAddress.set(absoluteStateAddress, bindingSet);\n }\n return bindingSet;\n}\n\nexport function addBindingByAbsoluteStateAddress(absoluteStateAddress: IAbsoluteStateAddress, binding: IBindingInfo): void {\n const bindingSet = getBindingSetByAbsoluteStateAddress(absoluteStateAddress);\n bindingSet.add(binding);\n}\n\nexport function clearBindingSetByAbsoluteStateAddress(absoluteStateAddress: IAbsoluteStateAddress): void {\n bindingSetByAbsoluteStateAddress.delete(absoluteStateAddress);\n}\n\nexport function removeBindingByAbsoluteStateAddress(absoluteStateAddress: IAbsoluteStateAddress, binding: IBindingInfo): void {\n const bindingSet = getBindingSetByAbsoluteStateAddress(absoluteStateAddress);\n bindingSet.delete(binding);\n}","import { createStateAddress } from \"../address/StateAddress\";\nimport { IStateAddress } from \"../address/types\";\nimport { getListIndexByBindingInfo } from \"../list/getListIndexByBindingInfo\";\nimport { raiseError } from \"../raiseError\";\nimport { IBindingInfo } from \"../types\";\n\nconst stateAddressByBindingInfo: WeakMap<IBindingInfo, IStateAddress> = new WeakMap();\n\nexport function getStateAddressByBindingInfo(bindingInfo: IBindingInfo) {\n let stateAddress: IStateAddress | null = null;\n stateAddress = stateAddressByBindingInfo.get(bindingInfo) || null;\n if (stateAddress !== null) {\n return stateAddress;\n }\n if (bindingInfo.statePathInfo.wildcardCount > 0) {\n const listIndex = getListIndexByBindingInfo(bindingInfo);\n if (listIndex === null) {\n raiseError(`Cannot resolve state address for binding with wildcard statePathName \"${bindingInfo.statePathName}\" because list index is null.`);\n }\n stateAddress = createStateAddress(bindingInfo.statePathInfo, listIndex);\n } else {\n stateAddress = createStateAddress(bindingInfo.statePathInfo, null);\n }\n stateAddressByBindingInfo.set(bindingInfo, stateAddress);\n return stateAddress;\n}\n\n// call for change loopContext\nexport function clearStateAddressByBindingInfo(bindingInfo: IBindingInfo) {\n stateAddressByBindingInfo.delete(bindingInfo);\n}","import { IContent } from \"../structural/types\";\nimport { IBindingInfo } from \"../types\";\n\nconst bindingsByContent: WeakMap<IContent, IBindingInfo[]> = new WeakMap();\n\nexport function getBindingsByContent(content: IContent): IBindingInfo[] {\n return bindingsByContent.get(content) ?? [];\n}\n\nexport function setBindingsByContent(content: IContent, bindings: IBindingInfo[]): void {\n bindingsByContent.set(content, bindings);\n}\n","import { IContent } from \"../structural/types\";\n\nconst nodesByContent: WeakMap<IContent, Node[]> = new WeakMap();\n\nexport function getNodesByContent(content: IContent): Node[] {\n return nodesByContent.get(content) ?? [];\n}\n\nexport function setNodesByContent(content: IContent, nodes: Node[]): void {\n nodesByContent.set(content, nodes);\n}\n","import { setLoopContextByNode } from \"../list/loopContextByNode\";\nimport { ILoopContext } from \"../list/types\";\nimport { IContent } from \"../structural/types\";\nimport { getNodesByContent } from \"./nodesByContent\";\n\nexport function bindLoopContextToContent(content: IContent, loopContext: ILoopContext | null): void {\n const nodes = getNodesByContent(content);\n for(const node of nodes) {\n setLoopContextByNode(node, loopContext);\n }\n}\n\nexport function unbindLoopContextToContent(content: IContent): void {\n const nodes = getNodesByContent(content);\n for(const node of nodes) {\n setLoopContextByNode(node, null);\n }\n}\n","import { applyChange } from \"../apply/applyChange\";\nimport { IApplyContext } from \"../apply/types\";\nimport { clearAbsoluteStateAddressByBinding, getAbsoluteStateAddressByBinding } from \"../binding/getAbsoluteStateAddressByBinding\";\nimport { addBindingByAbsoluteStateAddress, removeBindingByAbsoluteStateAddress } from \"../binding/getBindingSetByAbsoluteStateAddress\";\nimport { clearStateAddressByBindingInfo } from \"../binding/getStateAddressByBindingInfo\";\nimport { getBindingsByContent } from \"../bindings/bindingsByContent\";\nimport { bindLoopContextToContent, unbindLoopContextToContent } from \"../bindings/bindLoopContextToContent\";\nimport { ILoopContext } from \"../list/types\";\nimport { IContent } from \"./types\";\n\nexport function activateContent(\n content: IContent, \n loopContext: ILoopContext | null,\n context: IApplyContext,\n): void {\n bindLoopContextToContent(content, loopContext);\n const bindings = getBindingsByContent(content);\n for(const binding of bindings) {\n const absoluteStateAddress = getAbsoluteStateAddressByBinding(binding);\n addBindingByAbsoluteStateAddress(absoluteStateAddress, binding);\n applyChange(binding, context);\n }\n}\n\nexport function deactivateContent(\n content: IContent\n): void {\n if (!content.mounted) {\n return;\n }\n const bindings = getBindingsByContent(content);\n for(const binding of bindings) {\n const absoluteStateAddress = getAbsoluteStateAddressByBinding(binding);\n removeBindingByAbsoluteStateAddress(absoluteStateAddress, binding);\n clearAbsoluteStateAddressByBinding(binding);\n clearStateAddressByBindingInfo(binding);\n }\n unbindLoopContextToContent(content);\n}\n\n","import { createEmptySet } from \"../createEmptySet\";\nimport { IContent } from \"./types\";\n\nconst contentSetByNode = new WeakMap<Node, Set<IContent>>();\n\nconst EMPTY_SET = createEmptySet<IContent>();\n\nexport function setContentByNode(node: Node, content: IContent): void {\n const contents = contentSetByNode.get(node);\n if (contents) {\n contents.add(content);\n } else {\n contentSetByNode.set(node, new Set([content]));\n }\n}\n\nexport function getContentSetByNode(node: Node): Readonly<Set<IContent>> {\n const contents = contentSetByNode.get(node);\n if (typeof contents !== \"undefined\") {\n return contents;\n }\n return EMPTY_SET;\n}\n\nexport function deleteContentByNode(node: Node, content: IContent): void {\n const contents = contentSetByNode.get(node);\n if (contents) {\n contents.delete(content);\n if (contents.size === 0) {\n contentSetByNode.delete(node);\n }\n }\n}","\nexport function createEmptySet<T>(): Readonly<Set<T>> {\n return Object.freeze(new Set<T>());\n}\n","import { clearAbsoluteStateAddressByBinding } from \"../binding/getAbsoluteStateAddressByBinding.js\";\nimport { clearStateAddressByBindingInfo } from \"../binding/getStateAddressByBindingInfo.js\";\nimport { getBindingsByContent, setBindingsByContent } from \"../bindings/bindingsByContent.js\";\nimport { setIndexBindingsByContent } from \"../bindings/indexBindingsByContent.js\";\nimport { initializeBindingsByFragment } from \"../bindings/initializeBindings.js\";\nimport { setNodesByContent } from \"../bindings/nodesByContent.js\";\nimport { INDEX_BY_INDEX_NAME } from \"../define.js\";\nimport { raiseError } from \"../raiseError.js\";\nimport { IBindingInfo } from \"../types.js\";\nimport { getContentSetByNode, setContentByNode } from \"./contentsByNode.js\";\nimport { getFragmentInfoByUUID } from \"./fragmentInfoByUUID.js\";\nimport { IContent } from \"./types.js\";\n\nconst recursiveBindingTypes = new Set(['if', 'elseif', 'else', 'for']);\n\nclass Content implements IContent {\n private _content: DocumentFragment;\n private _childNodeArray: Node[] = [];\n private _firstNode: Node | null = null;\n private _lastNode: Node | null = null;\n private _mounted: boolean = false;\n constructor(content: DocumentFragment) {\n this._content = content;\n this._childNodeArray = Array.from(this._content.childNodes);\n this._firstNode = this._childNodeArray.length > 0 ? this._childNodeArray[0] : null;\n this._lastNode = this._childNodeArray.length > 0 ? this._childNodeArray[this._childNodeArray.length - 1] : null;\n }\n\n get firstNode(): Node | null {\n return this._firstNode;\n }\n\n get lastNode(): Node | null {\n return this._lastNode;\n }\n\n get mounted(): boolean {\n return this._mounted;\n }\n\n appendTo(targetNode: Node): void {\n for(const node of this._childNodeArray) {\n targetNode.appendChild(node);\n }\n this._mounted = true;\n }\n\n mountAfter(targetNode: Node): void {\n const parentNode = targetNode.parentNode;\n const nextSibling = targetNode.nextSibling;\n if (parentNode) {\n for(const node of this._childNodeArray) {\n parentNode.insertBefore(node, nextSibling);\n }\n }\n this._mounted = true;\n }\n\n unmount(): void {\n for(const node of this._childNodeArray) {\n if (node.parentNode !== null) {\n node.parentNode.removeChild(node);\n }\n }\n const bindings = getBindingsByContent(this);\n for(const binding of bindings) {\n if (recursiveBindingTypes.has(binding.bindingType)) {\n const contents = getContentSetByNode(binding.node);\n for (const content of contents) {\n content.unmount();\n }\n }\n clearStateAddressByBindingInfo(binding);\n clearAbsoluteStateAddressByBinding(binding);\n }\n this._mounted = false;\n }\n}\n\n/**\n * SSR ハイドレーション用: 既存の DOM ノード配列から Content を生成する。\n * テンプレートからの clone ではなく、SSR で描画済みのノードをそのまま使う。\n */\nexport function createContentFromNodes(\n nodes: Node[],\n): IContent {\n const fragment = document.createDocumentFragment();\n // ノードを fragment に移動せず、参照だけ持つ Content を作る\n const content = new Content(fragment);\n // Content の内部状態を直接設定\n (content as any)._childNodeArray = nodes;\n (content as any)._firstNode = nodes.length > 0 ? nodes[0] : null;\n (content as any)._lastNode = nodes.length > 0 ? nodes[nodes.length - 1] : null;\n (content as any)._mounted = true; // SSR で既にマウント済み\n return content;\n}\n\nexport function createContent(\n bindingInfo: IBindingInfo, \n): IContent {\n if (typeof bindingInfo.uuid === 'undefined' || bindingInfo.uuid === null) {\n raiseError(`BindingInfo.uuid is null.`);\n }\n const fragmentInfo = getFragmentInfoByUUID(bindingInfo.uuid);\n if (!fragmentInfo) {\n raiseError(`Fragment with UUID \"${bindingInfo.uuid}\" not found.`);\n }\n const cloneFragment = document.importNode(fragmentInfo.fragment, true);\n const initialInfo = initializeBindingsByFragment(cloneFragment, fragmentInfo.nodeInfos);\n const content = new Content(cloneFragment);\n setBindingsByContent(content, initialInfo.bindingInfos);\n const indexBindings: IBindingInfo[] = [];\n for(const binding of initialInfo.bindingInfos) {\n if (binding.statePathName in INDEX_BY_INDEX_NAME) {\n indexBindings.push(binding);\n }\n }\n setIndexBindingsByContent(content, indexBindings);\n setNodesByContent(content, initialInfo.nodes);\n setContentByNode(bindingInfo.node, content);\n return content;\n}\n","import { ILoopContext } from \"../list/types\";\nimport { IBindingInfo } from \"../types\";\nimport { getStateElementByName } from \"../stateElementByName\";\nimport { raiseError } from \"../raiseError\";\nimport { replaceToReplaceNode } from \"./replaceToReplaceNode\";\nimport { collectNodesAndBindingInfos, collectNodesAndBindingInfosByFragment } from \"./collectNodesAndBindingInfos\";\nimport { IFragmentNodeInfo } from \"../structural/types\";\nimport { attachEventHandler } from \"../event/handler\";\nimport { attachTwowayEventHandler } from \"../event/twowayHandler\";\nimport { setLoopContextByNode } from \"../list/loopContextByNode\";\nimport { applyChangeFromBindings } from \"../apply/applyChangeFromBindings\";\nimport { IInitialBindingInfo } from \"./types\";\nimport { getAbsoluteStateAddressByBinding } from \"../binding/getAbsoluteStateAddressByBinding\";\nimport { addBindingByAbsoluteStateAddress } from \"../binding/getBindingSetByAbsoluteStateAddress\";\nimport { attachRadioEventHandler } from \"../event/radioHandler\";\nimport { attachCheckboxEventHandler } from \"../event/checkboxHandler\";\n\nfunction _initializeBindings(\n allBindings: IBindingInfo[],\n): void {\n for(const binding of allBindings) {\n\n // replace node\n replaceToReplaceNode(binding);\n\n // event\n if (attachEventHandler(binding)) {\n continue;\n }\n\n // two-way binding\n attachTwowayEventHandler(binding);\n // radio binding\n attachRadioEventHandler(binding);\n // checkbox binding\n attachCheckboxEventHandler(binding);\n\n }\n}\n\nexport function initializeBindings(\n root: Document | DocumentFragment |Element, parentLoopContext: ILoopContext | null\n): void {\n const [subscriberNodes, allBindings] = collectNodesAndBindingInfos(root);\n for(const node of subscriberNodes) {\n setLoopContextByNode(node, parentLoopContext);\n }\n _initializeBindings(allBindings);\n // create absolute state address and register binding infos\n for(const binding of allBindings) {\n const absoluteStateAddress = getAbsoluteStateAddressByBinding(binding);\n addBindingByAbsoluteStateAddress(absoluteStateAddress, binding);\n const rootNode = binding.replaceNode.getRootNode() as Node;\n const stateElement = getStateElementByName(rootNode, binding.stateName);\n if (stateElement === null) {\n raiseError(`State element with name \"${binding.stateName}\" not found for binding.`);\n }\n if (binding.bindingType !== 'event') {\n stateElement.setPathInfo(binding.statePathName, binding.bindingType);\n }\n }\n // apply all at once\n applyChangeFromBindings(allBindings);\n}\n\nexport function initializeBindingsByFragment(\n root: DocumentFragment,\n nodeInfos: IFragmentNodeInfo[], \n): IInitialBindingInfo {\n const [subscriberNodes, allBindings] = collectNodesAndBindingInfosByFragment(root, nodeInfos);\n _initializeBindings(allBindings);\n return {\n nodes: subscriberNodes,\n bindingInfos: allBindings,\n };\n}\n","import { getPathInfo } from \"../address/PathInfo\";\nimport { createStateAddress } from \"../address/StateAddress\";\nimport { getAbsoluteStateAddressByBinding } from \"../binding/getAbsoluteStateAddressByBinding\";\nimport { getIndexBindingsByContent } from \"../bindings/indexBindingsByContent\";\nimport { config, inSsr } from \"../config\";\nimport { WILDCARD } from \"../define\";\nimport { createListDiff } from \"../list/createListDiff\";\nimport { getListIndexByBindingInfo } from \"../list/getListIndexByBindingInfo\";\nimport { getLastListValueByAbsoluteStateAddress } from \"../list/lastListValueByAbsoluteStateAddress\";\nimport { IListIndex } from \"../list/types\";\nimport { raiseError } from \"../raiseError\";\nimport { activateContent, deactivateContent } from \"../structural/activateContent\";\nimport { createContent } from \"../structural/createContent\";\nimport { IContent } from \"../structural/types\";\nimport { IBindingInfo } from \"../types\";\nimport { applyChange } from \"./applyChange\";\nimport { setRootNodeByFragment } from \"./rootNodeByFragment\";\nimport { IApplyContext } from \"./types\";\n\nconst lastNodeByNode: WeakMap<Node, Node> = new WeakMap();\nconst contentByListIndexByNode: WeakMap<Node, WeakMap<IListIndex, IContent>> = new WeakMap();\nconst pooledContentsByNode: WeakMap<Node, IContent[]> = new WeakMap();\nconst isOnlyNodeInParentContentByNode: WeakMap<Node, boolean> = new WeakMap();\n\n// テスト用ヘルパー(内部状態の操作)\nexport function __test_setContentByListIndex(node: Node, index: IListIndex, content: IContent | null): void {\n setContent(node, index, content);\n}\n\nexport function __test_deleteLastNodeByNode(node: Node): void {\n lastNodeByNode.delete(node);\n}\n\n// SSR ハイドレーション用: Content を ListIndex に登録する\nexport function hydrateSetContent(node: Node, index: IListIndex, content: IContent): void {\n setContent(node, index, content);\n}\n\nexport function hydrateSetLastNode(node: Node, lastNode: Node): void {\n lastNodeByNode.set(node, lastNode);\n}\n\nexport function __test_deleteContentByNode(node: Node): void {\n contentByListIndexByNode.delete(node);\n}\n\nfunction getPooledContents(bindingInfo: IBindingInfo): IContent[] {\n return pooledContentsByNode.get(bindingInfo.node) || [];\n}\n\nfunction setPooledContent(bindingInfo: IBindingInfo, content: IContent): void {\n const contents = pooledContentsByNode.get(bindingInfo.node);\n if (typeof contents === 'undefined') {\n pooledContentsByNode.set(bindingInfo.node, [content]);\n } else {\n contents.push(content);\n }\n}\n\nfunction isOnlyNodeInParentContent(firstNode: Node, lastNode: Node): boolean {\n let prevCheckNode = firstNode.previousSibling;\n let nextCheckNode = lastNode.nextSibling;\n let onlyNode = true;\n while(prevCheckNode !== null) {\n if (prevCheckNode.nodeType === Node.ELEMENT_NODE \n || (prevCheckNode.nodeType === Node.TEXT_NODE && (prevCheckNode.textContent?.trim() ?? '') !== '')) {\n onlyNode = false;\n break;\n }\n prevCheckNode = prevCheckNode.previousSibling;\n }\n while(nextCheckNode !== null) {\n if (nextCheckNode.nodeType === Node.ELEMENT_NODE \n || (nextCheckNode.nodeType === Node.TEXT_NODE && (nextCheckNode.textContent?.trim() ?? '') !== '')) {\n onlyNode = false;\n break;\n }\n nextCheckNode = nextCheckNode.nextSibling;\n }\n return onlyNode;\n}\n\nfunction getContent(node: Node, listIndex: IListIndex): IContent | null {\n let contentByListIndex = contentByListIndexByNode.get(node);\n if (typeof contentByListIndex === 'undefined') {\n return null;\n }\n const content = contentByListIndex.get(listIndex);\n return typeof content === 'undefined' ? null : content;\n}\n\nfunction setContent(node: Node, listIndex: IListIndex, content: IContent | null): void {\n let contentByListIndex = contentByListIndexByNode.get(node);\n if (typeof contentByListIndex === 'undefined') {\n if (content === null) {\n return;\n }\n contentByListIndex = new WeakMap<IListIndex, IContent>();\n contentByListIndexByNode.set(node, contentByListIndex);\n }\n if (content === null) {\n contentByListIndex.delete(listIndex);\n } else {\n contentByListIndex.set(listIndex, content);\n }\n}\n\nexport function applyChangeToFor(\n bindingInfo: IBindingInfo, \n context: IApplyContext,\n newValue: unknown, \n): void {\n const listPathInfo = bindingInfo.statePathInfo;\n const listIndex = getListIndexByBindingInfo(bindingInfo);\n const absAddress = getAbsoluteStateAddressByBinding(bindingInfo);\n const lastValue = getLastListValueByAbsoluteStateAddress(absAddress);\n const diff = createListDiff(listIndex, lastValue, newValue);\n context.newListValueByAbsAddress.set(absAddress, Array.isArray(newValue) ? newValue : []);\n\n if (Array.isArray(lastValue) \n && lastValue.length === diff.deleteIndexSet.size \n && diff.deleteIndexSet.size > 0\n && bindingInfo.node.parentNode !== null\n ) {\n let isOnlyNode = isOnlyNodeInParentContentByNode.get(bindingInfo.node);\n if (typeof isOnlyNode === 'undefined') {\n const lastNode = lastNodeByNode.get(bindingInfo.node) || bindingInfo.node;\n isOnlyNode = isOnlyNodeInParentContent(bindingInfo.node, lastNode);\n isOnlyNodeInParentContentByNode.set(bindingInfo.node, isOnlyNode);\n }\n if (isOnlyNode) {\n const parentNode = bindingInfo.node.parentNode;\n parentNode.textContent = '';\n parentNode.appendChild(bindingInfo.node);\n }\n }\n for(const deleteIndex of diff.deleteIndexSet) {\n const content = getContent(bindingInfo.node, deleteIndex);\n if (content !== null) {\n deactivateContent(content);\n content.unmount();\n setPooledContent(bindingInfo, content);\n setContent(bindingInfo.node, deleteIndex, null);\n }\n }\n\n let lastNode = bindingInfo.node;\n const elementPathInfo = getPathInfo(listPathInfo.path + '.' + WILDCARD);\n const loopContextStack = context.stateElement.loopContextStack;\n let fragment: DocumentFragment | null = null;\n if (diff.newIndexes.length == diff.addIndexSet.size \n && diff.newIndexes.length > 0\n && lastNode.isConnected\n ) {\n // 全部追加の場合はまとめて処理\n fragment = document.createDocumentFragment();\n setRootNodeByFragment(fragment, context.rootNode);\n }\n const ssrMode = inSsr();\n const uuid = bindingInfo.uuid ?? '';\n for(const index of diff.newIndexes) {\n let content: IContent | undefined;\n // add\n if (diff.addIndexSet.has(index)) {\n const stateAddress = createStateAddress(elementPathInfo, index);\n loopContextStack.createLoopContext(stateAddress, (loopContext) => {\n const pooledContents = getPooledContents(bindingInfo);\n content = pooledContents.pop();\n if (typeof content === 'undefined') {\n content = createContent(bindingInfo);\n }\n // コンテント活性化の前にDOMツリーに追加しておく必要がある\n if (fragment !== null) {\n if (ssrMode) {\n fragment.appendChild(document.createComment(`@@wcs-for-start:${uuid}:${listPathInfo.path}:${index.index}`));\n }\n content.appendTo(fragment);\n if (ssrMode) {\n fragment.appendChild(document.createComment(`@@wcs-for-end:${uuid}:${listPathInfo.path}:${index.index}`));\n }\n } else {\n // Update lastNode for next iteration to ensure correct order\n // Ensure content is in correct position (e.g. if previous siblings were deleted/moved)\n if (lastNode.nextSibling !== content.firstNode) {\n if (ssrMode) {\n const startComment = document.createComment(`@@wcs-for-start:${uuid}:${listPathInfo.path}:${index.index}`);\n lastNode.parentNode!.insertBefore(startComment, lastNode.nextSibling);\n lastNode = startComment;\n }\n content.mountAfter(lastNode);\n }\n if (ssrMode) {\n const endComment = document.createComment(`@@wcs-for-end:${uuid}:${listPathInfo.path}:${index.index}`);\n const afterNode = content.lastNode ?? lastNode;\n afterNode.parentNode!.insertBefore(endComment, afterNode.nextSibling);\n }\n }\n // コンテントを活性化\n activateContent(content, loopContext, context);\n });\n if (typeof content === 'undefined') {\n raiseError(`Content not found for ListIndex: ${index.index} at path \"${listPathInfo.path}\"`);\n }\n } else {\n content = getContent(bindingInfo.node, index)!;\n if (diff.changeIndexSet.has(index)) {\n // change\n const indexBindings = getIndexBindingsByContent(content);\n for(const indexBinding of indexBindings) {\n applyChange(indexBinding, context);\n }\n }\n // Update lastNode for next iteration to ensure correct order\n // Ensure content is in correct position (e.g. if previous siblings were deleted/moved)\n if (content === null) {\n raiseError(`Content not found for ListIndex: ${index.index} at path \"${listPathInfo.path}\"`);\n }\n if (lastNode.nextSibling !== content.firstNode) {\n content.mountAfter(lastNode);\n }\n }\n lastNode = content.lastNode || lastNode;\n setContent(bindingInfo.node, index, content);\n }\n lastNodeByNode.set(bindingInfo.node, lastNode);\n if (fragment !== null) {\n // Mount all at once\n bindingInfo.node.parentNode!.insertBefore(fragment, bindingInfo.node.nextSibling);\n setRootNodeByFragment(fragment, null);\n }\n}\n","import { config, inSsr } from \"../config\";\nimport { getLoopContextByNode } from \"../list/loopContextByNode\";\nimport { activateContent, deactivateContent } from \"../structural/activateContent\";\nimport { getContentSetByNode } from \"../structural/contentsByNode\";\nimport { createContent } from \"../structural/createContent\";\nimport { IContent } from \"../structural/types\";\nimport { IBindingInfo } from \"../types\";\nimport { IApplyContext } from \"./types\";\n\nconst lastConnectedByNode: WeakMap<Node, boolean> = new WeakMap();\n\nfunction bindingInfoText(bindingInfo: IBindingInfo): string {\n return `${bindingInfo.bindingType} ${bindingInfo.statePathName} ${bindingInfo.outFilters.map(f => f.filterName).join('|')} ${bindingInfo.node.isConnected ? '(connected)' : '(disconnected)'}`;\n}\n\nexport function applyChangeToIf(\n bindingInfo: IBindingInfo,\n context: IApplyContext,\n rawNewValue: unknown,\n): void {\n const currentConnected = bindingInfo.node.isConnected;\n const newValue = Boolean(rawNewValue);\n let content: IContent | undefined;\n const contents = getContentSetByNode(bindingInfo.node);\n if (contents.size === 0) {\n content = createContent(bindingInfo);\n } else {\n content = contents.values().next().value!;\n }\n const ssrMode = inSsr();\n const uuid = bindingInfo.uuid ?? '';\n const keyword = bindingInfo.bindingType; // if, elseif, else\n try {\n if (!newValue) {\n if (config.debug) {\n console.log(`unmount if content : ${bindingInfoText(bindingInfo)}`);\n }\n deactivateContent(content);\n content.unmount();\n }\n if (newValue) {\n if (config.debug) {\n console.log(`mount if content : ${bindingInfoText(bindingInfo)}`);\n }\n if (ssrMode) {\n const startComment = document.createComment(`@@wcs-${keyword}-start:${uuid}:${bindingInfo.statePathName}`);\n bindingInfo.node.parentNode!.insertBefore(startComment, bindingInfo.node.nextSibling);\n content.mountAfter(startComment);\n const endComment = document.createComment(`@@wcs-${keyword}-end:${uuid}:${bindingInfo.statePathName}`);\n const afterNode = content.lastNode ?? startComment;\n afterNode.parentNode!.insertBefore(endComment, afterNode.nextSibling);\n } else {\n content.mountAfter(bindingInfo.node);\n }\n const loopContext = getLoopContextByNode(bindingInfo.node);\n activateContent(content, loopContext, context);\n }\n } finally {\n lastConnectedByNode.set(bindingInfo.node, currentConnected);\n }\n}\n\n","/**\n * SSR 時に HTML 属性で表現できないプロパティバインディングを蓄積するストア。\n * ハイドレーション時にクライアント側で復元する。\n */\n\nexport interface ISsrPropertyEntry {\n propName: string;\n value: unknown;\n}\n\n// node → プロパティエントリのリスト\nconst store: WeakMap<Node, ISsrPropertyEntry[]> = new WeakMap();\n\nexport function addSsrProperty(node: Node, propName: string, value: unknown): void {\n let entries = store.get(node);\n if (!entries) {\n entries = [];\n store.set(node, entries);\n }\n // 同じプロパティの既存エントリは上書き\n const existing = entries.find(e => e.propName === propName);\n if (existing) {\n existing.value = value;\n } else {\n entries.push({ propName, value });\n }\n}\n\nexport function getSsrProperties(node: Node): ISsrPropertyEntry[] {\n return store.get(node) ?? [];\n}\n\nexport function getAllSsrPropertyNodes(): Node[] {\n // WeakMap は列挙不可なので、別途トラッキングが必要\n return Array.from(trackedNodes);\n}\n\nconst trackedNodes: Set<Node> = new Set();\n\nexport function trackSsrPropertyNode(node: Node): void {\n trackedNodes.add(node);\n}\n\nexport function clearSsrPropertyStore(): void {\n trackedNodes.clear();\n}\n","import { config, inSsr } from \"../config\";\nimport { IBindingInfo } from \"../types\";\nimport { IApplyContext } from \"./types\";\nimport { addSsrProperty, trackSsrPropertyNode } from \"./ssrPropertyStore\";\n\n// SSR 時に HTML 属性で代替可能なプロパティ\n// これら以外のプロパティは ssrPropertyStore に蓄積してハイドレーション時に復元\nconst SSR_ATTR_PROPS: Record<string, (element: Element, value: unknown) => void> = {\n value(element, value) {\n if (element.tagName === 'TEXTAREA') {\n element.textContent = String(value ?? '');\n } else {\n element.setAttribute('value', String(value ?? ''));\n }\n },\n checked(element, value) {\n if (value) element.setAttribute('checked', '');\n else element.removeAttribute('checked');\n },\n selected(element, value) {\n if (value) element.setAttribute('selected', '');\n else element.removeAttribute('selected');\n },\n disabled(element, value) {\n if (value) element.setAttribute('disabled', '');\n else element.removeAttribute('disabled');\n },\n selectedIndex(element, value) {\n const options = element.querySelectorAll('option');\n const idx = Number(value);\n for (let i = 0; i < options.length; i++) {\n if (i === idx) options[i].setAttribute('selected', '');\n else options[i].removeAttribute('selected');\n }\n },\n};\n\nexport function applyChangeToProperty(binding: IBindingInfo, _context: IApplyContext, newValue: unknown): void {\n const element = binding.node as Element;\n const propSegments = binding.propSegments;\n if (propSegments.length === 1) {\n const firstSegment = propSegments[0];\n if ((element as any)[firstSegment] !== newValue) {\n try {\n (element as any)[firstSegment] = newValue;\n } catch (error) {\n if (config.debug) {\n console.warn(`Failed to set property '${firstSegment}' on element.`, {\n element,\n newValue,\n error\n });\n }\n }\n }\n if (inSsr()) {\n const attrHandler = SSR_ATTR_PROPS[firstSegment];\n if (attrHandler) {\n // 属性で代替可能 → HTML 属性に反映\n attrHandler(element, newValue);\n } else {\n // 属性で代替不可 → ハイドレーション用ストアに蓄積\n addSsrProperty(element, firstSegment, newValue);\n trackSsrPropertyNode(element);\n }\n }\n return;\n }\n const firstSegment = propSegments[0];\n let subObject = (element as any)[firstSegment];\n for (let i = 1; i < propSegments.length - 1; i++) {\n const segment = propSegments[i];\n if (subObject == null) {\n return;\n }\n subObject = subObject[segment];\n }\n const oldValue = subObject[propSegments[propSegments.length - 1]];\n if (oldValue !== newValue) {\n if (Object.isFrozen(subObject)) {\n if (config.debug) {\n console.warn(`Attempting to set property on frozen object.`, {\n element,\n propSegments,\n oldValue,\n newValue\n });\n }\n return;\n }\n try {\n subObject[propSegments[propSegments.length - 1]] = newValue;\n } catch (error) {\n if (config.debug) {\n console.warn(`Failed to set property on sub-object.`, {\n element,\n propSegments,\n oldValue,\n newValue,\n error\n });\n }\n }\n }\n // サブオブジェクトプロパティ (e.g. style.xxx) は属性に反映済みなのでストア不要\n}\n","import { inSsr } from \"../config\";\nimport { IBindingInfo } from \"../binding/types\";\nimport { IApplyContext } from \"./types\";\n\nconst ssrWrappedNodes: WeakSet<Node> = new WeakSet();\n\nexport function applyChangeToText(binding: IBindingInfo, _context: IApplyContext, newValue: unknown): void {\n if (binding.replaceNode.nodeValue !== newValue) {\n binding.replaceNode.nodeValue = newValue as string;\n }\n // SSR モード時: テキストノードの前後にコメントを挿入して境界を明示\n if (inSsr() && !ssrWrappedNodes.has(binding.replaceNode)) {\n ssrWrappedNodes.add(binding.replaceNode);\n const parentNode = binding.replaceNode.parentNode;\n if (parentNode) {\n const path = binding.statePathName;\n const startComment = document.createComment(`@@wcs-text-start:${path}`);\n const endComment = document.createComment(`@@wcs-text-end:${path}`);\n parentNode.insertBefore(startComment, binding.replaceNode);\n parentNode.insertBefore(endComment, binding.replaceNode.nextSibling);\n }\n }\n}\n","import { raiseError } from \"../raiseError\";\nimport { IBindingInfo } from \"../types\";\nimport { IApplyContext } from \"./types\";\n\nexport function applyChangeToWebComponent(binding: IBindingInfo, _context: IApplyContext, newValue: unknown): void {\n const element = binding.node as Element;\n const propSegments = binding.propSegments;\n if (propSegments.length <= 1) {\n raiseError(`Invalid propSegments for web component binding: ${propSegments.join(\".\")}`);\n }\n const [ firstSegment, ...restSegments ] = propSegments;\n const subObject = (element as any)[firstSegment] as Record<string, unknown> | undefined;\n if (typeof subObject === \"undefined\") {\n raiseError(`Property \"${firstSegment}\" not found on web component.`);\n }\n subObject[restSegments.join(\".\")] = newValue;\n}\n","import { getStateAddressByBindingInfo } from \"../binding/getStateAddressByBindingInfo\";\nimport { IBindingInfo } from \"../binding/types\";\nimport { INDEX_BY_INDEX_NAME } from \"../define\";\nimport { getIndexValueByLoopContext } from \"../list/getIndexValueByLoopContext\";\nimport { getLoopContextByNode } from \"../list/loopContextByNode\";\nimport { getByAddressSymbol } from \"../proxy/symbols\";\nimport { IStateProxy } from \"../proxy/types\";\nimport { raiseError } from \"../raiseError\";\n\nexport function getValue(state: IStateProxy, binding: IBindingInfo): any {\n const stateAddress = getStateAddressByBindingInfo(binding);\n if (stateAddress.pathInfo.path in INDEX_BY_INDEX_NAME) {\n const loopContext = getLoopContextByNode(binding.node);\n if (loopContext === null) {\n raiseError(`ListIndex not found for binding: ${binding.statePathName}`);\n }\n return getIndexValueByLoopContext(loopContext, stateAddress.pathInfo.path);\n } else {\n return state[getByAddressSymbol](stateAddress);\n }\n}\n","import { INDEX_BY_INDEX_NAME } from \"../define\";\nimport { raiseError } from \"../raiseError\";\nimport { ILoopContext } from \"./types\";\n\n// indexName ... $1, $2, ...\nexport function getIndexValueByLoopContext(loopContext: ILoopContext, indexName: string): number | null {\n if (loopContext.listIndex === null) {\n raiseError(`ListIndex not found for loopContext:`);\n }\n const indexPos = INDEX_BY_INDEX_NAME[indexName];\n if (typeof indexPos === \"undefined\") {\n raiseError(`Invalid index name: ${indexName}`);\n }\n const listIndex = loopContext.listIndex.at(indexPos);\n if (listIndex === null) {\n raiseError(`Index not found at position ${indexPos} for loopContext:`);\n }\n return listIndex.index;\n}","import { getAbsoluteStateAddressByBinding } from \"../binding/getAbsoluteStateAddressByBinding.js\";\nimport { getCustomElement } from \"../getCustomElement.js\";\nimport { raiseError } from \"../raiseError.js\";\nimport { getStateElementByName } from \"../stateElementByName.js\";\nimport { IBindingInfo } from \"../types.js\";\nimport { isWebComponentComplete } from \"../webComponent/completeWebComponent.js\";\nimport { applyChangeToAttribute } from \"./applyChangeToAttribute.js\";\nimport { applyChangeToCheckbox } from \"./applyChangeToCheckbox.js\";\nimport { applyChangeToClass } from \"./applyChangeToClass.js\";\nimport { applyChangeToFor } from \"./applyChangeToFor.js\";\nimport { applyChangeToIf } from \"./applyChangeToIf.js\";\nimport { applyChangeToProperty } from \"./applyChangeToProperty.js\";\nimport { applyChangeToRadio } from \"./applyChangeToRadio.js\";\nimport { applyChangeToStyle } from \"./applyChangeToStyle.js\";\nimport { applyChangeToText } from \"./applyChangeToText.js\";\nimport { applyChangeToWebComponent } from \"./applyChangeToWebComponent.js\";\nimport { getFilteredValue } from \"./getFilteredValue.js\";\nimport { getValue } from \"./getValue.js\";\nimport { getRootNodeByFragment } from \"./rootNodeByFragment.js\";\nimport { ApplyChangeFn, IApplyContext } from \"./types.js\";\n\nconst applyChangeByFirstSegment: { [key: string]: ApplyChangeFn } = {\n \"class\": applyChangeToClass,\n \"attr\": applyChangeToAttribute,\n \"style\": applyChangeToStyle,\n};\n\nconst applyChangeByBindingType: { [key: string]: ApplyChangeFn } = {\n \"text\": applyChangeToText,\n \"for\": applyChangeToFor,\n \"if\": applyChangeToIf,\n \"else\": applyChangeToIf,\n \"elseif\": applyChangeToIf,\n \"radio\": applyChangeToRadio,\n \"checkbox\": applyChangeToCheckbox,\n};\n\nconst fnByBinding: WeakMap<IBindingInfo, ApplyChangeFn> = new WeakMap();\nconst deferredSelectBindingByBinding: WeakMap<IBindingInfo, boolean> = new WeakMap();\n\nfunction _applyChange(binding: IBindingInfo, context: IApplyContext): void {\n const value = getValue(context.state, binding);\n const filteredValue = getFilteredValue(value, binding.outFilters);\n\n if (deferredSelectBindingByBinding.get(binding) === true) {\n context.deferredSelectBindings.push({ binding, value: filteredValue });\n return;\n }\n let fn = fnByBinding.get(binding);\n if (typeof fn !== 'undefined') {\n fn(binding, context, filteredValue);\n return;\n }\n if (fnByBinding.has(binding)) {\n if (isWebComponentComplete(binding.replaceNode as Element, context.stateElement)) {\n fn = applyChangeToWebComponent;\n fnByBinding.set(binding, fn); // 確定したのでキャッシュ\n } else {\n fn = applyChangeToProperty;\n }\n fn(binding, context, filteredValue);\n return;\n }\n\n fn = applyChangeByBindingType[binding.bindingType];\n if (typeof fn === 'undefined') {\n const firstSegment = binding.propSegments[0];\n fn = applyChangeByFirstSegment[firstSegment];\n fnByBinding.set(binding, fn);\n if (typeof fn === 'undefined') {\n const customTag = getCustomElement(binding.replaceNode);\n if (customTag) {\n if (isWebComponentComplete(binding.replaceNode as Element, context.stateElement)) {\n fn = applyChangeToWebComponent;\n fnByBinding.set(binding, fn); // 確定したのでキャッシュ\n } else {\n fn = applyChangeToProperty;\n }\n } else {\n fn = applyChangeToProperty;\n fnByBinding.set(binding, fn);\n }\n }\n }\n if (fn === applyChangeToProperty) {\n const element = binding.node as Element;\n if (element.tagName === 'SELECT') {\n const propName = binding.propSegments[0];\n if (propName === 'value' || propName === 'selectedIndex') {\n context.deferredSelectBindings.push({ binding, value: filteredValue });\n deferredSelectBindingByBinding.set(binding, true);\n return;\n }\n }\n }\n fn(binding, context, filteredValue);\n}\n\nexport function applyChange(binding: IBindingInfo, context: IApplyContext): void {\n if (context.appliedBindingSet.has(binding)) {\n return;\n }\n context.appliedBindingSet.add(binding);\n const absAddress = getAbsoluteStateAddressByBinding(binding);\n if (context.updatedAbsAddressSetByStateElement.has(context.stateElement)) {\n const addressSet = context.updatedAbsAddressSetByStateElement.get(context.stateElement)!;\n addressSet.add(absAddress);\n } else {\n context.updatedAbsAddressSetByStateElement.set(context.stateElement, new Set([\n absAddress\n ]));\n }\n if (binding.bindingType === \"event\") {\n return;\n }\n const customTag = getCustomElement(binding.replaceNode);\n if (customTag) {\n if (customElements.get(customTag) === undefined) {\n // cutomElement側の初期化を期待\n return;\n }\n }\n let rootNode: Node | null = binding.replaceNode.getRootNode() as Node;\n if (rootNode instanceof DocumentFragment && !(rootNode instanceof ShadowRoot)) {\n rootNode = getRootNodeByFragment(rootNode);\n if (rootNode === null) {\n raiseError(`Root node for fragment not found for binding.`);\n }\n }\n if (binding.stateName !== context.stateName || rootNode !== context.rootNode) {\n const stateElement = getStateElementByName(rootNode, binding.stateName);\n if (stateElement === null) {\n raiseError(`State element with name \"${binding.stateName}\" not found for binding.`);\n }\n stateElement.createState(\"readonly\", (targetState) => {\n const newContext = {\n stateName: binding.stateName,\n rootNode: rootNode,\n stateElement: stateElement,\n state: targetState,\n appliedBindingSet: context.appliedBindingSet,\n newListValueByAbsAddress: context.newListValueByAbsAddress,\n updatedAbsAddressSetByStateElement: context.updatedAbsAddressSetByStateElement,\n deferredSelectBindings: context.deferredSelectBindings,\n }\n _applyChange(binding, newContext);\n });\n } else {\n _applyChange(binding, context);\n }\n}\n","import { raiseError } from \"../raiseError\";\nimport { IBindingInfo } from \"../types\";\nimport { IApplyContext } from \"./types\";\n\nexport function applyChangeToClass(binding: IBindingInfo, _context: IApplyContext, newValue: unknown): void {\n const element = binding.node as Element;\n const className = binding.propSegments[1];\n if (typeof newValue !== 'boolean') {\n raiseError(`Invalid value for class application: expected boolean, got ${typeof newValue}`);\n }\n element.classList.toggle(className, newValue as boolean);\n}","import { IBindingInfo } from \"../types\";\nimport { IApplyContext } from \"./types\";\n\nexport function applyChangeToAttribute(binding: IBindingInfo, _context: IApplyContext, newValue: unknown): void {\n const element = binding.node as Element;\n const attrName = binding.propSegments[1];\n if (element.getAttribute(attrName) !== newValue) {\n element.setAttribute(attrName, newValue as string);\n }\n}\n","import { IBindingInfo } from \"../types\";\nimport { IApplyContext } from \"./types\";\n\nexport function applyChangeToStyle(binding: IBindingInfo, _context: IApplyContext, newValue: unknown): void {\n const styleName = binding.propSegments[1];\n const style = (binding.node as HTMLElement).style;\n const currentValue = (style as any)[styleName];\n if (currentValue !== newValue) {\n (style as any)[styleName] = newValue;\n }\n}\n","import { IBindingInfo } from \"../types\";\nimport { getFilteredValue } from \"./getFilteredValue\";\nimport { IApplyContext } from \"./types\";\n\nexport function applyChangeToRadio(binding: IBindingInfo, _context: IApplyContext, newValue: unknown): void {\n const element = binding.node as HTMLInputElement;\n const elementValue = element.value;\n const elementFilteredValue = getFilteredValue(elementValue, binding.inFilters);\n element.checked = newValue === elementFilteredValue;\n}\n","import { IAbsoluteStateAddress } from \"../address/types\";\nimport { IStateElement } from \"../components/types\";\nimport { config } from \"../config\";\nimport { setLastListValueByAbsoluteStateAddress } from \"../list/lastListValueByAbsoluteStateAddress\";\nimport { updatedCallbackSymbol } from \"../proxy/symbols\";\nimport { raiseError } from \"../raiseError\";\nimport { getStateElementByName } from \"../stateElementByName\";\nimport { IBindingInfo } from \"../types\";\nimport { applyChange } from \"./applyChange\";\nimport { applyChangeToProperty } from \"./applyChangeToProperty\";\nimport { getRootNodeByFragment } from \"./rootNodeByFragment\";\nimport { IApplyContext, IDeferredSelectBinding } from \"./types\";\n\n/**\n * バインディング情報の配列を処理し、各バインディングに対して状態の変更を適用する。\n *\n * 2フェーズで処理:\n * Phase 1: 構造的更新(for/if) + 値更新(select以外) — select.value/selectedIndex は遅延収集\n * Phase 2: 遅延されたselect.value/selectedIndex を適用(option要素の生成後)\n *\n * 最適化のため、以下のグループ化を行う:\n * 同じ stateNameとrootNode を持つバインディングをグループ化 → createState の呼び出しを削減\n */\nexport function applyChangeFromBindings(bindings: IBindingInfo[]): void {\n let bindingIndex = 0;\n const appliedBindingSet: Set<IBindingInfo> = new Set();\n const newListValueByAbsAddress: Map<IAbsoluteStateAddress, readonly unknown[]> = new Map();\n const updatedAbsAddressSetByStateElement: Map<IStateElement, Set<IAbsoluteStateAddress>> = new Map();\n const deferredSelectBindings: IDeferredSelectBinding[] = [];\n\n // Phase 1: 構造的更新 + 値更新(select.value/selectedIndex は遅延)\n while(bindingIndex < bindings.length) {\n let binding = bindings[bindingIndex];\n const stateName = binding.stateName;\n if (binding.replaceNode.isConnected === false) {\n // 切断されているバインディングは無視、本来は事前に除去されているはず\n if (config.debug) {\n console.log(`applyChangeFromBindings: skip disconnected binding: ${binding.bindingType} ${binding.statePathName} on ${binding.node.nodeName}`, binding);\n }\n bindingIndex++;\n continue;\n }\n let rootNode: Node | null = binding.replaceNode.getRootNode() as Node;\n if (rootNode instanceof DocumentFragment && !(rootNode instanceof ShadowRoot)) {\n rootNode = getRootNodeByFragment(rootNode);\n if (rootNode === null) {\n raiseError(`Root node for fragment not found for binding.`);\n }\n }\n const stateElement = getStateElementByName(rootNode, stateName);\n if (stateElement === null) {\n raiseError(`State element with name \"${stateName}\" not found for binding.`);\n }\n\n stateElement.createState(\"readonly\", (state) => {\n const context: IApplyContext = {\n rootNode: rootNode,\n stateName: stateName,\n stateElement: stateElement,\n state: state,\n appliedBindingSet: appliedBindingSet,\n newListValueByAbsAddress: newListValueByAbsAddress,\n updatedAbsAddressSetByStateElement: updatedAbsAddressSetByStateElement,\n deferredSelectBindings: deferredSelectBindings,\n };\n\n do {\n applyChange(binding, context);\n bindingIndex++;\n\n const nextBindingInfo: IBindingInfo | undefined = bindings[bindingIndex];\n if (!nextBindingInfo) break; // 終端に到達\n const nextRootNode = nextBindingInfo.replaceNode.getRootNode() as Node;\n if (nextBindingInfo.stateName !== stateName || nextRootNode !== context.rootNode) break; // stateName が変わった\n binding = nextBindingInfo;\n } while(true); // eslint-disable-line no-constant-condition\n });\n }\n // Phase 2: 遅延されたselect.value/selectedIndex を適用\n // applyChangeToProperty は context を参照しないため null を渡す\n for (const { binding, value } of deferredSelectBindings) {\n applyChangeToProperty(binding, null as unknown as IApplyContext, value);\n }\n\n for(const [ absAddress, newListValue ] of newListValueByAbsAddress.entries()) {\n setLastListValueByAbsoluteStateAddress(absAddress, newListValue);\n }\n for(const [ stateElement, absAddressSet ] of updatedAbsAddressSetByStateElement.entries()) {\n stateElement.createState(\"writable\", (state) => {\n state[updatedCallbackSymbol](Array.from(absAddressSet));\n });\n }\n}\n","import { getLoopContextByNode } from \"../list/loopContextByNode\";\nimport { raiseError } from \"../raiseError\";\nimport { getStateElementByName } from \"../stateElementByName\";\nimport { IBindingInfo, IFilterInfo } from \"../types\";\nimport { setLoopContextSymbol } from \"../proxy/symbols\";\n\nconst handlerByHandlerKey: Map<string, (event: Event) => any> = new Map();\nconst bindingSetByHandlerKey: Map<string, Set<IBindingInfo>> = new Map();\n\nfunction getHandlerKey(binding: IBindingInfo, eventName: string): string {\n const filterKey = binding.inFilters.map(f => f.filterName + '(' + f.args.join(',') + ')').join('|');\n return `${binding.stateName}::${binding.statePathName}::${eventName}::${filterKey}`;\n}\n\nfunction getEventName(binding: IBindingInfo): string {\n let eventName = 'input';\n for(const modifier of binding.propModifiers) {\n if (modifier.startsWith('on')) {\n eventName = modifier.slice(2);\n }\n }\n return eventName;\n}\n\nconst radioEventHandlerFunction = (\n stateName: string,\n statePathName: string,\n inFilters: IFilterInfo[],\n) => (event: Event): any => {\n const node = event.target as HTMLInputElement;\n if (node === null) {\n console.warn(`[@wcstack/state] event.target is null.`);\n return;\n }\n if (node.type !== 'radio') {\n console.warn(`[@wcstack/state] event.target is not a radio input element.`);\n return;\n }\n if (node.checked === false) {\n return;\n }\n const newValue = node.value;\n let filteredNewValue: unknown = newValue;\n for(const filter of inFilters) {\n filteredNewValue = filter.filterFn(filteredNewValue);\n }\n\n const rootNode = node.getRootNode() as Node;\n const stateElement = getStateElementByName(rootNode, stateName);\n if (stateElement === null) {\n raiseError(`State element with name \"${stateName}\" not found for two-way binding.`);\n }\n\n const loopContext = getLoopContextByNode(node);\n stateElement.createState(\"writable\", (state) => {\n state[setLoopContextSymbol](loopContext, () => {\n state[statePathName] = filteredNewValue;\n });\n });\n}\n\nexport function attachRadioEventHandler(binding: IBindingInfo): boolean {\n if (binding.bindingType === \"radio\" && binding.propModifiers.indexOf('ro') === -1) {\n const eventName = getEventName(binding);\n const key = getHandlerKey(binding, eventName);\n let radioEventHandler = handlerByHandlerKey.get(key);\n if (typeof radioEventHandler === \"undefined\") {\n radioEventHandler = radioEventHandlerFunction(\n binding.stateName,\n binding.statePathName,\n binding.inFilters\n );\n handlerByHandlerKey.set(key, radioEventHandler);\n }\n (binding.node as Element).addEventListener(eventName, radioEventHandler);\n let bindingSet = bindingSetByHandlerKey.get(key);\n if (typeof bindingSet === \"undefined\") {\n bindingSet = new Set<IBindingInfo>([binding]);\n bindingSetByHandlerKey.set(key, bindingSet);\n } else {\n bindingSet.add(binding);\n }\n return true;\n }\n return false;\n}\n\nexport function detachRadioEventHandler(binding: IBindingInfo): boolean {\n if (binding.bindingType === \"radio\" && binding.propModifiers.indexOf('ro') === -1) {\n const eventName = getEventName(binding);\n const key = getHandlerKey(binding, eventName);\n const radioEventHandler = handlerByHandlerKey.get(key);\n if (typeof radioEventHandler === \"undefined\") {\n return false;\n }\n (binding.node as Element).removeEventListener(eventName, radioEventHandler);\n\n const bindingSet = bindingSetByHandlerKey.get(key);\n if (typeof bindingSet === \"undefined\") {\n return false;\n }\n bindingSet.delete(binding);\n if (bindingSet.size === 0) {\n handlerByHandlerKey.delete(key);\n bindingSetByHandlerKey.delete(key);\n }\n return true;\n }\n return false;\n}\n\nexport const __private__ = {\n handlerByHandlerKey,\n bindingSetByHandlerKey,\n getHandlerKey,\n getEventName,\n radioEventHandlerFunction,\n};\n","import { getLoopContextByNode } from \"../list/loopContextByNode\";\nimport { raiseError } from \"../raiseError\";\nimport { getStateElementByName } from \"../stateElementByName\";\nimport { IBindingInfo, IFilterInfo } from \"../types\";\nimport { setLoopContextSymbol } from \"../proxy/symbols\";\n\nconst handlerByHandlerKey: Map<string, (event: Event) => any> = new Map();\nconst bindingSetByHandlerKey: Map<string, Set<IBindingInfo>> = new Map();\n\nfunction getHandlerKey(binding: IBindingInfo, eventName: string): string {\n const filterKey = binding.inFilters.map(f => f.filterName + '(' + f.args.join(',') + ')').join('|');\n return `${binding.stateName}::${binding.statePathName}::${eventName}::${filterKey}`;\n}\n\nfunction getEventName(binding: IBindingInfo): string {\n let eventName = 'input';\n for(const modifier of binding.propModifiers) {\n if (modifier.startsWith('on')) {\n eventName = modifier.slice(2);\n }\n }\n return eventName;\n}\n\nconst checkboxEventHandlerFunction = (\n stateName: string,\n statePathName: string,\n inFilters: IFilterInfo[],\n) => (event: Event): any => {\n const node = event.target as HTMLInputElement;\n if (node === null) {\n console.warn(`[@wcstack/state] event.target is null.`);\n return;\n }\n if (node.type !== 'checkbox') {\n console.warn(`[@wcstack/state] event.target is not a checkbox input element.`);\n return;\n }\n const checked = node.checked;\n const newValue = node.value;\n let filteredNewValue: unknown = newValue;\n for(const filter of inFilters) {\n filteredNewValue = filter.filterFn(filteredNewValue);\n }\n\n const rootNode = node.getRootNode() as Node;\n const stateElement = getStateElementByName(rootNode, stateName);\n if (stateElement === null) {\n raiseError(`State element with name \"${stateName}\" not found for two-way binding.`);\n }\n\n const loopContext = getLoopContextByNode(node);\n stateElement.createState(\"writable\", (state) => {\n state[setLoopContextSymbol](loopContext, () => {\n let currentValue = state[statePathName];\n if (Array.isArray(currentValue)) {\n if (checked) {\n if (currentValue.indexOf(filteredNewValue) === -1) {\n state[statePathName] = currentValue.concat(filteredNewValue);\n }\n } else {\n const index = currentValue.indexOf(filteredNewValue);\n if (index !== -1) {\n state[statePathName] = currentValue.toSpliced(index, 1);\n }\n }\n } else {\n if (checked) {\n state[statePathName] = [filteredNewValue];\n } else {\n state[statePathName] = [];\n }\n }\n });\n });\n}\n\nexport function attachCheckboxEventHandler(binding: IBindingInfo): boolean {\n if (binding.bindingType === \"checkbox\" && binding.propModifiers.indexOf('ro') === -1) {\n const eventName = getEventName(binding);\n const key = getHandlerKey(binding, eventName);\n let checkboxEventHandler = handlerByHandlerKey.get(key);\n if (typeof checkboxEventHandler === \"undefined\") {\n checkboxEventHandler = checkboxEventHandlerFunction(\n binding.stateName,\n binding.statePathName,\n binding.inFilters\n );\n handlerByHandlerKey.set(key, checkboxEventHandler);\n }\n (binding.node as Element).addEventListener(eventName, checkboxEventHandler);\n let bindingSet = bindingSetByHandlerKey.get(key);\n if (typeof bindingSet === \"undefined\") {\n bindingSet = new Set<IBindingInfo>([binding]);\n bindingSetByHandlerKey.set(key, bindingSet);\n } else {\n bindingSet.add(binding);\n }\n return true;\n }\n return false;\n}\n\nexport function detachCheckboxEventHandler(binding: IBindingInfo): boolean {\n if (binding.bindingType === \"checkbox\" && binding.propModifiers.indexOf('ro') === -1) {\n const eventName = getEventName(binding);\n const key = getHandlerKey(binding, eventName);\n const checkboxEventHandler = handlerByHandlerKey.get(key);\n if (typeof checkboxEventHandler === \"undefined\") {\n return false;\n }\n (binding.node as Element).removeEventListener(eventName, checkboxEventHandler);\n\n const bindingSet = bindingSetByHandlerKey.get(key);\n if (typeof bindingSet === \"undefined\") {\n return false;\n }\n bindingSet.delete(binding);\n if (bindingSet.size === 0) {\n handlerByHandlerKey.delete(key);\n bindingSetByHandlerKey.delete(key);\n }\n return true;\n }\n return false;\n}\n\nexport const __private__ = {\n handlerByHandlerKey,\n bindingSetByHandlerKey,\n getHandlerKey,\n getEventName,\n checkboxEventHandlerFunction,\n};\n","import { config } from \"../config.js\";\nimport { SVG_NAMESPACE } from \"../define.js\";\n\nconst MUSTACHE_REGEX = /\\{\\{\\s*(.+?)\\s*\\}\\}/g;\nconst SKIP_TAGS = new Set([\"SCRIPT\", \"STYLE\"]);\n\nexport function convertMustacheToComments(root: Document | Element | DocumentFragment): void {\n if (!config.enableMustache) {\n return;\n }\n\n convertTextNodes(root);\n\n const templates = Array.from(root.querySelectorAll(\"template\"));\n\n for (const template of templates) {\n if (template.namespaceURI === SVG_NAMESPACE) {\n const newTemplate = document.createElement(\"template\");\n const childNodes = Array.from(template.childNodes);\n for(let i = 0; i < childNodes.length; i++) {\n const childNode = childNodes[i];\n newTemplate.content.appendChild(childNode);\n }\n for(const attr of template.attributes) {\n newTemplate.setAttribute(attr.name, attr.value);\n }\n template.replaceWith(newTemplate);\n convertMustacheToComments(newTemplate.content);\n } else {\n convertMustacheToComments(template.content);\n }\n }\n}\n\nfunction convertTextNodes(root: Document | Element | DocumentFragment): void {\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT);\n const textNodes: Text[] = [];\n\n while (walker.nextNode()) {\n textNodes.push(walker.currentNode as Text);\n }\n\n for (const textNode of textNodes) {\n if (textNode.parentElement && SKIP_TAGS.has(textNode.parentElement.tagName)) {\n continue;\n }\n replaceTextNode(textNode);\n }\n}\n\nfunction replaceTextNode(textNode: Text): void {\n const text = textNode.data;\n MUSTACHE_REGEX.lastIndex = 0;\n\n if (!MUSTACHE_REGEX.test(text)) {\n return;\n }\n\n MUSTACHE_REGEX.lastIndex = 0;\n const fragment = document.createDocumentFragment();\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n\n while ((match = MUSTACHE_REGEX.exec(text)) !== null) {\n if (match.index > lastIndex) {\n fragment.appendChild(document.createTextNode(text.slice(lastIndex, match.index)));\n }\n\n const bindText = match[1];\n fragment.appendChild(document.createComment(`@@: ${bindText}`));\n\n lastIndex = match.index + match[0].length;\n }\n\n if (lastIndex < text.length) {\n fragment.appendChild(document.createTextNode(text.slice(lastIndex)));\n }\n\n textNode.parentNode!.replaceChild(fragment, textNode);\n}\n","import { builtinFilterFn, outputBuiltinFilters } from \"../filters/builtinFilters\";\nimport { IFilterInfo } from \"../types\";\n\nlet _notFilterInfo: IFilterInfo | undefined = undefined;\n\nexport function createNotFilter(): IFilterInfo {\n if (_notFilterInfo) {\n return _notFilterInfo;\n }\n const filterName = \"not\"\n const args: string[] = [];\n const filterFn = builtinFilterFn(filterName, args)(outputBuiltinFilters);\n _notFilterInfo = {\n filterName,\n args,\n filterFn,\n }\n return _notFilterInfo;\n}\n","import { config } from \"../config.js\";\nimport { DELIMITER, WILDCARD } from \"../define.js\";\n\nconst COMMENT_REGEX = /^(\\s*@@\\s*(?:.*?)\\s*:\\s*)(.+?)(\\s*)$/;\n\nfunction expandShorthandInStatePart(statePart: string, forPath: string): string {\n const prefix = forPath + DELIMITER + WILDCARD;\n const pipeIndex = statePart.indexOf('|');\n const atIndex = statePart.indexOf('@');\n let pathPart: string;\n let suffix: string;\n if (pipeIndex !== -1) {\n pathPart = statePart.slice(0, pipeIndex).trim();\n suffix = statePart.slice(pipeIndex);\n } else if (atIndex !== -1) {\n pathPart = statePart.slice(0, atIndex).trim();\n suffix = statePart.slice(atIndex);\n } else {\n pathPart = statePart.trim();\n suffix = '';\n }\n if (pathPart === '.') {\n pathPart = prefix;\n } else if (pathPart.startsWith('.')) {\n pathPart = prefix + DELIMITER + pathPart.slice(1);\n } else {\n return statePart;\n }\n if (suffix.length > 0) {\n return pathPart + suffix;\n }\n return pathPart;\n}\n\nfunction expandCommentData(data: string, forPath: string): string {\n const match = COMMENT_REGEX.exec(data);\n if (match === null) {\n return data;\n }\n const commentPrefix = match[1];\n const bindText = match[2];\n const commentSuffix = match[3];\n const expanded = expandShorthandInStatePart(bindText, forPath);\n return commentPrefix + expanded + commentSuffix;\n}\n\nfunction expandBindAttribute(attrValue: string, forPath: string): string {\n const parts = attrValue.split(';');\n let changed = false;\n const result = parts.map(part => {\n const trimmed = part.trim();\n if (trimmed.length === 0) return part;\n const colonIndex = trimmed.indexOf(':');\n if (colonIndex === -1) return part;\n const propPart = trimmed.slice(0, colonIndex).trim();\n const statePart = trimmed.slice(colonIndex + 1).trim();\n const expanded = expandShorthandInStatePart(statePart, forPath);\n if (expanded !== statePart) {\n changed = true;\n return `${propPart}: ${expanded}`;\n }\n return part;\n });\n if (!changed) return attrValue;\n return result.join(';');\n}\n\nexport function expandShorthandInBindAttribute(attrValue: string, forPath: string): string {\n return expandBindAttribute(attrValue, forPath);\n}\n\nexport function expandShorthandPaths(root: DocumentFragment, forPath: string): void {\n const bindAttr = config.bindAttributeName;\n const walker = document.createTreeWalker(\n root,\n NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_ELEMENT,\n );\n\n while (walker.nextNode()) {\n const node = walker.currentNode;\n if (node.nodeType === Node.COMMENT_NODE) {\n const comment = node as Comment;\n comment.data = expandCommentData(comment.data, forPath);\n continue;\n }\n const element = node as Element;\n if (element instanceof HTMLTemplateElement) {\n continue;\n }\n const attr = element.getAttribute(bindAttr);\n if (attr !== null) {\n const expanded = expandBindAttribute(attr, forPath);\n if (expanded !== attr) {\n element.setAttribute(bindAttr, expanded);\n }\n }\n }\n}\n","\nexport function getNodePath(node: Node): number[] {\n let currentNode: Node | null = node;\n const path: number[] = [];\n while(currentNode.parentNode !== null) {\n const nodes: Node[] = Array.from(currentNode.parentNode.childNodes);\n const index = nodes.indexOf(currentNode);\n path.unshift(index);\n currentNode = currentNode.parentNode;\n }\n return path;\n}\n","import { getParseBindTextResults } from \"../bindings/getParseBindTextResults\";\nimport { getSubscriberNodes } from \"../bindings/getSubscriberNodes\";\nimport { getNodePath } from \"./getNodePath\";\nimport { IFragmentNodeInfo } from \"./types\";\n\nexport function getFragmentNodeInfos(fragment: DocumentFragment): IFragmentNodeInfo[] {\n const fragmnentNodeInfos: IFragmentNodeInfo[] = [];\n const subscriberNodes = getSubscriberNodes(fragment);\n for(const subscriberNode of subscriberNodes) {\n const parseBindingTextResults = getParseBindTextResults(subscriberNode);\n fragmnentNodeInfos.push({\n nodePath: getNodePath(subscriberNode),\n parseBindTextResults: parseBindingTextResults,\n });\n }\n return fragmnentNodeInfos;\n}","\nexport function optimizeFragment(fragment: DocumentFragment): void {\n const childNodes = Array.from(fragment.childNodes);\n for(const childNode of childNodes) {\n if (childNode.nodeType === Node.TEXT_NODE) {\n const textContent = childNode.textContent || '';\n if (textContent.trim() === '') {\n // Remove empty text nodes\n fragment.removeChild(childNode);\n }\n }\n }\n}\n","import { getParseBindTextResults } from \"../bindings/getParseBindTextResults\";\nimport { parseBindTextsForElement } from \"../bindTextParser/parseBindTextsForElement\";\nimport { ParseBindTextResult } from \"../bindTextParser/types\";\nimport { config } from \"../config\";\nimport { getUUID } from \"../getUUID\";\nimport { raiseError } from \"../raiseError\";\nimport { BindingType } from \"../types\";\nimport { createNotFilter } from \"./createNotFilter\";\nimport { expandShorthandInBindAttribute, expandShorthandPaths } from \"./expandShorthandPaths\";\nimport { setFragmentInfoByUUID } from \"./fragmentInfoByUUID\";\nimport { getFragmentNodeInfos } from \"./getFragmentNodeInfos\";\nimport { getNodePath } from \"./getNodePath\";\nimport { optimizeFragment } from \"./optimizeFragment\";\nimport { IFragmentInfo } from \"./types\";\n\nconst keywordByBindingType: Map<BindingType, string> = new Map<BindingType, string>([\n [\"for\", config.commentForPrefix],\n [\"if\", config.commentIfPrefix],\n [\"elseif\", config.commentElseIfPrefix],\n [\"else\", config.commentElsePrefix],\n]);\n\nconst notFilter = createNotFilter();\n\nfunction cloneNotParseBindTextResult(\n bindingType: BindingType,\n parseBindTextResult: ParseBindTextResult\n): ParseBindTextResult {\n const filters = parseBindTextResult.outFilters;\n return {\n ...parseBindTextResult,\n outFilters: [...filters, notFilter],\n bindingType: bindingType,\n };\n}\n\nfunction _getFragmentInfo(\n rootNode: Node,\n fragment: DocumentFragment,\n parseBindingTextResult: ParseBindTextResult,\n forPath?: string\n): IFragmentInfo {\n optimizeFragment(fragment);\n if (typeof forPath === \"string\") {\n expandShorthandPaths(fragment, forPath);\n }\n collectStructuralFragments(rootNode, fragment, forPath);\n // after replacing and collect node infos on child fragment\n const fragmentInfo = {\n fragment: fragment,\n parseBindTextResult: parseBindingTextResult,\n nodeInfos: getFragmentNodeInfos(fragment),\n }\n return fragmentInfo;\n}\n\n\nexport function collectStructuralFragments(rootNode: Node, walkRoot: Document | Element | DocumentFragment, forPath?: string): void {\n const elseKeyword = config.commentElsePrefix;\n const walker = document.createTreeWalker(\n walkRoot, \n NodeFilter.SHOW_ELEMENT, \n {\n acceptNode(node: Node) {\n const element = node as Element;\n if (element.tagName.toLowerCase() === 'template') {\n const bindText = element.getAttribute(config.bindAttributeName) || '';\n if (bindText.length > 0) {\n return NodeFilter.FILTER_ACCEPT;\n }\n }\n return NodeFilter.FILTER_SKIP;\n }\n }\n );\n let lastIfFragmentInfo: IFragmentInfo | null = null; // for elseif chaining\n const elseFragmentInfos: IFragmentInfo[] = []; // for elseif chaining\n const templates: HTMLTemplateElement[] = [];\n while (walker.nextNode()) {\n const template = walker.currentNode as HTMLTemplateElement;\n templates.push(template);\n }\n\n for(const template of templates) {\n let bindText = template.getAttribute(config.bindAttributeName) || '';\n if (typeof forPath === \"string\") {\n bindText = expandShorthandInBindAttribute(bindText, forPath);\n }\n const parseBindTextResults = parseBindTextsForElement(bindText);\n let parseBindTextResult = parseBindTextResults[0];\n const keyword = keywordByBindingType.get(parseBindTextResult.bindingType);\n if (typeof keyword === 'undefined') {\n continue;\n }\n\n const bindingType = parseBindTextResult.bindingType;\n const fragment = template.content;\n const uuid = getUUID();\n let fragmentInfo: IFragmentInfo | null = null;\n\n // Determine childForPath for shorthand expansion\n const childForPath = bindingType === \"for\"\n ? parseBindTextResult.statePathName\n : forPath;\n\n if (bindingType === \"else\") {\n // check last 'if' or 'elseif' fragment info\n if (lastIfFragmentInfo === null) {\n raiseError(`'else' binding found without preceding 'if' or 'elseif' binding.`);\n }\n // else condition\n parseBindTextResult = cloneNotParseBindTextResult(\"else\", lastIfFragmentInfo.parseBindTextResult);\n fragmentInfo = _getFragmentInfo(rootNode, fragment, parseBindTextResult, childForPath);\n setFragmentInfoByUUID(uuid, rootNode, fragmentInfo);\n\n const lastElseFragmentInfo = elseFragmentInfos.at(-1);\n const placeHolder = document.createComment(`@@${keyword}:${uuid}`);\n if (typeof lastElseFragmentInfo !== \"undefined\") {\n template.remove();\n lastElseFragmentInfo.fragment.appendChild(placeHolder);\n lastElseFragmentInfo.nodeInfos.push({\n nodePath: getNodePath(placeHolder),\n parseBindTextResults: getParseBindTextResults(placeHolder),\n });\n } else {\n template.replaceWith(placeHolder);\n }\n } else if (bindingType === \"elseif\") {\n // check last 'if' or 'elseif' fragment info\n if (lastIfFragmentInfo === null) {\n raiseError(`'elseif' binding found without preceding 'if' or 'elseif' binding.`);\n }\n\n fragmentInfo = _getFragmentInfo(rootNode, fragment, parseBindTextResult, childForPath);\n setFragmentInfoByUUID(uuid, rootNode, fragmentInfo);\n const placeHolder = document.createComment(`@@${keyword}:${uuid}`);\n\n // create else fragment\n const elseUUID = getUUID();\n const elseFragmentInfo: IFragmentInfo = {\n fragment: document.createDocumentFragment(),\n parseBindTextResult: cloneNotParseBindTextResult(\"else\", lastIfFragmentInfo.parseBindTextResult),\n nodeInfos: [],\n };\n elseFragmentInfo.fragment.appendChild(placeHolder);\n elseFragmentInfo.nodeInfos.push({\n nodePath: getNodePath(placeHolder),\n parseBindTextResults: getParseBindTextResults(placeHolder),\n });\n setFragmentInfoByUUID(elseUUID, rootNode, elseFragmentInfo);\n const lastElseFragmentInfo = elseFragmentInfos.at(-1);\n elseFragmentInfos.push(elseFragmentInfo);\n const elsePlaceHolder = document.createComment(`@@${elseKeyword}:${elseUUID}`);\n\n if (typeof lastElseFragmentInfo !== \"undefined\") {\n template.remove();\n lastElseFragmentInfo.fragment.appendChild(elsePlaceHolder);\n lastElseFragmentInfo.nodeInfos.push({\n nodePath: getNodePath(elsePlaceHolder),\n parseBindTextResults: getParseBindTextResults(elsePlaceHolder),\n });\n } else {\n template.replaceWith(elsePlaceHolder);\n }\n\n } else {\n fragmentInfo = _getFragmentInfo(rootNode, fragment, parseBindTextResult, childForPath);\n setFragmentInfoByUUID(uuid, rootNode, fragmentInfo);\n const placeHolder = document.createComment(`@@${keyword}:${uuid}`);\n template.replaceWith(placeHolder);\n }\n\n // Update lastIfFragmentInfo for if/elseif/else chaining\n if (bindingType === \"if\") {\n elseFragmentInfos.length = 0; // start new if chain\n lastIfFragmentInfo = fragmentInfo;\n } else if (bindingType === \"elseif\") {\n lastIfFragmentInfo = fragmentInfo;\n } else if (bindingType === \"else\") {\n lastIfFragmentInfo = null;\n elseFragmentInfos.length = 0; // end if chain\n }\n }\n}\n","import { State } from \"./components/State\";\nimport { IStateElement } from \"./components/types\";\nimport { config } from \"./config\";\n\nexport async function waitForStateInitialize(root: Document | Element | DocumentFragment): Promise<void> {\n const elements = root.querySelectorAll(config.tagNames.state);\n const promises: Promise<void>[] = [];\n await customElements.whenDefined(config.tagNames.state);\n for(const element of elements) {\n const stateElement = element as State as IStateElement;\n promises.push(stateElement.initializePromise);\n }\n await Promise.all(promises);\n}\n","import { waitInitializeBinding } from \"./bindings/initializeBindingPromiseByNode\";\nimport { initializeBindings } from \"./bindings/initializeBindings\";\nimport { config } from \"./config\";\nimport { convertMustacheToComments } from \"./mustache/convertMustacheToComments\";\nimport { collectStructuralFragments } from \"./structural/collectStructuralFragments\";\nimport { waitForStateInitialize } from \"./waitForStateInitialize\";\n\nexport async function buildBindings(root: Document | ShadowRoot): Promise<void> {\n if (root === document) {\n // document配下のwcs-stateの初期化(connectedCallbackの完了)を待機する\n await waitForStateInitialize(document);\n // baindingを取得して、初期値をセットする\n convertMustacheToComments(document);\n collectStructuralFragments(document, document);\n initializeBindings(document.body, null);\n } else {\n const shadowRoot = root as ShadowRoot;\n if (shadowRoot.host.hasAttribute(config.bindAttributeName)) {\n // data-wcsを持つWebComponentは、WebComponentのbindingが完了するまで待機する。\n await waitInitializeBinding(shadowRoot.host);\n }\n // shadowRoot配下のwcs-stateの初期化(connectedCallbackの完了)を待機する\n await waitForStateInitialize(shadowRoot);\n // baindingを取得して、初期値をセットする\n convertMustacheToComments(shadowRoot);\n collectStructuralFragments(shadowRoot, shadowRoot);\n initializeBindings(shadowRoot, null);\n }\n}\n","import { getAbsoluteStateAddressByBinding } from \"./binding/getAbsoluteStateAddressByBinding\";\nimport { addBindingByAbsoluteStateAddress } from \"./binding/getBindingSetByAbsoluteStateAddress\";\nimport { setLastListValueByAbsoluteStateAddress } from \"./list/lastListValueByAbsoluteStateAddress\";\nimport { parseBindTextsForElement } from \"./bindTextParser/parseBindTextsForElement\";\nimport { ParseBindTextResult } from \"./bindTextParser/types\";\nimport { collectNodesAndBindingInfos } from \"./bindings/collectNodesAndBindingInfos\";\nimport { setBindingsByContent } from \"./bindings/bindingsByContent\";\nimport { setIndexBindingsByContent } from \"./bindings/indexBindingsByContent\";\nimport { setNodesByContent } from \"./bindings/nodesByContent\";\nimport { bindLoopContextToContent } from \"./bindings/bindLoopContextToContent\";\nimport { config } from \"./config\";\nimport { WILDCARD, INDEX_BY_INDEX_NAME } from \"./define\";\nimport { Ssr, SSR_BLOCK_START } from \"./components/Ssr\";\nimport { getStateElementByName } from \"./stateElementByName\";\nimport { raiseError } from \"./raiseError\";\nimport { setLoopContextByNode } from \"./list/loopContextByNode\";\nimport { replaceToReplaceNode } from \"./bindings/replaceToReplaceNode\";\nimport { attachEventHandler } from \"./event/handler\";\nimport { attachTwowayEventHandler } from \"./event/twowayHandler\";\nimport { attachRadioEventHandler } from \"./event/radioHandler\";\nimport { attachCheckboxEventHandler } from \"./event/checkboxHandler\";\nimport { applyChangeFromBindings } from \"./apply/applyChangeFromBindings\";\nimport { hydrateSetContent, hydrateSetLastNode } from \"./apply/applyChangeToFor\";\nimport { waitForStateInitialize } from \"./waitForStateInitialize\";\nimport { setFragmentInfoByUUID, getFragmentInfoByUUID } from \"./structural/fragmentInfoByUUID\";\nimport { setContentByNode } from \"./structural/contentsByNode\";\nimport { createContentFromNodes } from \"./structural/createContent\";\nimport { collectStructuralFragments } from \"./structural/collectStructuralFragments\";\nimport { createNotFilter } from \"./structural/createNotFilter\";\nimport { getFragmentNodeInfos } from \"./structural/getFragmentNodeInfos\";\nimport { optimizeFragment } from \"./structural/optimizeFragment\";\nimport { expandShorthandPaths } from \"./structural/expandShorthandPaths\";\nimport { createListIndex } from \"./list/createListIndex\";\nimport { IListIndex } from \"./list/types\";\nimport { setListIndexesByList } from \"./list/listIndexesByList\";\nimport { getPathInfo } from \"./address/PathInfo\";\nimport { createStateAddress } from \"./address/StateAddress\";\nimport { IBindingInfo } from \"./types\";\nimport { VERSION } from \"./version\";\n\n// ハイドレーション時にスキップするバインディングタイプ\nconst STRUCTURAL_TYPES = new Set(['for', 'if', 'elseif', 'else']);\n\n\ninterface ISsrBlock {\n type: string; // for, if, elseif, else\n uuid: string;\n path: string;\n index: number | null; // for のみ\n nodes: Node[]; // start〜end 間のノード\n}\n\n/**\n * SSR ブロック境界コメントを走査して、start〜end 間のノードを収集する\n */\nfunction collectSsrBlocks(root: Node): ISsrBlock[] {\n const blocks: ISsrBlock[] = [];\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_COMMENT);\n const startComments: Comment[] = [];\n\n // まず全コメントを収集\n while (walker.nextNode()) {\n startComments.push(walker.currentNode as Comment);\n }\n\n for (const comment of startComments) {\n const startMatch = SSR_BLOCK_START.exec(comment.data);\n if (!startMatch) continue;\n\n const type = startMatch[1];\n const info = startMatch[2]; // \"uuid:path:index\" or \"uuid:path\"\n const parts = info.split(':');\n\n let uuid: string;\n let path: string;\n let index: number | null = null;\n\n if (type === 'for') {\n // uuid:path:index\n uuid = parts[0];\n path = parts[1];\n index = parseInt(parts[2], 10);\n } else {\n // uuid:path\n uuid = parts[0];\n path = parts.slice(1).join(':');\n }\n\n // start と end の間のノードを収集\n const nodes: Node[] = [];\n let sibling = comment.nextSibling;\n const endPattern = `@@wcs-${type}-end:${info}`;\n while (sibling) {\n if (sibling.nodeType === Node.COMMENT_NODE && (sibling as Comment).data === endPattern) {\n break;\n }\n nodes.push(sibling);\n sibling = sibling.nextSibling;\n }\n\n blocks.push({ type, uuid, path, index, nodes });\n }\n\n return blocks;\n}\n\n/**\n * live DOM ノード群からバインディングを収集する。\n * ノードを一時的に DocumentFragment に移動して collectNodesAndBindingInfos を実行し、\n * 元の位置に戻す。\n */\nfunction collectBindingsFromLiveNodes(\n nodes: Node[],\n): { bindingInfos: IBindingInfo[], subscriberNodes: Node[] } {\n if (nodes.length === 0) return { bindingInfos: [], subscriberNodes: [] };\n\n // ノードの元の位置を記録\n const parent = nodes[0].parentNode;\n const nextSibling = nodes[nodes.length - 1].nextSibling;\n\n // 一時的に wrapper 要素に移動(collectNodesAndBindingInfos は Element を受け付ける)\n const wrapper = document.createElement('div');\n for (const node of nodes) {\n wrapper.appendChild(node);\n }\n\n // バインディング収集\n const [subscriberNodes, allBindings] = collectNodesAndBindingInfos(wrapper);\n\n // _initializeBindings 相当の処理\n for (const binding of allBindings) {\n replaceToReplaceNode(binding);\n if (attachEventHandler(binding)) continue;\n attachTwowayEventHandler(binding);\n attachRadioEventHandler(binding);\n attachCheckboxEventHandler(binding);\n }\n\n // 元の位置に戻す\n if (parent) {\n while (wrapper.firstChild) {\n parent.insertBefore(wrapper.firstChild, nextSibling);\n }\n }\n\n return {\n bindingInfos: allBindings,\n subscriberNodes,\n };\n}\n\n/**\n * SSR ブロックの DOM ノードを Content 化し、バインディングを登録する。\n */\nfunction hydrateBlocks(root: Node, blocks: ISsrBlock[]): void {\n // for ブロックの listIndex を UUID ごとに収集\n const listIndexesByUuid: Map<string, IListIndex[]> = new Map();\n\n for (const block of blocks) {\n if (block.nodes.length === 0) continue;\n\n const content = createContentFromNodes(block.nodes);\n\n // Content のバインディングを収集\n const { bindingInfos, subscriberNodes } = collectBindingsFromLiveNodes(block.nodes);\n\n // Content 内のノードに data-wcs-completed を付与\n // (メインの collectNodesAndBindingInfos で重複登録されないようにする)\n for (const node of subscriberNodes) {\n if (node.nodeType === Node.ELEMENT_NODE) {\n (node as Element).setAttribute('data-wcs-completed', '');\n }\n }\n setBindingsByContent(content, bindingInfos);\n setNodesByContent(content, subscriberNodes);\n\n const indexBindings: IBindingInfo[] = [];\n for (const binding of bindingInfos) {\n if (binding.statePathName in INDEX_BY_INDEX_NAME) {\n indexBindings.push(binding);\n }\n }\n setIndexBindingsByContent(content, indexBindings);\n\n if (block.type === 'for' && block.index !== null) {\n const placeholderComment = findPlaceholderComment(root, 'for', block.uuid);\n if (placeholderComment) {\n const listIndex = createListIndex(null, block.index);\n hydrateSetContent(placeholderComment, listIndex, content);\n const lastNode = block.nodes[block.nodes.length - 1];\n hydrateSetLastNode(placeholderComment, lastNode);\n setContentByNode(placeholderComment, content);\n\n // ループコンテキストをバインドし、バインディングをアドレスに登録\n const pathInfo = getPathInfo(block.path + '.' + WILDCARD);\n const stateAddress = createStateAddress(pathInfo, listIndex);\n // ILoopContext は IStateAddress + listIndex なので、stateAddress をそのまま使う\n bindLoopContextToContent(content, stateAddress as any);\n\n for (const binding of bindingInfos) {\n const absAddr = getAbsoluteStateAddressByBinding(binding);\n addBindingByAbsoluteStateAddress(absAddr, binding);\n }\n\n // listIndex を UUID ごとに収集(後で setListIndexesByList に渡す)\n let indexes = listIndexesByUuid.get(block.uuid);\n if (!indexes) {\n indexes = [];\n listIndexesByUuid.set(block.uuid, indexes);\n }\n indexes.push(listIndex);\n }\n } else {\n const placeholderComment = findPlaceholderComment(root, block.type, block.uuid);\n if (placeholderComment) {\n setContentByNode(placeholderComment, content);\n\n // バインディングをアドレスに登録\n for (const binding of bindingInfos) {\n const absAddr = getAbsoluteStateAddressByBinding(binding);\n addBindingByAbsoluteStateAddress(absAddr, binding);\n }\n }\n }\n }\n\n // for ブロックの listIndex を state のリスト値に紐づける\n for (const [uuid, indexes] of listIndexesByUuid) {\n const placeholderComment = findPlaceholderComment(root, 'for', uuid);\n if (!placeholderComment) continue;\n // state から現在のリスト値を取得して listIndexes を設定\n const rootNode = placeholderComment.getRootNode() as Node;\n // structuralBindings はまだ登録前なので、getParseBindTextResults を直接使う\n const fragmentInfo = getFragmentInfoByUUID(uuid);\n if (!fragmentInfo) continue;\n const stateName = fragmentInfo.parseBindTextResult.stateName;\n const statePathName = fragmentInfo.parseBindTextResult.statePathName;\n const stateElement = getStateElementByName(rootNode, stateName);\n if (!stateElement) continue;\n stateElement.createState(\"readonly\", (state) => {\n const list = state[statePathName];\n if (Array.isArray(list)) {\n setListIndexesByList(list, indexes);\n }\n });\n }\n}\n\nfunction findPlaceholderComment(root: Node, type: string, uuid: string): Comment | null {\n const prefix = config as any;\n const keywordMap: Record<string, string> = {\n 'for': config.commentForPrefix,\n 'if': config.commentIfPrefix,\n 'elseif': config.commentElseIfPrefix,\n 'else': config.commentElsePrefix,\n };\n const keyword = keywordMap[type];\n if (!keyword) return null;\n\n const pattern = `@@${keyword}:${uuid}`;\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_COMMENT);\n while (walker.nextNode()) {\n const comment = walker.currentNode as Comment;\n if (comment.data === pattern) {\n return comment;\n }\n }\n return null;\n}\n\n/**\n * <wcs-ssr> 内のテンプレートを fragmentInfoByUUID に復帰させる。\n */\nfunction restoreFragments(root: Document, ssrEl: Ssr): void {\n const rootNode = root as Node;\n let lastIfParseResult: ParseBindTextResult | null = null;\n\n for (const [uuid, tpl] of ssrEl.templates) {\n const bindText = tpl.getAttribute(config.bindAttributeName) || '';\n const parseBindTextResults = parseBindTextsForElement(bindText);\n let parseBindTextResult = parseBindTextResults[0];\n const bindingType = parseBindTextResult.bindingType;\n\n // else: 直前の if 条件の not → 条件反転\n // elseif: 独自条件を持つが stateName は if から引き継ぐ\n if (bindingType === 'else' && lastIfParseResult) {\n parseBindTextResult = {\n ...lastIfParseResult,\n outFilters: [...lastIfParseResult.outFilters, createNotFilter()],\n bindingType: 'else',\n };\n } else if (bindingType === 'elseif' && lastIfParseResult) {\n parseBindTextResult = {\n ...parseBindTextResult,\n stateName: lastIfParseResult.stateName,\n };\n }\n\n // if chain の追跡\n if (bindingType === 'if') {\n lastIfParseResult = parseBindTextResult;\n } else if (bindingType === 'elseif') {\n lastIfParseResult = parseBindTextResult;\n } else if (bindingType === 'else') {\n lastIfParseResult = null;\n }\n\n const fragment = document.importNode(tpl.content, true);\n const forPath = bindingType === \"for\" ? parseBindTextResult.statePathName : undefined;\n optimizeFragment(fragment);\n if (typeof forPath === \"string\") {\n expandShorthandPaths(fragment, forPath);\n }\n collectStructuralFragments(rootNode, fragment, forPath);\n\n const fragmentInfo = {\n fragment,\n parseBindTextResult,\n nodeInfos: getFragmentNodeInfos(fragment),\n };\n setFragmentInfoByUUID(uuid, rootNode, fragmentInfo);\n }\n}\n\n/**\n * SSR ハイドレーション用バインディング初期化。\n * バージョン不一致時は DOM をクリーンアップして false を返す\n * (呼び出し元で buildBindings にフォールバック)。\n */\nexport async function hydrateBindings(root: Document): Promise<boolean> {\n await waitForStateInitialize(root);\n\n // バージョン検証\n const ssrElements = root.querySelectorAll(config.tagNames.ssr);\n for (const ssrNode of ssrElements) {\n const ssrEl = ssrNode as Ssr;\n if (!ssrEl.verifyVersion()) {\n console.warn(\n `[@wcstack/state] SSR version mismatch: server=\"${ssrEl.version}\", client=\"${VERSION}\". Falling back to full render.`\n );\n Ssr.cleanupDom(root);\n return false;\n }\n }\n\n // <wcs-ssr> からテンプレートを fragmentInfoByUUID に復帰\n for (const ssrNode of ssrElements) {\n restoreFragments(root, ssrNode as Ssr);\n }\n\n // SSR ブロック境界コメントから既存 DOM を Content 化\n const blocks = collectSsrBlocks(document.body);\n hydrateBlocks(document.body, blocks);\n\n // ブロック境界コメント (start/end) を除去\n Ssr.removeBlockBoundaryComments(document.body);\n\n // <wcs-ssr> を一時除去(バインディング走査に含めない)\n const ssrParents: { el: Element, parent: Node, next: Node | null }[] = [];\n for (const el of ssrElements) {\n if (el.parentNode) {\n ssrParents.push({ el, parent: el.parentNode, next: el.nextSibling });\n el.remove();\n }\n }\n\n // 構造プレースホルダーコメント (@@wcs-for:uuid 等) は残す\n // → バインディング走査で拾われ、状態変化時の再レンダリングに使われる\n\n // SSR テキストバインディングを @@: 形式に復元\n Ssr.restoreTextBindings(document.body);\n\n // ノードとバインディングを収集\n const [subscriberNodes, allBindings] = collectNodesAndBindingInfos(document.body);\n\n // 収集完了したノードに data-wcs-completed 属性を付与\n // for ブロック内ノード(hydrateBlocks で登録済み)にはループコンテキストをリセットしない\n for (const node of subscriberNodes) {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const el = node as Element;\n if (!el.hasAttribute('data-wcs-completed')) {\n setLoopContextByNode(node, null);\n el.setAttribute('data-wcs-completed', '');\n }\n } else {\n // コメントノード等\n setLoopContextByNode(node, null);\n }\n }\n\n // バインディングを構造系とそれ以外に分離\n const normalBindings: IBindingInfo[] = [];\n const structuralBindings: IBindingInfo[] = [];\n\n for (const binding of allBindings) {\n replaceToReplaceNode(binding);\n if (attachEventHandler(binding)) {\n continue;\n }\n attachTwowayEventHandler(binding);\n attachRadioEventHandler(binding);\n attachCheckboxEventHandler(binding);\n\n if (STRUCTURAL_TYPES.has(binding.bindingType)) {\n structuralBindings.push(binding);\n } else if (binding.statePathName.includes(WILDCARD)) {\n // for ブロック内のバインディング → Content のバインディングとして登録済み\n continue;\n } else {\n normalBindings.push(binding);\n }\n }\n\n // 全バインディング(通常 + 構造)をアドレスに登録\n for (const binding of [...normalBindings, ...structuralBindings]) {\n const absoluteStateAddress = getAbsoluteStateAddressByBinding(binding);\n addBindingByAbsoluteStateAddress(absoluteStateAddress, binding);\n const rootNode = binding.replaceNode.getRootNode() as Node;\n const stateElement = getStateElementByName(rootNode, binding.stateName);\n if (stateElement === null) {\n raiseError(`State element with name \"${binding.stateName}\" not found for binding.`);\n }\n if (binding.bindingType !== 'event') {\n stateElement.setPathInfo(binding.statePathName, binding.bindingType);\n }\n }\n\n // for バインディングの lastListValue を初期値として設定\n // (次回の状態変化時に差分計算の基準になる)\n for (const binding of structuralBindings) {\n if (binding.bindingType === 'for') {\n const absAddr = getAbsoluteStateAddressByBinding(binding);\n const rootNode = binding.replaceNode.getRootNode() as Node;\n const stateElement = getStateElementByName(rootNode, binding.stateName);\n if (stateElement) {\n stateElement.createState(\"readonly\", (state) => {\n const value = state[binding.statePathName];\n if (Array.isArray(value)) {\n setLastListValueByAbsoluteStateAddress(absAddr, value);\n }\n });\n }\n }\n }\n\n // 通常バインディングのみ初回値適用(構造バインディングはSSR描画済み)\n applyChangeFromBindings(normalBindings);\n\n // <wcs-ssr> を元に戻す\n for (const { el, parent, next } of ssrParents) {\n parent.insertBefore(el, next);\n }\n\n // hydrateProps 復元\n const restoredSsrElements = root.querySelectorAll(config.tagNames.ssr);\n for (const ssrNode of restoredSsrElements) {\n const ssrEl = ssrNode as Ssr;\n const props = ssrEl.hydrateProps;\n for (const [id, propMap] of Object.entries(props)) {\n const target = root.querySelector(`[data-wcs-ssr-id=\"${id}\"]`);\n if (!target) continue;\n for (const [propName, value] of Object.entries(propMap)) {\n (target as any)[propName] = value;\n }\n }\n }\n\n // ハイドレーション中の重複登録防止用属性を除去\n const completedEls = root.querySelectorAll('[data-wcs-completed]');\n for (const el of completedEls) {\n el.removeAttribute('data-wcs-completed');\n }\n\n return true;\n}\n\n/** @internal テスト用 */\nexport const __test = {\n collectSsrBlocks,\n collectBindingsFromLiveNodes,\n hydrateBlocks,\n findPlaceholderComment,\n restoreFragments,\n};\n","import { buildBindings } from \"./buildBindings\";\nimport { hydrateBindings } from \"./hydrateBindings\";\nimport { IStateElement } from \"./components/types\";\nimport { config, inSsr } from \"./config\";\nimport { raiseError } from \"./raiseError\";\n\nconst stateElementByNameByNode: WeakMap<Node, Map<string, IStateElement>> = new WeakMap();\nconst bindingsReadyByNode: WeakMap<Node, Promise<void>> = new WeakMap();\n\nexport function getStateElementByName(rootNode:Node, name: string): IStateElement | null {\n let stateElementByName = stateElementByNameByNode.get(rootNode);\n if (!stateElementByName) {\n return null;\n }\n return stateElementByName.get(name) || null;\n}\n\n/**\n * 指定された rootNode のバインディング初期化が完了するまで待機する Promise を返す。\n */\nexport function getBindingsReady(rootNode: Node): Promise<void> {\n return bindingsReadyByNode.get(rootNode) ?? Promise.resolve();\n}\n\nexport function setStateElementByName(rootNode:Node, name: string, element: IStateElement | null): void {\n\n let stateElementByName = stateElementByNameByNode.get(rootNode);\n\n if (element === null) {\n // 削除の場合、Mapが存在しない場合は何もしない\n if (!stateElementByName) {\n return;\n }\n stateElementByName.delete(name);\n if (stateElementByName.size === 0) {\n stateElementByNameByNode.delete(rootNode);\n }\n if (config.debug) {\n console.debug(`State element unregistered: name=\"${name}\"`);\n }\n } else {\n // 登録の場合\n if (!stateElementByName) {\n stateElementByName = new Map<string, IStateElement>();\n stateElementByNameByNode.set(rootNode, stateElementByName);\n // 初めてルートノードに登録する場合\n // enable-ssr 属性があり、サーバーサイドでない場合はハイドレーション\n const enableSsr = !inSsr() && (element as unknown as Element).hasAttribute?.('enable-ssr');\n if (rootNode.constructor.name === 'HTMLDocument' || rootNode.constructor.name === 'Document') {\n const ready = new Promise<void>((resolve) => {\n queueMicrotask(async () => {\n if (enableSsr) {\n const success = await hydrateBindings(rootNode as Document);\n if (!success) {\n await buildBindings(rootNode as Document);\n }\n } else {\n await buildBindings(rootNode as Document);\n }\n resolve();\n });\n });\n bindingsReadyByNode.set(rootNode, ready);\n } else if (rootNode.constructor.name === 'ShadowRoot') {\n const ready = new Promise<void>((resolve) => {\n queueMicrotask(async () => {\n await buildBindings(rootNode as ShadowRoot);\n resolve();\n });\n });\n bindingsReadyByNode.set(rootNode, ready);\n }\n }\n if (stateElementByName.has(name)) {\n raiseError(`State element with name \"${name}\" is already registered.`);\n }\n stateElementByName.set(name, element);\n if (config.debug) {\n console.debug(`State element registered: name=\"${name}\"`, element);\n }\n }\n}\n","import { raiseError } from \"../raiseError\";\nimport { getStateElementByName } from \"../stateElementByName\";\nimport { IFragmentInfo } from \"./types\";\n\nconst fragmentInfoByUUID = new Map<string, IFragmentInfo>();\n\nexport function setFragmentInfoByUUID(uuid: string, rootNode: Node, fragmentInfo: IFragmentInfo | null): void {\n if (fragmentInfo === null) {\n fragmentInfoByUUID.delete(uuid);\n } else {\n fragmentInfoByUUID.set(uuid, fragmentInfo);\n const bindingPartial = fragmentInfo.parseBindTextResult;\n const stateElement = getStateElementByName(rootNode, bindingPartial.stateName);\n if (stateElement === null) {\n raiseError(`State element with name \"${bindingPartial.stateName}\" not found for fragment info.`);\n }\n stateElement.setPathInfo(bindingPartial.statePathName, bindingPartial.bindingType);\n for(const nodeInfo of fragmentInfo.nodeInfos) {\n for(const nodeBindingPartial of nodeInfo.parseBindTextResults) {\n const nodeStateElement = getStateElementByName(rootNode, nodeBindingPartial.stateName);\n if (nodeStateElement === null) {\n raiseError(`State element with name \"${nodeBindingPartial.stateName}\" not found for fragment info node.`);\n }\n nodeStateElement.setPathInfo(nodeBindingPartial.statePathName, nodeBindingPartial.bindingType);\n }\n }\n }\n}\n\nexport function getFragmentInfoByUUID(uuid: string): IFragmentInfo | null {\n return fragmentInfoByUUID.get(uuid) || null;\n}\n\nexport function getAllFragmentUUIDs(): string[] {\n return Array.from(fragmentInfoByUUID.keys());\n}","import { config } from \"../config\";\nimport { IState } from \"../types\";\nimport { VERSION } from \"../version\";\nimport { getAllFragmentUUIDs, getFragmentInfoByUUID } from \"../structural/fragmentInfoByUUID\";\nimport { getAllSsrPropertyNodes, getSsrProperties, clearSsrPropertyStore } from \"../apply/ssrPropertyStore\";\n\nexport interface ISsrElement {\n readonly name: string;\n readonly version: string;\n readonly stateData: IState;\n readonly templates: Map<string, HTMLTemplateElement>;\n readonly hydrateProps: Record<string, Record<string, unknown>>;\n getTemplate(uuid: string): HTMLTemplateElement | null;\n verifyVersion(): boolean;\n}\n\n// SSR コメントパターン\nconst SSR_PLACEHOLDER_COMMENT = /^@@wcs-(?:for|if|elseif|else):[^-]/;\nconst SSR_BLOCK_START = /^@@wcs-(for|if|elseif|else)-start:(.+)$/;\nconst SSR_BLOCK_END = /^@@wcs-(for|if|elseif|else)-end:(.+)$/;\nconst SSR_TEXT_START = /^@@wcs-text-start:(.+)$/;\n\nexport {\n SSR_PLACEHOLDER_COMMENT,\n SSR_BLOCK_START,\n SSR_BLOCK_END,\n SSR_TEXT_START,\n};\n\nexport class Ssr extends HTMLElement implements ISsrElement {\n private _stateData: IState | null = null;\n private _templates: Map<string, HTMLTemplateElement> | null = null;\n private _hydrateProps: Record<string, Record<string, unknown>> | null = null;\n\n get name(): string {\n return this.getAttribute('name') || 'default';\n }\n\n get version(): string {\n return this.getAttribute('version') || '';\n }\n\n get stateData(): IState {\n if (this._stateData === null) {\n this._stateData = this._loadStateData();\n }\n return this._stateData;\n }\n\n get templates(): Map<string, HTMLTemplateElement> {\n if (this._templates === null) {\n this._templates = this._loadTemplates();\n }\n return this._templates;\n }\n\n get hydrateProps(): Record<string, Record<string, unknown>> {\n if (this._hydrateProps === null) {\n this._hydrateProps = this._loadHydrateProps();\n }\n return this._hydrateProps;\n }\n\n getTemplate(uuid: string): HTMLTemplateElement | null {\n return this.templates.get(uuid) ?? null;\n }\n\n /**\n * サーバーの SSR バージョンとクライアントの state バージョンを検証する。\n * メジャー・マイナーバージョンが一致すればtrue。\n * version 属性がない場合は検証スキップ(true)。\n */\n verifyVersion(): boolean {\n const serverVersion = this.version;\n if (!serverVersion) return true;\n const serverParts = serverVersion.split('.');\n const clientParts = VERSION.split('.');\n // メジャー・マイナーが一致すれば互換\n return serverParts[0] === clientParts[0] && serverParts[1] === clientParts[1];\n }\n\n setStateData(data: IState): void {\n this._stateData = data;\n }\n\n setHydrateProps(props: Record<string, Record<string, unknown>>): void {\n this._hydrateProps = props;\n }\n\n private _loadStateData(): IState {\n const script = this.querySelector(\n `script[type=\"application/json\"]:not([data-wcs-ssr-props])`\n );\n if (!script) return {};\n try {\n return JSON.parse(script.textContent || '{}');\n } catch {\n return {};\n }\n }\n\n private _loadTemplates(): Map<string, HTMLTemplateElement> {\n const map = new Map<string, HTMLTemplateElement>();\n const templates = this.querySelectorAll<HTMLTemplateElement>('template[id]');\n for (const tpl of templates) {\n const id = tpl.getAttribute('id');\n if (id) {\n map.set(id, tpl);\n }\n }\n return map;\n }\n\n private _loadHydrateProps(): Record<string, Record<string, unknown>> {\n const script = this.querySelector('script[data-wcs-ssr-props]');\n if (!script) return {};\n try {\n return JSON.parse(script.textContent || '{}');\n } catch {\n return {};\n }\n }\n\n static findByName(root: Node, name: string): ISsrElement | null {\n const tagName = config.tagNames.ssr;\n const parentEl = root instanceof Element\n ? root\n : root instanceof Document\n ? root.documentElement\n : null;\n if (!parentEl) return null;\n const el = parentEl.querySelector(`${tagName}[name=\"${name}\"]`);\n return el as ISsrElement | null;\n }\n\n /**\n * stateData と構造テンプレート・プロパティから <wcs-ssr> の中身を構築する。\n * server パッケージの renderToString から呼ばれる。\n */\n /**\n * wcs-state 要素から $ プレフィックスや関数を除いたデータを抽出する。\n */\n static extractStateData(stateEl: Element): Record<string, any> {\n const raw = (stateEl as any).__state;\n if (!raw || typeof raw !== 'object') return {};\n const data: Record<string, any> = {};\n for (const [key, value] of Object.entries(raw)) {\n if (!key.startsWith('$') && typeof value !== 'function') {\n data[key] = value;\n }\n }\n return data;\n }\n\n static buildContent(ssrEl: Element, stateData: Record<string, any>): void {\n // 初期データ JSON\n const jsonScript = document.createElement('script');\n jsonScript.setAttribute('type', 'application/json');\n jsonScript.textContent = JSON.stringify(stateData);\n ssrEl.appendChild(jsonScript);\n\n // UUID で管理されているテンプレートを復元して格納\n const uuids = getAllFragmentUUIDs();\n for (const uuid of uuids) {\n const fragmentInfo = getFragmentInfoByUUID(uuid);\n if (!fragmentInfo) continue;\n\n const tpl = document.createElement('template');\n tpl.setAttribute('id', uuid);\n\n const bindResult = fragmentInfo.parseBindTextResult;\n const bindText = bindResult.bindingType === 'else'\n ? 'else:'\n : `${bindResult.bindingType}: ${bindResult.statePathName}`;\n tpl.setAttribute(config.bindAttributeName, bindText);\n\n const content = fragmentInfo.fragment.cloneNode(true) as DocumentFragment;\n tpl.content.appendChild(content);\n\n ssrEl.appendChild(tpl);\n }\n\n // 属性で代替不可なプロパティをハイドレーション用に格納\n const ssrNodes = getAllSsrPropertyNodes();\n if (ssrNodes.length > 0) {\n const propsData: Record<string, Record<string, unknown>> = {};\n for (let i = 0; i < ssrNodes.length; i++) {\n const node = ssrNodes[i];\n const entries = getSsrProperties(node);\n if (entries.length === 0) continue;\n const id = `wcs-ssr-${i}`;\n (node as Element).setAttribute('data-wcs-ssr-id', id);\n const props: Record<string, unknown> = {};\n for (const entry of entries) {\n props[entry.propName] = entry.value;\n }\n propsData[id] = props;\n }\n if (Object.keys(propsData).length > 0) {\n const propsScript = document.createElement('script');\n propsScript.setAttribute('type', 'application/json');\n propsScript.setAttribute('data-wcs-ssr-props', '');\n propsScript.textContent = JSON.stringify(propsData);\n ssrEl.appendChild(propsScript);\n }\n }\n\n clearSsrPropertyStore();\n }\n\n /**\n * SSR ブロック境界コメント (@@wcs-*-start/end) を除去する\n */\n static removeBlockBoundaryComments(root: Node): void {\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_COMMENT);\n const toRemove: Comment[] = [];\n while (walker.nextNode()) {\n const comment = walker.currentNode as Comment;\n if (SSR_BLOCK_START.test(comment.data) || SSR_BLOCK_END.test(comment.data)) {\n toRemove.push(comment);\n }\n }\n for (const comment of toRemove) {\n comment.remove();\n }\n }\n\n /**\n * SSR の構造プレースホルダーコメント (@@wcs-for:uuid 等) を除去する\n */\n static removeStructuralComments(root: Node): void {\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_COMMENT);\n const toRemove: Comment[] = [];\n while (walker.nextNode()) {\n const comment = walker.currentNode as Comment;\n if (SSR_PLACEHOLDER_COMMENT.test(comment.data)) {\n toRemove.push(comment);\n }\n }\n for (const comment of toRemove) {\n comment.remove();\n }\n }\n\n /**\n * SSR テキストバインディングコメントを復元する。\n * <!--@@wcs-text-start:path-->text<!--@@wcs-text-end:path-->\n * → <!--@@: path--> (バインディングシステムが認識する形式)\n */\n static restoreTextBindings(root: Node): void {\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_COMMENT);\n const startComments: { comment: Comment, path: string }[] = [];\n\n while (walker.nextNode()) {\n const comment = walker.currentNode as Comment;\n const match = SSR_TEXT_START.exec(comment.data);\n if (match) {\n startComments.push({ comment, path: match[1] });\n }\n }\n\n for (const { comment, path } of startComments) {\n const bindComment = document.createComment(`@@: ${path}`);\n comment.parentNode!.insertBefore(bindComment, comment);\n\n let sibling: Node | null = comment.nextSibling;\n comment.remove();\n\n const endPattern = `@@wcs-text-end:${path}`;\n while (sibling) {\n const next: Node | null = sibling.nextSibling;\n if (sibling.nodeType === Node.COMMENT_NODE && (sibling as Comment).data === endPattern) {\n sibling.parentNode!.removeChild(sibling);\n break;\n }\n sibling.parentNode!.removeChild(sibling);\n sibling = next;\n }\n }\n }\n\n /**\n * SSR DOM をクリーンアップし、buildBindings が動作できる状態に戻す。\n * バージョン不一致時のフォールバック用。\n *\n * 1. SSR ブロック境界コメント間のレンダリング済みノードを除去\n * 2. SSR テキストバインディングを @@: 形式に復元\n * 3. プレースホルダーコメントを <wcs-ssr> 内のテンプレートで差し替え\n * 4. data-wcs-ssr-id 属性を除去\n * 5. <wcs-ssr> を除去\n */\n static cleanupDom(root: Document): void {\n const body = document.body;\n\n // <wcs-ssr> からテンプレート UUID マップを構築(カスタム要素未定義でも動作するよう DOM 直接走査)\n const ssrElements = root.querySelectorAll(config.tagNames.ssr);\n const templateByUuid = new Map<string, HTMLTemplateElement>();\n for (const ssrNode of ssrElements) {\n const templates = ssrNode.querySelectorAll<HTMLTemplateElement>('template[id]');\n for (const tpl of templates) {\n const id = tpl.getAttribute('id');\n if (id) {\n templateByUuid.set(id, tpl);\n }\n }\n }\n\n // SSR ブロック境界コメント間のレンダリング済みノードと境界コメントを除去\n const walker1 = document.createTreeWalker(body, NodeFilter.SHOW_COMMENT);\n const startComments: Comment[] = [];\n while (walker1.nextNode()) {\n const comment = walker1.currentNode as Comment;\n if (SSR_BLOCK_START.test(comment.data)) {\n startComments.push(comment);\n }\n }\n for (const startComment of startComments) {\n const match = SSR_BLOCK_START.exec(startComment.data)!;\n const type = match[1];\n const info = match[2];\n const endPattern = `@@wcs-${type}-end:${info}`;\n let sibling = startComment.nextSibling;\n while (sibling) {\n const next = sibling.nextSibling;\n if (sibling.nodeType === Node.COMMENT_NODE && (sibling as Comment).data === endPattern) {\n sibling.remove();\n break;\n }\n sibling.remove();\n sibling = next;\n }\n startComment.remove();\n }\n\n // SSR テキストバインディングを @@: 形式に復元\n Ssr.restoreTextBindings(body);\n\n // プレースホルダーコメント (@@wcs-for:uuid 等) をテンプレートに差し替え\n const walker2 = document.createTreeWalker(body, NodeFilter.SHOW_COMMENT);\n const placeholders: { comment: Comment, uuid: string }[] = [];\n while (walker2.nextNode()) {\n const comment = walker2.currentNode as Comment;\n if (SSR_PLACEHOLDER_COMMENT.test(comment.data)) {\n const uuid = comment.data.split(':')[1];\n placeholders.push({ comment, uuid });\n }\n }\n for (const { comment, uuid } of placeholders) {\n const tpl = templateByUuid.get(uuid);\n if (tpl) {\n const restored = document.createElement('template') as HTMLTemplateElement;\n const bindAttr = tpl.getAttribute(config.bindAttributeName);\n if (bindAttr) restored.setAttribute(config.bindAttributeName, bindAttr);\n const imported = document.importNode(tpl.content, true);\n if (imported.childNodes.length > 0) {\n restored.content.appendChild(imported);\n } else {\n for (const child of Array.from(tpl.childNodes)) {\n restored.content.appendChild(document.importNode(child, true));\n }\n }\n comment.parentNode!.replaceChild(restored, comment);\n }\n }\n\n // data-wcs-ssr-id 属性を除去\n const ssrIdElements = root.querySelectorAll('[data-wcs-ssr-id]');\n for (const el of ssrIdElements) {\n el.removeAttribute('data-wcs-ssr-id');\n }\n\n // <wcs-ssr> を除去\n for (const el of ssrElements) {\n el.remove();\n }\n }\n}\n","import { IState } from \"../types\";\n\ntype ScriptModule = { default?: unknown };\n\nexport async function loadFromInnerScript(script: HTMLScriptElement, name: string): Promise<IState> {\n let scriptModule: ScriptModule | null = null;\n const uniq_comment = `\\n//# sourceURL=${name}\\n`;\n if (typeof URL.createObjectURL === 'function') {\n // Create a blob URL for the script and dynamically import it\n const blob = new Blob([script.text + uniq_comment], { type: \"application/javascript\" });\n const url = URL.createObjectURL(blob);\n try {\n scriptModule = await import(url) as ScriptModule;\n } finally {\n // Clean up blob URL to prevent memory leak\n URL.revokeObjectURL(url);\n }\n } else {\n // Fallback: Base64 encoding method (for test environment)\n // Convert script to Base64 and import via data: URL\n const b64 = btoa(String.fromCodePoint(...new TextEncoder().encode(script.text + uniq_comment)));\n scriptModule = await import(`data:application/javascript;base64,${b64}`) as ScriptModule;\n }\n return (scriptModule && typeof scriptModule.default === 'object') ? scriptModule.default as IState : {};\n}\n","import { raiseError } from \"../raiseError\";\nimport { IState } from \"../types\";\n\nexport async function loadFromScriptFile(url: string): Promise<IState> {\n try {\n const module = await import(/* @vite-ignore */ url);\n return module.default || {};\n } catch (e) {\n raiseError(`Failed to load script file: ${e}`);\n }\n}\n","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 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 if (loopContext.pathInfo.wildcardCount !== 1) {\n raiseError(`Cannot push loop context for a list with wildcard positions when there is no active loop context.`);\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","import { IStateElement } from \"../components/types\";\n\ninterface IDCCElement extends HTMLElement {\n readonly stateElement: IStateElement | null;\n}\n\nexport function getterFn(name: string) {\n return function (this: IDCCElement) {\n const stateEl = this.stateElement;\n if (!stateEl) return undefined;\n let value: any;\n try {\n stateEl.createState(\"readonly\", (state) => {\n value = state[name];\n });\n } catch {\n return undefined;\n }\n return value;\n };\n}\n\nexport function setterFn(name: string) {\n return function (this: IDCCElement, value: any) {\n const stateEl = this.stateElement;\n if (!stateEl) return;\n stateEl.initializePromise.then(() => {\n stateEl.createState(\"writable\", (state) => {\n state[name] = value;\n });\n });\n };\n}\n\nexport function callFn(name: string, isAsync: boolean) {\n if (isAsync) {\n return function (this: IDCCElement, ...args: any[]) {\n const stateEl = this.stateElement;\n if (!stateEl) return;\n return stateEl.initializePromise.then(() => {\n return stateEl.createStateAsync(\"writable\", async (state) => {\n await state[name](...args);\n });\n });\n };\n }\n return function (this: IDCCElement, ...args: any[]) {\n const stateEl = this.stateElement;\n if (!stateEl) return;\n stateEl.initializePromise.then(() => {\n stateEl.createState(\"writable\", (state) => {\n state[name](...args);\n });\n });\n };\n}\n\nexport function isInternalProperty(name: string): boolean {\n return name.startsWith(\"$\");\n}\n","/**\n * getResolvedPathInfo.ts\n *\n * Utility for parsing and generating detailed path information (IResolvedPathInfo)\n * from State property names (path strings), including wildcard and index information.\n *\n * Main responsibilities:\n * - Breaks down property names to determine presence and type of wildcards and indexes\n * - Automatically determines wildcard type: context/all/partial/none\n * - Caches by path for reusability and performance\n * - Retrieves structured path information via getStructuredPathInfo\n *\n * Design points:\n * - Caches using Map to handle reserved words like \"constructor\" and \"toString\"\n * - Flexibly determines wildcards (*) and numeric indexes, storing them in wildcardIndexes\n * - context type indicates unresolved indexes, all type indicates all resolved indexes, partial type indicates mixed\n * - ResolvedPathInfo class centralizes path parsing and information management\n */\nimport { IResolvedAddress, WildcardType } from './types';\nimport { getPathInfo } from './PathInfo';\n\n/**\n * Cache for resolved path information.\n * Uses Map to safely handle property names including reserved words like \"constructor\" and \"toString\".\n */\nconst _cache: Map<string, IResolvedAddress> = new Map();\n\n/**\n * Class that parses and stores resolved path information.\n * \n * Analyzes property path strings to extract:\n * - Path segments and their hierarchy\n * - Wildcard locations and types\n * - Numeric indexes vs unresolved wildcards\n * - Wildcard type classification (none/context/all/partial)\n */\nclass ResolvedAddress implements IResolvedAddress {\n readonly path;\n readonly segments;\n readonly paths;\n readonly wildcardCount;\n readonly wildcardType;\n readonly wildcardIndexes;\n readonly pathInfo;\n \n /**\n * Constructs resolved path information from a property path string.\n * \n * Parses the path to identify wildcards (*) and numeric indexes,\n * classifies the wildcard type, and generates structured path information.\n * \n * @param name - Property path string (e.g., \"items.*.name\" or \"data.0.value\")\n */\n constructor(path: string) {\n // Split path into individual segments\n const segments = path.split(\".\");\n const tmpPatternSegments = segments.slice();\n const paths = [];\n let incompleteCount = 0; // Count of unresolved wildcards (*)\n let completeCount = 0; // Count of resolved wildcards (numeric indexes)\n let lastPath = \"\";\n let wildcardCount = 0;\n let wildcardType: WildcardType = \"none\";\n const wildcardIndexes: (number | null)[] = [];\n \n // Process each segment to identify wildcards and indexes\n for(let i = 0; i < segments.length; i++) {\n const segment = segments[i];\n if (segment === \"*\") {\n // Unresolved wildcard\n tmpPatternSegments[i] = \"*\";\n wildcardIndexes.push(null);\n incompleteCount++;\n wildcardCount++;\n } else {\n const number = Number(segment);\n if (!Number.isNaN(number)) {\n // Numeric index - treat as resolved wildcard\n tmpPatternSegments[i] = \"*\";\n wildcardIndexes.push(number);\n completeCount++;\n wildcardCount++;\n }\n }\n // Build cumulative path array\n lastPath += segment;\n paths.push(lastPath);\n lastPath += (i < segment.length - 1 ? \".\" : \"\");\n }\n // Generate pattern string with wildcards normalized\n const structuredPath = tmpPatternSegments.join(\".\");\n const pathInfo = getPathInfo(structuredPath);\n \n // Classify wildcard type based on resolved vs unresolved counts\n if (incompleteCount > 0 || completeCount > 0) {\n if (incompleteCount === wildcardCount) {\n // All wildcards are unresolved - need context to resolve\n wildcardType = \"context\";\n } else if (completeCount === wildcardCount) {\n // All wildcards are resolved with numeric indexes\n wildcardType = \"all\";\n } else {\n // Mix of resolved and unresolved wildcards\n wildcardType = \"partial\";\n }\n }\n this.path = path;\n this.segments = segments;\n this.paths = paths;\n this.wildcardCount = wildcardCount;\n this.wildcardType = wildcardType;\n this.wildcardIndexes = wildcardIndexes;\n this.pathInfo = pathInfo;\n }\n}\n\n/**\n * Retrieves or creates resolved path information for a property path.\n * \n * This function caches resolved path information for performance.\n * On first access, it parses the path and creates a ResolvedPathInfo instance.\n * Subsequent accesses return the cached result.\n * \n * @param name - Property path string (e.g., \"items.*.name\", \"data.0.value\")\n * @returns Resolved path information containing segments, wildcards, and type classification\n */\nexport function getResolvedAddress(name:string):IResolvedAddress {\n let nameInfo: IResolvedAddress | undefined;\n // Return cached value or create, cache, and return new instance\n return _cache.get(name) ?? (_cache.set(name, nameInfo = new ResolvedAddress(name)), nameInfo);\n}","import { IAbsoluteStateAddress } from \"../address/types\";\nimport { ICacheEntry } from \"./types\";\n\nconst cacheEntryByAbsoluteStateAddress: WeakMap<IAbsoluteStateAddress, ICacheEntry> = new WeakMap();\n\nexport function getCacheEntryByAbsoluteStateAddress(\n address: IAbsoluteStateAddress\n): ICacheEntry | null {\n return cacheEntryByAbsoluteStateAddress.get(address) ?? null;\n}\n\nexport function setCacheEntryByAbsoluteStateAddress(\n address: IAbsoluteStateAddress,\n cacheEntry: ICacheEntry | null\n): void {\n if (cacheEntry === null) {\n cacheEntryByAbsoluteStateAddress.delete(address);\n } else {\n cacheEntryByAbsoluteStateAddress.set(address, cacheEntry);\n }\n}\n\nexport function dirtyCacheEntryByAbsoluteStateAddress(\n address: IAbsoluteStateAddress\n): void {\n const cacheEntry = cacheEntryByAbsoluteStateAddress.get(address);\n if (cacheEntry) {\n cacheEntry.dirty = true;\n }\n}","/**\n * getByAddress.ts\n *\n * StateClassの内部APIとして、構造化パス情報(IStructuredPathInfo)とリストインデックス(IListIndex)を指定して\n * 状態オブジェクト(target)から値を取得するための関数(getByAddress)の実装です。\n *\n * 主な役割:\n * - 指定されたパス・インデックスに対応するState値を取得(多重ループやワイルドカードにも対応)\n * - 依存関係の自動登録(checkDependencyで登録)\n * - キャッシュ機構(リストもキャッシュ対象)\n * - getter経由で値取得時はpushAddressでスコープを一時設定\n * - 存在しない場合は親pathAddressやlistIndexを辿って再帰的に値を取得\n *\n * 設計ポイント:\n * - checkDependencyで依存追跡を実行 \n * - キャッシュ有効時はstateAddressで値をキャッシュし、取得・再利用を最適化\n * - ワイルドカードや多重ループにも柔軟に対応し、再帰的な値取得を実現\n * - finallyでキャッシュへの格納を保証\n */\n\nimport { getAbsolutePathInfo } from \"../../address/AbsolutePathInfo\";\nimport { createAbsoluteStateAddress } from \"../../address/AbsoluteStateAddress\";\nimport { IStateAddress } from \"../../address/types\";\nimport { getCacheEntryByAbsoluteStateAddress, setCacheEntryByAbsoluteStateAddress } from \"../../cache/cacheEntryByAbsoluteStateAddress\";\nimport { IStateElement } from \"../../components/types\";\nimport { WILDCARD } from \"../../define\";\nimport { raiseError } from \"../../raiseError\";\nimport { IStateHandler } from \"../types\";\nimport { checkDependency } from \"./checkDependency\";\n\nfunction _getByAddress(\n target : object, \n address : IStateAddress,\n receiver : any,\n handler : IStateHandler,\n stateElement: IStateElement,\n): any {\n if (address.pathInfo.path in target) {\n // getterの中で参照の可能性があるので、addressをプッシュする\n if (stateElement.getterPaths.has(address.pathInfo.path)) {\n handler.pushAddress(address);\n try {\n return Reflect.get(target, address.pathInfo.path, receiver);\n } finally {\n handler.popAddress();\n }\n } else {\n return Reflect.get(target, address.pathInfo.path);\n }\n } else {\n const parentAddress = address.parentAddress ?? raiseError(`address.parentAddress is undefined path: ${address.pathInfo.path}`);\n const parentValue = getByAddress(target, parentAddress, receiver, handler);\n const lastSegment = address.pathInfo.segments[address.pathInfo.segments.length - 1];\n if (lastSegment === WILDCARD) {\n const index = address.listIndex?.index ?? raiseError(`address.listIndex?.index is undefined path: ${address.pathInfo.path}`);\n return Reflect.get(parentValue, index);\n } else {\n return Reflect.get(parentValue, lastSegment);\n }\n }\n}\n\nfunction _getByAddressWithCache(\n target : object, \n address : IStateAddress,\n receiver : any,\n handler : IStateHandler,\n stateElement: IStateElement\n): any {\n const absPathInfo = getAbsolutePathInfo(stateElement, address.pathInfo);\n const absAddress = createAbsoluteStateAddress(absPathInfo, address.listIndex);\n const cacheEntry = getCacheEntryByAbsoluteStateAddress(absAddress);\n if (cacheEntry !== null && cacheEntry.dirty === false) {\n return cacheEntry.value;\n }\n const value = _getByAddress(target, address, receiver, handler, stateElement);\n setCacheEntryByAbsoluteStateAddress(absAddress, {\n value: value,\n dirty: false\n });\n return value;\n}\n\nexport function getByAddress(\n target : object,\n address : IStateAddress,\n receiver : any,\n handler : IStateHandler\n): any {\n checkDependency(handler, address);\n const stateElement = handler.stateElement;\n const cacheable = address.pathInfo.wildcardCount > 0 || \n stateElement.getterPaths.has(address.pathInfo.path);\n if (cacheable) {\n return _getByAddressWithCache(target, address, receiver, handler, stateElement);\n } else {\n return _getByAddress(target, address, receiver, handler, stateElement);\n }\n}\n","import { IStateAddress } from \"../../address/types\";\nimport { IStateHandler } from \"../types\";\n\nexport function checkDependency(\n handler: IStateHandler,\n address: IStateAddress,\n): void {\n // 動的依存関係の登録\n if (handler.addressStackLength > 0) {\n const lastInfo = handler.lastAddressStack?.pathInfo ?? null;\n const stateElement = handler.stateElement;\n if (lastInfo !== null) {\n if (stateElement.getterPaths.has(lastInfo.path) &&\n lastInfo.path !== address.pathInfo.path) {\n // lastInfo.pathはgetterの名前であり、address.pathInfo.pathは\n // そのgetterが参照している値のパスである\n stateElement.addDynamicDependency(address.pathInfo.path, lastInfo.path);\n }\n }\n }\n}","/**\n * getContextListIndex.ts\n *\n * Stateの内部APIとして、現在のプロパティ参照スコープにおける\n * 指定したstructuredPath(ワイルドカード付きプロパティパス)に対応する\n * リストインデックス(IListIndex)を取得する関数です。\n *\n * 主な役割:\n * - handlerの最後にアクセスされたAddressから、指定パスに対応するリストインデックスを取得\n * - ワイルドカード階層に対応し、多重ループやネストした配列バインディングにも利用可能\n *\n * 設計ポイント:\n * - 直近のプロパティ参照情報を取得\n * - info.indexByWildcardPathからstructuredPathのインデックスを特定\n * - listIndex.at(index)で該当階層のリストインデックスを取得\n * - パスが一致しない場合や参照が存在しない場合はnullを返す\n */\n\nimport { IListIndex } from \"../../list/types\";\nimport { IStateHandler } from \"../types\";\n\nexport function getContextListIndex(\n handler: IStateHandler,\n structuredPath: string\n): IListIndex | null {\n if (handler.addressStackLength === 0) {\n return null;\n }\n const address = handler.lastAddressStack;\n if (address === null) {\n return null;\n }\n const index: number | undefined = address.pathInfo.indexByWildcardPath[structuredPath];\n if (typeof index === \"undefined\") {\n return null;\n }\n return address.listIndex?.at(index) ?? null;\n}\n","import { IAbsoluteStateAddress } from \"../address/types\";\nimport { applyChangeFromBindings } from \"../apply/applyChangeFromBindings\";\nimport { getBindingSetByAbsoluteStateAddress } from \"../binding/getBindingSetByAbsoluteStateAddress\";\nimport { IBindingInfo } from \"../types\";\n\nclass Updater {\n private _queueAbsoluteAddresses: IAbsoluteStateAddress[] = [];\n constructor() {\n }\n\n enqueueAbsoluteAddress(absoluteAddress: IAbsoluteStateAddress): void {\n const requireStartProcess = this._queueAbsoluteAddresses.length === 0;\n this._queueAbsoluteAddresses.push(absoluteAddress);\n if (requireStartProcess) {\n queueMicrotask(() => {\n const absoluteAddresses = this._queueAbsoluteAddresses;\n this._queueAbsoluteAddresses = [];\n this._applyChange(absoluteAddresses);\n });\n }\n }\n\n // テスト用に公開\n testApplyChange(absoluteAddresses: IAbsoluteStateAddress[]): void {\n this._applyChange(absoluteAddresses);\n }\n\n private _applyChange(absoluteAddresses: IAbsoluteStateAddress[]): void {\n // Note: AbsoluteStateAddress はキャッシュされているため、\n // 同一の (stateName, address) は同じインスタンスとなり、\n // Set による重複排除が正しく機能する \n const absoluteAddressSet = new Set(absoluteAddresses);\n const processBindings: IBindingInfo[] = [];\n for (const absoluteAddress of absoluteAddressSet) {\n const bindings = getBindingSetByAbsoluteStateAddress(absoluteAddress);\n for(const binding of bindings) {\n if (binding.replaceNode.isConnected === false) {\n // 切断されているバインディングは無視\n continue;\n }\n processBindings.push(binding);\n }\n }\n applyChangeFromBindings(\n processBindings\n );\n }\n\n}\n\nconst updater = new Updater();\n\nexport function getUpdater(): Updater {\n return updater;\n}\n\n// テスト用にprivateメソッドを公開\nexport const __private__ = {\n Updater,\n};\n","import { IStateAddress } from \"../../address/types\";\nimport { ISwapInfo } from \"./types\";\n\nconst swapInfoByStateAddress: WeakMap<IStateAddress, ISwapInfo> = new WeakMap();\n\nexport function getSwapInfoByAddress(address: IStateAddress): ISwapInfo | null {\n return swapInfoByStateAddress.get(address) ?? null;\n}\n\nexport function setSwapInfoByAddress(address: IStateAddress, swapInfo: ISwapInfo | null): void {\n if (swapInfo === null) {\n swapInfoByStateAddress.delete(address);\n } else {\n swapInfoByStateAddress.set(address, swapInfo);\n }\n}\n","import { getAbsolutePathInfo } from \"../address/AbsolutePathInfo\";\nimport { createAbsoluteStateAddress } from \"../address/AbsoluteStateAddress\";\nimport { calcWildcardLen } from \"../address/calcWildcardLen\";\nimport { getPathInfo } from \"../address/PathInfo\";\nimport { createStateAddress } from \"../address/StateAddress\";\nimport { IPathInfo, IStateAddress } from \"../address/types\";\nimport { IStateElement } from \"../components/types\";\nimport { config } from \"../config\";\nimport { WILDCARD } from \"../define\";\nimport { createListDiff } from \"../list/createListDiff\";\nimport { getLastListValueByAbsoluteStateAddress } from \"../list/lastListValueByAbsoluteStateAddress\";\nimport { IListDiff, IListIndex } from \"../list/types\";\nimport { getByAddressSymbol } from \"../proxy/symbols\";\nimport { IStateProxy } from \"../proxy/types\";\nimport { raiseError } from \"../raiseError\";\nimport { SearchType } from \"./types\";\n\nconst MAX_DEPENDENCY_DEPTH = 1000;\n\nfunction getIndexes(listDiff: IListDiff, searchType: SearchType): Iterable<IListIndex> {\n switch (searchType) {\n case \"old\":\n return listDiff.oldIndexes;\n case \"new\":\n return listDiff.newIndexes;\n case \"add\":\n return listDiff.addIndexSet;\n case \"change\":\n return listDiff.changeIndexSet;\n case \"delete\":\n return listDiff.deleteIndexSet;\n default: \n if (config.debug) {\n console.log(`Invalid search type: ${searchType}`);\n }\n return [];\n }\n}\n\ntype ExpandContext = {\n readonly stateName: string,\n readonly stateElement: IStateElement,\n readonly targetPathInfo: IPathInfo,\n readonly targetListIndexes: IListIndex[],\n readonly wildcardPaths: string[],\n readonly wildcardParentPaths: string[],\n readonly stateProxy: IStateProxy,\n readonly searchType: SearchType\n}\n\nfunction _walkExpandWildcard(\n context: ExpandContext, \n currentWildcardIndex: number,\n parentListIndex: IListIndex | null\n): void {\n const parentPath = context.wildcardParentPaths[currentWildcardIndex];\n const parentPathInfo = getPathInfo(parentPath);\n const parentAbsPathInfo = getAbsolutePathInfo(context.stateElement, parentPathInfo);\n const parentAddress = createStateAddress(parentPathInfo, parentListIndex);\n const parentAbsAddress = createAbsoluteStateAddress(parentAbsPathInfo, parentListIndex);\n const lastValue = getLastListValueByAbsoluteStateAddress(parentAbsAddress);\n const newValue = context.stateProxy[getByAddressSymbol](parentAddress);\n const listDiff = createListDiff(parentAddress.listIndex, lastValue, newValue);\n\n const loopIndexes = getIndexes(listDiff, context.searchType);\n if (currentWildcardIndex === context.wildcardPaths.length - 1) {\n context.targetListIndexes.push(...loopIndexes);\n } else {\n for(const listIndex of loopIndexes) {\n _walkExpandWildcard(\n context,\n currentWildcardIndex + 1,\n listIndex\n );\n }\n }\n}\n\ntype Context = {\n readonly stateName: string,\n readonly stateElement: IStateElement,\n readonly staticMap: Map<string, string[]>,\n readonly dynamicMap: Map<string, string[]>, \n readonly result: Set<IStateAddress>,\n readonly listPathSet: Set<string>,\n readonly visited: Set<IStateAddress>,\n readonly stateProxy: IStateProxy,\n readonly searchType: SearchType,\n}\n\ntype StackEntry = { address: IStateAddress, depth: number };\n\nfunction _walkDependency(\n context: Context,\n startAddress: IStateAddress,\n callback: (address: IStateAddress) => void\n): void {\n const stack: StackEntry[] = [{ address: startAddress, depth: 0 }];\n\n while (stack.length > 0) {\n const { address, depth } = stack.pop()!;\n if (depth > MAX_DEPENDENCY_DEPTH) {\n raiseError(`Maximum dependency depth of ${MAX_DEPENDENCY_DEPTH} exceeded. Possible circular dependency detected at path: ${address.pathInfo.path}`);\n }\n if (context.visited.has(address)) {\n continue;\n }\n context.visited.add(address);\n callback(address);\n const sourcePath = address.pathInfo.path;\n const nextDepth = depth + 1;\n\n // 依存アドレスを逆順でpushするための一時バッファ\n const nextEntries: StackEntry[] = [];\n\n /**\n * パスから依存関係をたどる\n * users.*.name <= users.* <= users\n * ただし、users がリストであれば users.* の依存関係は展開する\n */\n const staticDeps = context.staticMap.get(sourcePath);\n if (staticDeps) {\n for(const dep of staticDeps) {\n const depPathInfo = getPathInfo(dep);\n if (context.listPathSet.has(sourcePath) && depPathInfo.lastSegment === WILDCARD) {\n //expand indexes\n const newValue = context.stateProxy[getByAddressSymbol](address);\n const absPathInfo = getAbsolutePathInfo(context.stateElement, address.pathInfo);\n const absAddress = createAbsoluteStateAddress(absPathInfo, address.listIndex);\n const lastValue = getLastListValueByAbsoluteStateAddress(absAddress);\n const listDiff = createListDiff(address.listIndex, lastValue, newValue);\n for(const listIndex of listDiff.newIndexes) {\n const depAddress = createStateAddress(depPathInfo, listIndex);\n context.result.add(depAddress);\n nextEntries.push({ address: depAddress, depth: nextDepth });\n }\n } else {\n const depAddress = createStateAddress(depPathInfo, address.listIndex);\n context.result.add(depAddress);\n nextEntries.push({ address: depAddress, depth: nextDepth });\n }\n }\n }\n /**\n * 動的依存関係をたどる\n * 動的依存関係は、getterの実行時に決定される\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 const dynamicDeps = context.dynamicMap.get(sourcePath);\n if (dynamicDeps) {\n for(const dep of dynamicDeps) {\n const depPathInfo = getPathInfo(dep);\n const listIndexes: (IListIndex | null)[] = [];\n if (depPathInfo.wildcardCount > 0) {\n // ワイルドカードを含む依存関係の処理\n // 同じ親を持つかをパスの集合積で判定する\n // polyfills.tsにてSetのintersectionメソッドを定義している\n const wildcardLen = calcWildcardLen(address.pathInfo, depPathInfo);\n const expandable = (depPathInfo.wildcardCount - wildcardLen) >= 1;\n if (expandable) {\n let listIndex: IListIndex | null;\n if (wildcardLen > 0) {\n // categories.*.name => categories.*.products.*.categoryName\n // ワイルドカードを含む同じ親(products.*)を持つのが、\n // さらに下位にワイルドカードがあるので展開する\n if (address.listIndex === null) {\n raiseError(`Cannot expand dynamic dependency with wildcard for non-list address: ${address.pathInfo.path}`);\n }\n listIndex = address.listIndex!.at(wildcardLen - 1);\n } else {\n // selectedIndex => items.*.selected\n // 同じ親を持たない場合はnullから開始\n listIndex = null;\n }\n const expandContext: ExpandContext = {\n stateName: context.stateName,\n stateElement: context.stateElement,\n targetPathInfo: depPathInfo,\n targetListIndexes: [],\n wildcardPaths: depPathInfo.wildcardPaths,\n wildcardParentPaths: depPathInfo.wildcardParentPaths,\n stateProxy: context.stateProxy,\n searchType: context.searchType,\n };\n _walkExpandWildcard(expandContext, wildcardLen, listIndex);\n listIndexes.push(...expandContext.targetListIndexes);\n } else {\n // products.*.price => products.*.tax\n // ワイルドカードを含む同じ親(products.*)を持つので、リストインデックスは引き継ぐ\n if (address.listIndex === null) {\n raiseError(`Cannot expand dynamic dependency with wildcard for non-list address: ${address.pathInfo.path}`);\n }\n const listIndex = address.listIndex.at(wildcardLen - 1);\n listIndexes.push(listIndex);\n }\n } else {\n // products.*.tax => currentTaxRate\n // 同じ親を持たないので、リストインデックスはnull\n listIndexes.push(null);\n }\n for(const listIndex of listIndexes) {\n const depAddress = createStateAddress(depPathInfo, listIndex);\n context.result.add(depAddress);\n nextEntries.push({ address: depAddress, depth: nextDepth });\n }\n }\n }\n\n // 逆順でpushして、元の再帰と同じ探索順序を保つ\n for(let i = nextEntries.length - 1; i >= 0; i--) {\n stack.push(nextEntries[i]);\n }\n }\n}\n\nexport function walkDependency(\n stateName: string,\n stateElement: IStateElement,\n startAddress: IStateAddress,\n staticDependency: Map<string, string[]>,\n dynamicDependency: Map<string, string[]>,\n listPathSet: Set<string>,\n stateProxy: IStateProxy,\n searchType: SearchType,\n callback: (address: IStateAddress) => void\n): IStateAddress[] {\n const context: Context = {\n stateName: stateName,\n stateElement: stateElement,\n staticMap: staticDependency,\n dynamicMap: dynamicDependency,\n result: new Set<IStateAddress>(),\n listPathSet: listPathSet,\n visited: new Set<IStateAddress>(),\n stateProxy: stateProxy,\n searchType: searchType,\n };\n _walkDependency(context, startAddress, callback);\n return Array.from(context.result);\n}\n","/**\n * setByAddress.ts\n *\n * Stateの内部APIとして、アドレス情報(IStateAddress)を指定して\n * 状態オブジェクト(target)に値を設定するための関数(setByAddress)の実装です。\n *\n * 主な役割:\n * - 指定されたパス・インデックスに対応するState値を設定(多重ループやワイルドカードにも対応)\n * - getter/setter経由で値設定時はpushAddressでスコープを一時設定\n * - 存在しない場合は親pathInfoやlistIndexを辿って再帰的に値を設定\n * - 設定後はupdater.enqueueUpdateAddressで更新情報を登録\n *\n * 設計ポイント:\n * - ワイルドカードや多重ループにも柔軟に対応し、再帰的な値設定を実現\n * - finallyで必ず更新情報を登録し、再描画や依存解決に利用\n * - getter/setter経由のスコープ切り替えも考慮した設計\n */\n\nimport { createAbsoluteStateAddress } from \"../../address/AbsoluteStateAddress\";\nimport { IAbsoluteStateAddress, IStateAddress } from \"../../address/types\";\nimport { WILDCARD } from \"../../define\";\nimport { createListIndex } from \"../../list/createListIndex\";\nimport { getListIndexesByList } from \"../../list/listIndexesByList\";\nimport { raiseError } from \"../../raiseError\";\nimport { getUpdater } from \"../../updater/updater\";\nimport { IStateHandler, IStateProxy } from \"../types\";\nimport { getByAddress } from \"./getByAddress\";\nimport { getSwapInfoByAddress, setSwapInfoByAddress } from \"./swapInfo\";\nimport { walkDependency } from \"../../dependency/walkDependency\";\nimport { dirtyCacheEntryByAbsoluteStateAddress, setCacheEntryByAbsoluteStateAddress } from \"../../cache/cacheEntryByAbsoluteStateAddress\";\nimport { getAbsolutePathInfo } from \"../../address/AbsolutePathInfo\";\n\nfunction _setByAddress(\n target : object, \n address : IStateAddress,\n absAddress: IAbsoluteStateAddress,\n value : any, \n receiver : any,\n handler : IStateHandler\n): any {\n try {\n if (address.pathInfo.path in target) {\n if (handler.stateElement.setterPaths.has(address.pathInfo.path)) {\n // setterの中で参照の可能性があるので、addressをプッシュする\n handler.pushAddress(address);\n try {\n return Reflect.set(target, address.pathInfo.path, value, receiver);\n } finally {\n handler.popAddress();\n }\n } else {\n return Reflect.set(target, address.pathInfo.path, value);\n }\n } else {\n const parentAddress = address.parentAddress ?? raiseError(`address.parentAddress is undefined path: ${address.pathInfo.path}`);\n const parentValue = getByAddress(target, parentAddress, receiver, handler);\n const lastSegment = address.pathInfo.segments[address.pathInfo.segments.length - 1];\n if (lastSegment === WILDCARD) {\n const index = address.listIndex?.index ?? raiseError(`address.listIndex?.index is undefined path: ${address.pathInfo.path}`);\n return Reflect.set(parentValue, index, value);\n } else {\n return Reflect.set(parentValue, lastSegment, value);\n }\n }\n } finally {\n const updater = getUpdater();\n updater.enqueueAbsoluteAddress(absAddress);\n // 依存関係のあるキャッシュを無効化(ダーティ)、更新対象として登録\n walkDependency(\n handler.stateName,\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 if (depAddress === address) return;\n const absDepPathInfo = getAbsolutePathInfo(handler.stateElement, depAddress.pathInfo);\n const absDepAddress = createAbsoluteStateAddress(absDepPathInfo, depAddress.listIndex);\n dirtyCacheEntryByAbsoluteStateAddress(absDepAddress);\n // 更新対象として登録\n updater.enqueueAbsoluteAddress(absDepAddress);\n }\n )\n }\n}\n\nfunction _setByAddressWithSwap(\n target : object, \n address : IStateAddress,\n absAddress: IAbsoluteStateAddress,\n value : any, \n receiver : any,\n handler : IStateHandler\n) {\n // elementsの場合はswapInfoを準備\n let parentAddress = address.parentAddress ?? raiseError(`address.parentAddress is undefined path: ${address.pathInfo.path}`);\n let swapInfo = getSwapInfoByAddress(parentAddress);\n if (swapInfo === null) {\n const parentValue = getByAddress(target, parentAddress, receiver, handler) ?? [];\n const listIndexes = getListIndexesByList(parentValue) ?? [];\n swapInfo = {\n value: [...parentValue], listIndexes: [...listIndexes]\n }\n setSwapInfoByAddress(parentAddress, swapInfo);\n }\n try {\n return _setByAddress(target, address, absAddress, value, receiver, handler);\n } finally {\n const index = swapInfo.value.indexOf(value);\n const currentParentValue = getByAddress(target, parentAddress, receiver, handler) ?? [];\n const currentListIndexes = Array.isArray(currentParentValue) ? (getListIndexesByList(currentParentValue) ?? []) : [];\n const curIndex = address.listIndex!.index;\n const listIndex = (index !== -1) ? \n swapInfo!.listIndexes[index] : \n createListIndex(parentAddress.listIndex, -1);\n currentListIndexes[curIndex] = listIndex;\n // 重複チェック\n // 重複していない場合、swapが完了したとみなし、インデックスを更新\n const listValueSet = new Set(currentParentValue);\n if (listValueSet.size === swapInfo!.value.length) {\n for(let i = 0; i < currentListIndexes.length; i++) {\n currentListIndexes[i].index = i;\n }\n // 完了したのでswapInfoを削除\n setSwapInfoByAddress(parentAddress, null);\n }\n }\n}\n\nexport function setByAddress(\n target : object, \n address : IStateAddress,\n value : any, \n receiver : any,\n handler : IStateHandler\n): any {\n const stateElement = handler.stateElement;\n const isSwappable = stateElement.elementPaths.has(address.pathInfo.path);\n const cacheable = address.pathInfo.wildcardCount > 0 || \n stateElement.getterPaths.has(address.pathInfo.path);\n const absPathInfo = getAbsolutePathInfo(stateElement, address.pathInfo);\n const absAddress = createAbsoluteStateAddress(absPathInfo, address.listIndex);\n try {\n if (isSwappable) {\n return _setByAddressWithSwap(target, address, absAddress, value, receiver, handler);\n } else {\n return _setByAddress(target, address, absAddress, value, receiver, handler);\n }\n } finally {\n if (cacheable) {\n setCacheEntryByAbsoluteStateAddress(absAddress, {\n value: value,\n dirty: false\n });\n }\n // DCC bindable イベントディスパッチ\n const eventName = stateElement.bindableEventMap[address.pathInfo.path];\n if (eventName) {\n const rootNode = stateElement.rootNode;\n if (rootNode instanceof ShadowRoot) {\n rootNode.host.dispatchEvent(new CustomEvent(eventName, {\n detail: value,\n bubbles: true,\n }));\n }\n }\n }\n}\n\n","/**\n * resolve.ts\n *\n * StateClassのAPIとして、パス(path)とインデックス(indexes)を指定して\n * Stateの値を取得・設定するための関数(resolve)の実装です。\n *\n * 主な役割:\n * - 文字列パス(path)とインデックス配列(indexes)から、該当するState値の取得・設定を行う\n * - ワイルドカードや多重ループを含むパスにも対応\n * - value未指定時は取得(getByRef)、指定時は設定(setByRef)を実行\n *\n * 設計ポイント:\n * - getStructuredPathInfoでパスを解析し、ワイルドカード階層ごとにリストインデックスを解決\n * - handler.engine.getListIndexesSetで各階層のリストインデックス集合を取得\n * - getByRef/setByRefで値の取得・設定を一元的に処理\n * - 柔軟なバインディングやAPI経由での利用が可能\n */\n\nimport { getPathInfo } from \"../../address/PathInfo\";\nimport { createStateAddress } from \"../../address/StateAddress\";\nimport { getListIndexesByList } from \"../../list/listIndexesByList\";\nimport { IListIndex } from \"../../list/types\";\nimport { raiseError } from \"../../raiseError\";\nimport { getByAddress } from \"../methods/getByAddress\";\nimport { setByAddress } from \"../methods/setByAddress\";\nimport { IStateHandler } from \"../types\";\n\ntype ResolveFunction = (path: string, indexes: number[], value?: any) => any;\n\nexport function resolve(\n target: object, \n _prop: PropertyKey, \n receiver: any,\n handler: IStateHandler\n): ResolveFunction {\n return (path: string, indexes: number[], value?: any): any => {\n const pathInfo = getPathInfo(path);\n if (handler.addressStackLength > 0) {\n const lastInfo = handler.lastAddressStack?.pathInfo ?? null;\n const stateElement = handler.stateElement;\n if (lastInfo !== null && lastInfo.path !== pathInfo.path) {\n // gettersに含まれる場合は依存関係を登録\n if (stateElement.getterPaths.has(lastInfo.path)) {\n stateElement.addDynamicDependency(pathInfo.path, lastInfo.path);\n }\n }\n }\n\n if (pathInfo.wildcardParentPathInfos.length > indexes.length) {\n raiseError(`indexes length is insufficient: ${path}`);\n }\n // ワイルドカード階層ごとにListIndexを解決していく\n let listIndex: IListIndex | null = null;\n for(let i = 0; i < pathInfo.wildcardParentPathInfos.length; i++) {\n const wildcardParentPathInfo = pathInfo.wildcardParentPathInfos[i];\n const wildcardAddress = createStateAddress(wildcardParentPathInfo, listIndex);\n const tmpValue = getByAddress(target, wildcardAddress, receiver, handler);\n const listIndexes = getListIndexesByList(tmpValue);\n if (listIndexes == null) {\n raiseError(`ListIndexes not found: ${wildcardParentPathInfo.path}`);\n }\n const index = indexes[i];\n listIndex = listIndexes[index] ?? \n raiseError(`ListIndex not found: ${wildcardParentPathInfo.path}`);\n }\n\n // ToDo:WritableかReadonlyかを判定して適切なメソッドを呼び出す\n const address = createStateAddress(pathInfo, listIndex);\n const hasSetValue = typeof value !== \"undefined\";\n if (!hasSetValue) {\n return getByAddress(target, address, receiver, handler);\n } else {\n setByAddress(target, address, value, receiver, handler);\n }\n };\n} ","/**\n * getAllReadonly\n *\n * ワイルドカードを含む State パスから、対象となる全要素を配列で取得する。\n * Throws: LIST-201(インデックス未解決)、BIND-201(ワイルドカード情報不整合)\n */\n\nimport { getPathInfo } from \"../../address/PathInfo\";\nimport { createStateAddress } from \"../../address/StateAddress\";\nimport { IPathInfo, IStateAddress } from \"../../address/types\";\nimport { createListDiff } from \"../../list/createListDiff\";\nimport { IListIndex } from \"../../list/types\";\nimport { raiseError } from \"../../raiseError\";\nimport { getByAddress } from \"../methods/getByAddress\";\nimport { getContextListIndex } from \"../methods/getContextListIndex\";\nimport { IStateHandler } from \"../types\";\nimport { resolve } from \"./resolve\";\n\n// ToDo: IAbsoluteStateAddressに変更する\nconst lastValueByListAddress = new WeakMap<IStateAddress, unknown[]>();\n\ntype GetAllFunction = (path: string, indexes?: number[]) => any[];\n\nexport function getAll(\n target: object, \n prop: PropertyKey, \n receiver: any,\n handler: IStateHandler\n): GetAllFunction {\n const resolveFn = resolve(target, prop, receiver, handler);\n return (path: string, indexes?: number[]): any[] => {\n const newValueByAddress: Map<IStateAddress, any> = new Map();\n const pathInfo = getPathInfo(path);\n if (handler.addressStackLength > 0) {\n const lastInfo = handler.lastAddressStack?.pathInfo ?? null;\n const stateElement = handler.stateElement;\n if (lastInfo !== null && lastInfo.path !== pathInfo.path) {\n // gettersに含まれる場合は依存関係を登録\n if (stateElement.getterPaths.has(lastInfo.path)) {\n stateElement.addDynamicDependency(pathInfo.path, lastInfo.path);\n }\n }\n }\n \n if (typeof indexes === \"undefined\") {\n for(let i = 0; i < pathInfo.wildcardParentPathInfos.length; i++) {\n const wildcardPattern = pathInfo.wildcardParentPathInfos[i];\n const listIndex = getContextListIndex(handler, wildcardPattern.path);\n if (listIndex) {\n indexes = listIndex.indexes;\n break;\n }\n }\n if (typeof indexes === \"undefined\") {\n indexes = [];\n }\n }\n const walkWildcardPattern = (\n wildcardParentPathInfos: IPathInfo[],\n wildcardIndexPos: number,\n listIndex: IListIndex | null,\n indexes: number[],\n indexPos: number,\n parentIndexes: number[],\n results: number[][]\n ) => {\n const wildcardParentPathInfo = wildcardParentPathInfos[wildcardIndexPos] ?? null;\n if (wildcardParentPathInfo === null) {\n results.push(parentIndexes);\n return;\n }\n const wildcardAddress = createStateAddress(wildcardParentPathInfo, listIndex);\n const oldValue = lastValueByListAddress.get(wildcardAddress);\n const newValue = getByAddress(target, wildcardAddress, receiver, handler);\n const listDiff = createListDiff(listIndex, oldValue, newValue);\n const listIndexes = listDiff.newIndexes;\n const index = indexes[indexPos] ?? null;\n newValueByAddress.set(wildcardAddress, newValue);\n if (index === null) {\n for(let i = 0; i < listIndexes.length; i++) {\n const listIndex = listIndexes[i];\n walkWildcardPattern(\n wildcardParentPathInfos, \n wildcardIndexPos + 1, \n listIndex, \n indexes, \n indexPos + 1, \n parentIndexes.concat(listIndex.index),\n results);\n }\n } else {\n const listIndex = listIndexes[index] ?? \n raiseError(`ListIndex not found: ${wildcardParentPathInfo.path}`);\n if ((wildcardIndexPos + 1) < wildcardParentPathInfos.length) {\n walkWildcardPattern(\n wildcardParentPathInfos, \n wildcardIndexPos + 1, \n listIndex, \n indexes, \n indexPos + 1, \n parentIndexes.concat(listIndex.index),\n results\n );\n } else {\n // 最終ワイルドカード層まで到達しているので、結果を確定\n results.push(parentIndexes.concat(listIndex.index));\n }\n }\n }\n const resultIndexes: number[][] = [];\n walkWildcardPattern(\n pathInfo.wildcardParentPathInfos, \n 0, \n null, \n indexes, \n 0, \n [], \n resultIndexes\n );\n const resultValues: any[] = [];\n for(let i = 0; i < resultIndexes.length; i++) {\n resultValues.push(resolveFn(\n pathInfo.path,\n resultIndexes[i]\n ));\n }\n for(const [address, newValue] of newValueByAddress.entries()) {\n lastValueByListAddress.set(address, newValue);\n }\n return resultValues;\n }\n }\n","/**\n * getListIndex.ts\n *\n * StateClassの内部APIとして、パス情報(IResolvedAddress)から\n * 対応するリストインデックス(IListIndex)を取得する関数です。\n *\n * 主な役割:\n * - パスのワイルドカード種別(context/all/partial/none)に応じてリストインデックスを解決\n * - context型は現在のループコンテキストからリストインデックスを取得\n * - all型は各階層のリストインデックス集合からインデックスを辿って取得\n * - partial型やnone型は未実装またはnullを返す\n *\n * 設計ポイント:\n * - ワイルドカードや多重ループ、ネストした配列バインディングに柔軟に対応\n * - getListIndexesByListで各階層のリストインデックス集合を取得\n * - エラー時はraiseErrorで例外を投げる\n */\n\nimport { createStateAddress } from \"../../address/StateAddress\";\nimport { IResolvedAddress } from \"../../address/types\";\nimport { getListIndexesByList } from \"../../list/listIndexesByList\";\nimport { IListIndex } from \"../../list/types\";\nimport { raiseError } from \"../../raiseError\";\nimport { IStateHandler } from \"../types\";\nimport { getByAddress } from \"./getByAddress\";\nimport { getContextListIndex } from \"./getContextListIndex\";\n\nexport function getListIndex(\n target : object, \n resolvedAddress: IResolvedAddress, \n receiver: any,\n handler: IStateHandler\n): IListIndex | null {\n const pathInfo = resolvedAddress.pathInfo;\n switch (resolvedAddress.wildcardType) {\n case \"none\":\n return null;\n case \"context\": {\n const lastWildcardPath = pathInfo.wildcardPaths.at(-1) ?? \n raiseError(`lastWildcardPath is null: ${resolvedAddress.pathInfo.path}`);\n return getContextListIndex(handler, lastWildcardPath) ?? \n raiseError(`ListIndex not found: ${resolvedAddress.pathInfo.path}`);\n }\n case \"all\": {\n let parentListIndex: IListIndex | null = null;\n for(let i = 0; i < resolvedAddress.pathInfo.wildcardCount; i++) {\n const wildcardParentPathInfo = resolvedAddress.pathInfo.wildcardParentPathInfos[i] ?? \n raiseError(`wildcardParentPathInfo is null: ${resolvedAddress.pathInfo.path}`);\n const wildcardParentAddress = createStateAddress(wildcardParentPathInfo, parentListIndex);\n const wildcardParentValue = getByAddress(target, wildcardParentAddress, receiver, handler);\n const wildcardParentListIndexes: IListIndex[] = getListIndexesByList(wildcardParentValue) ?? \n raiseError( `ListIndex not found: ${wildcardParentPathInfo.path}`);\n const wildcardIndex = resolvedAddress.wildcardIndexes[i] ?? \n raiseError(`wildcardIndex is null: ${resolvedAddress.pathInfo.path}`);\n parentListIndex = wildcardParentListIndexes[wildcardIndex] ?? \n raiseError(`ListIndex not found: ${wildcardParentPathInfo.path}`);\n }\n return parentListIndex;\n }\n case \"partial\": {\n raiseError(`Partial wildcard type is not supported yet: ${resolvedAddress.pathInfo.path}`);\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\nimport { ILoopContext } from \"../../list/types\";\nimport { raiseError } from \"../../raiseError\";\nimport { IStateHandler } from \"../types\";\n\nfunction _setLoopContext<T>(\n handler: IStateHandler,\n loopContext: ILoopContext | null,\n callback: () => T\n): T {\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\nexport function setLoopContext(\n handler: IStateHandler,\n loopContext: ILoopContext | null,\n callback: () => any\n): any {\n return _setLoopContext(handler, loopContext, callback);\n}\n\nexport async function setLoopContextAsync(\n handler: IStateHandler,\n loopContext: ILoopContext | null,\n callback: () => Promise<any>\n): Promise<any> {\n return await _setLoopContext(handler, loopContext, callback);\n}\n","/**\n * get.ts\n *\n * StateClassのProxyトラップとして、プロパティアクセス時の値取得処理を担う関数(get)の実装です。\n *\n * 主な役割:\n * - 文字列プロパティの場合、特殊プロパティ($1〜$9, $resolve, $getAll, $navigate)に応じた値やAPIを返却\n * - 通常のプロパティはgetResolvedPathInfoでパス情報を解決し、getListIndexでリストインデックスを取得\n * - getByRefで構造化パス・リストインデックスに対応した値を取得\n * - シンボルプロパティの場合はhandler.callableApi経由でAPIを呼び出し\n * - それ以外はReflect.getで通常のプロパティアクセスを実行\n *\n * 設計ポイント:\n * - $1〜$9は直近のStatePropertyRefのリストインデックス値を返す特殊プロパティ\n * - $resolve, $getAll, $navigateはAPI関数やルーターインスタンスを返す\n * - 通常のプロパティアクセスもバインディングや多重ループに対応\n * - シンボルAPIやReflect.getで拡張性・互換性も確保\n */\n\nimport { getResolvedAddress } from \"../../address/ResolvedAddress\";\nimport { createStateAddress } from \"../../address/StateAddress\";\nimport { IAbsoluteStateAddress, IStateAddress } from \"../../address/types\";\nimport { INDEX_BY_INDEX_NAME } from \"../../define\";\nimport { raiseError } from \"../../raiseError\";\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 { trackDependency } from \"../apis/trackDependency\";\nimport { updatedCallback } from \"../apis/updatedCallback\";\nimport { getByAddress } from \"../methods/getByAddress\";\nimport { getListIndex } from \"../methods/getListIndex\";\nimport { setByAddress } from \"../methods/setByAddress\";\nimport { setLoopContext, setLoopContextAsync } from \"../methods/setLoopContext\";\nimport { connectedCallbackSymbol, disconnectedCallbackSymbol, getByAddressSymbol, setByAddressSymbol, setLoopContextAsyncSymbol, setLoopContextSymbol, updatedCallbackSymbol } from \"../symbols\";\nimport { IStateHandler } from \"../types\";\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 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 listIndex = handler.lastAddressStack?.listIndex;\n return listIndex?.indexes[index] ?? raiseError(`ListIndex not found: ${prop.toString()}`);\n }\n if (typeof prop === \"string\") {\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 \"$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 return (path: string, indexes: number[], 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 }\n } else {\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 }\n } else if (typeof prop === \"symbol\") {\n switch (prop) {\n case setLoopContextAsyncSymbol: {\n return (loopContext: any, callback = async (): Promise<any> => {}): Promise<any> => {\n return setLoopContextAsync(handler, loopContext, callback);\n };\n }\n case setLoopContextSymbol: {\n return (loopContext: any, callback = (): any => {}): any => {\n return setLoopContext(handler, loopContext, callback);\n };\n }\n case getByAddressSymbol: {\n return (address: IStateAddress): any => {\n return getByAddress(\n target,\n address,\n receiver,\n handler\n );\n }\n }\n case setByAddressSymbol: {\n return (address: IStateAddress, value: any): void => {\n return setByAddress(\n target,\n address,\n value,\n receiver,\n handler\n );\n }\n }\n case connectedCallbackSymbol: {\n return (): Promise<void> => {\n return connectedCallback(\n target,\n prop,\n receiver,\n handler\n );\n }\n }\n case disconnectedCallbackSymbol: {\n return (): void => {\n return disconnectedCallback(\n target,\n prop,\n receiver,\n handler\n );\n }\n }\n case updatedCallbackSymbol: {\n return (\n refs: IAbsoluteStateAddress[]\n ): unknown => {\n return updatedCallback(\n target,\n refs,\n receiver,\n handler\n );\n }\n }\n }\n\n return Reflect.get(\n target, \n prop, \n receiver\n );\n }\n}\n","import { getAbsolutePathInfo } from \"../../address/AbsolutePathInfo\";\nimport { createAbsoluteStateAddress } from \"../../address/AbsoluteStateAddress\";\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 absPathInfo = getAbsolutePathInfo(stateElement, address.pathInfo);\n const absAddress = createAbsoluteStateAddress(absPathInfo, address.listIndex);\n const updater = getUpdater();\n updater.enqueueAbsoluteAddress(absAddress);\n // 依存関係のあるキャッシュを無効化(ダーティ)、更新対象として登録\n walkDependency(\n handler.stateName,\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 absDepPathInfo = getAbsolutePathInfo(stateElement, depAddress.pathInfo);\n const absDepAddress = createAbsoluteStateAddress(absDepPathInfo, depAddress.listIndex);\n dirtyCacheEntryByAbsoluteStateAddress(absDepAddress);\n // 更新対象として登録\n updater.enqueueAbsoluteAddress(absDepAddress);\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 { 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 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 * 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 { 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 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 const pathInfo = ref.absolutePathInfo.pathInfo;\n let pathName;\n if (ref.absolutePathInfo.stateName === handler.stateName) {\n pathName = pathInfo.path;\n } else {\n pathName = pathInfo.path + \"@\" + ref.absolutePathInfo.stateName;\n }\n paths.add(pathName);\n if (pathInfo.wildcardCount > 0) {\n const indexes = ref.listIndex!.indexes ?? [];\n const indexesList = indexesListByPath[pathName];\n if (typeof indexesList === \"undefined\") {\n indexesListByPath[pathName] = [indexes];\n } else {\n indexesList.push(indexes);\n }\n }\n }\n return callback.call(receiver, Array.from(paths), indexesListByPath);\n }\n}","import { IStateAddress } from \"../address/types\";\nimport { IStateElement } from \"../components/types\";\nimport { raiseError } from \"../raiseError\";\nimport { getStateElementByName } 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\nclass StateHandler implements IStateHandler {\n private _stateElement: IStateElement;\n private _stateName: string;\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 \n constructor(\n rootNode: Node,\n stateName: string,\n mutability: Mutability\n ) {\n this._stateName = stateName;\n const stateElement = getStateElementByName(rootNode, this._stateName);\n if (stateElement === null) {\n raiseError(`StateHandler: State element with name \"${this._stateName}\" not found.`);\n }\n this._stateElement = stateElement;\n this._mutability = mutability;\n }\n\n get stateName(): string {\n return this._stateName;\n }\n\n get stateElement(): IStateElement {\n return this._stateElement;\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 this._addressStackIndex++;\n if (this._addressStackIndex >= MAX_LOOP_DEPTH) {\n raiseError(`Exceeded maximum address stack depth of ${MAX_LOOP_DEPTH}. Possible infinite loop.`);\n }\n this._addressStack[this._addressStackIndex] = address;\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(\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 if (this._mutability === \"readonly\") {\n raiseError(`State \"${this._stateName}\" is readonly.`);\n }\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 stateName: string,\n mutability: Mutability\n): IStateProxy {\n const handler = new StateHandler(rootNode, stateName, 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// WebComponent専用のキャッシュ\n// outerState.tsからのアクセスで、これを返す\n\nimport { IAbsoluteStateAddress } from \"../address/types\";\n\nconst lastValueByAbsoluteStateAddress: WeakMap<IAbsoluteStateAddress, any> = new WeakMap();\n\nexport function setLastValueByAbsoluteStateAddress(absoluteStateAddress: IAbsoluteStateAddress, value: any): void {\n lastValueByAbsoluteStateAddress.set(absoluteStateAddress, value);\n}\n\nexport function getLastValueByAbsoluteStateAddress(absoluteStateAddress: IAbsoluteStateAddress): any {\n return lastValueByAbsoluteStateAddress.get(absoluteStateAddress);\n}\n","import { IStateElement } from \"../components/types\";\n\nconst stateElementByWebComponent: WeakMap<Element, Map<string, IStateElement>> = new WeakMap();\n\nexport function setStateElementByWebComponent(webComponent: Element, stateName: string, stateElement: IStateElement): void {\n let stateMap = stateElementByWebComponent.get(webComponent);\n if (!stateMap) {\n stateMap = new Map();\n stateElementByWebComponent.set(webComponent, stateMap);\n }\n stateMap.set(stateName, stateElement);\n}\n\nexport function getStateElementByWebComponent(webComponent: Element, stateName: string): IStateElement | null {\n const stateMap = stateElementByWebComponent.get(webComponent);\n if (!stateMap) {\n return null;\n }\n return stateMap.get(stateName) ?? null;\n}","import { getAbsolutePathInfo } from \"../address/AbsolutePathInfo\";\nimport { getPathInfo } from \"../address/PathInfo\";\nimport { IAbsolutePathInfo } from \"../address/types\";\nimport { getAbsoluteStateAddressByBinding } from \"../binding/getAbsoluteStateAddressByBinding\";\nimport { IBindingInfo } from \"../binding/types\";\nimport { addBindingByNode } from \"../bindings/getBindingsByNode\";\nimport { IStateElement } from \"../components/types\";\nimport { DELIMITER } from \"../define\";\nimport { raiseError } from \"../raiseError\";\nimport { getStateElementByName } from \"../stateElementByName\";\nimport { getStateElementByWebComponent } from \"./stateElementByWebComponent\";\n\nexport interface IMappingRule {\n innerAbsPathInfo: IAbsolutePathInfo;\n outerAbsPathInfo: IAbsolutePathInfo;\n}\n\nconst innerMappingByElement: WeakMap<Element, Map<IAbsolutePathInfo, IAbsolutePathInfo>> = new WeakMap();\nconst outerMappingByElement: WeakMap<Element, Map<IAbsolutePathInfo, IAbsolutePathInfo>> = new WeakMap();\nconst primaryMappingRuleSetByElement: WeakMap<Element, Set<IMappingRule>> = new WeakMap();\nconst primaryBindingByMappingRule: WeakMap<IMappingRule, IBindingInfo> = new WeakMap();\n\nfunction createMappingRuleByBinding(innerState: IStateElement, binding: IBindingInfo): IMappingRule {\n const innerPathInfo = getPathInfo(binding.propSegments.slice(1).join(DELIMITER));\n const innerAbsPathInfo = getAbsolutePathInfo(innerState, innerPathInfo);\n const outerAbsStateAddress = getAbsoluteStateAddressByBinding(binding);\n const outerAbsPathInfo = outerAbsStateAddress.absolutePathInfo;\n return { innerAbsPathInfo, outerAbsPathInfo };\n}\n\nexport function buildPrimaryMappingRule(webComponent: Element, stateName: string, bindings: IBindingInfo[]): void {\n if (bindings.length === 0) {\n return;\n }\n const innerState = getStateElementByWebComponent(webComponent, stateName);\n if (innerState === null) {\n raiseError('State element not found for web component.');\n }\n const innerMappingRule = new Map<IAbsolutePathInfo, IAbsolutePathInfo>();\n const outerMappingRule = new Map<IAbsolutePathInfo, IAbsolutePathInfo>();\n for (const binding of bindings) {\n const mappingRule = createMappingRuleByBinding(innerState, binding);\n let primaryMappingRuleSet = primaryMappingRuleSetByElement.get(webComponent);\n if (typeof primaryMappingRuleSet === 'undefined') {\n primaryMappingRuleSetByElement.set(webComponent, new Set([mappingRule]));\n } else {\n primaryMappingRuleSet.add(mappingRule);\n }\n const innerAbsPathInfo = mappingRule.innerAbsPathInfo;\n const outerAbsPathInfo = mappingRule.outerAbsPathInfo;\n primaryBindingByMappingRule.set(mappingRule, binding);\n innerMappingRule.set(innerAbsPathInfo, outerAbsPathInfo);\n outerMappingRule.set(outerAbsPathInfo, innerAbsPathInfo);\n }\n innerMappingByElement.set(webComponent, innerMappingRule);\n outerMappingByElement.set(webComponent, outerMappingRule);\n}\n\nexport function getInnerAbsolutePathInfo(webComponent: Element, outerAbsPathInfo: IAbsolutePathInfo): IAbsolutePathInfo | null {\n const mapping = outerMappingByElement.get(webComponent);\n if (typeof mapping === 'undefined') {\n return null;\n }\n return mapping.get(outerAbsPathInfo) ?? null;\n}\n\nexport function getOuterAbsolutePathInfo(webComponent: Element, innerAbsPathInfo: IAbsolutePathInfo): IAbsolutePathInfo | null {\n let innerMapping = innerMappingByElement.get(webComponent);\n if (typeof innerMapping === 'undefined') {\n innerMapping = new Map<IAbsolutePathInfo, IAbsolutePathInfo>();\n innerMappingByElement.set(webComponent, innerMapping);\n }\n if (innerMapping.has(innerAbsPathInfo)) {\n return innerMapping.get(innerAbsPathInfo)!\n }\n let outerMapping = outerMappingByElement.get(webComponent);\n if (typeof outerMapping === 'undefined') {\n outerMapping = new Map<IAbsolutePathInfo, IAbsolutePathInfo>();\n outerMappingByElement.set(webComponent, outerMapping);\n }\n // 内側からのアクセスの場合、ルールがなければプライマリルールから新たにルールとバインディングを生成する\n const primaryMappingRuleSet = primaryMappingRuleSetByElement.get(webComponent);\n if (typeof primaryMappingRuleSet === 'undefined') {\n // マッピングルールが存在しない場合はnullを返し、ローカル状態へのフォールバックを許可する\n return null;\n }\n let primaryMappingRule: IMappingRule | null = null;\n for(const currentPrimaryMappingRule of primaryMappingRuleSet) {\n // innerPathInfoがprimaryMappingRuleのinnerPathInfoを包含しているか\n if (!innerAbsPathInfo.pathInfo.cumulativePathInfoSet.has(currentPrimaryMappingRule.innerAbsPathInfo.pathInfo)) {\n continue;\n }\n if (currentPrimaryMappingRule.innerAbsPathInfo.pathInfo.segments.length === innerAbsPathInfo.pathInfo.segments.length) {\n raiseError('Duplicate mapping rule for web component.');\n }\n primaryMappingRule = currentPrimaryMappingRule;\n break;\n }\n if (primaryMappingRule === null) {\n // マッピングルールに一致しない場合はnullを返し、ローカル状態へのフォールバックを許可する\n return null;\n }\n // マッチした残りのパスをouterPathInfoに付与して新たなルールを生成\n const primaryBinding = primaryBindingByMappingRule.get(primaryMappingRule);\n /* c8 ignore start */\n if (typeof primaryBinding === 'undefined') {\n raiseError('Binding not found for primary mapping rule on web component.');\n }\n /* c8 ignore stop */\n const outerRemainingSegments = innerAbsPathInfo.pathInfo.segments.slice(primaryMappingRule.innerAbsPathInfo.pathInfo.segments.length);\n const outerSegments = primaryMappingRule.outerAbsPathInfo.pathInfo.segments.concat(outerRemainingSegments);\n const outerPathInfo = getPathInfo(outerSegments.join(DELIMITER));\n const rootNode = webComponent.getRootNode() as Node;\n const outerStateElement = getStateElementByName(rootNode, primaryBinding.stateName);\n if (outerStateElement === null) {\n raiseError(`State element with name \"${primaryBinding.stateName}\" not found for web component.`);\n }\n const outerAbsPathInfo = getAbsolutePathInfo(outerStateElement, outerPathInfo);\n innerMapping.set(innerAbsPathInfo, outerAbsPathInfo);\n outerMapping.set(outerAbsPathInfo, innerAbsPathInfo);\n\n // ルールに対応するバインディングを生成\n const newBinding: IBindingInfo = {\n ...primaryBinding,\n propName: innerAbsPathInfo.pathInfo.path,\n propSegments: innerAbsPathInfo.pathInfo.segments,\n statePathName: outerAbsPathInfo.pathInfo.path,\n statePathInfo: outerAbsPathInfo.pathInfo,\n }\n addBindingByNode(webComponent, newBinding);\n\n return outerAbsPathInfo;\n}","\nfunction cloneWithDescriptors(obj: object) {\n const proto = Object.getPrototypeOf(obj);\n const clone = Object.create(proto);\n const descriptors = Object.getOwnPropertyDescriptors(obj);\n for(const key in descriptors) {\n const descriptor = descriptors[key];\n if (descriptor.writable === false) {\n descriptor.writable = true;\n }\n }\n Object.defineProperties(clone, descriptors);\n return clone;\n}\n\nexport function meltFrozenObject(frozenObj: object) {\n return cloneWithDescriptors(frozenObj);\n}","import { getAbsolutePathInfo } from \"../address/AbsolutePathInfo\";\nimport { createAbsoluteStateAddress } from \"../address/AbsoluteStateAddress\";\nimport { getPathInfo } from \"../address/PathInfo\";\nimport { IStateElement } from \"../components/types\";\nimport { getLoopContextByNode } from \"../list/loopContextByNode\";\nimport { IListIndex } from \"../list/types\";\nimport { setLoopContextSymbol } from \"../proxy/symbols\";\nimport { raiseError } from \"../raiseError\";\nimport { setLastValueByAbsoluteStateAddress } from \"./lastValueByAbsoluteStateAddress\";\nimport { getOuterAbsolutePathInfo } from \"./MappingRule\";\nimport { meltFrozenObject } from \"./meltFrozenObject\";\nimport { getStateElementByWebComponent } from \"./stateElementByWebComponent\";\nimport { IInnerState } from \"./types\";\n\nclass InnerStateProxyHandler implements ProxyHandler<IInnerState> {\n private _webComponent: Element;\n private _innerStateElement: IStateElement;\n constructor(webComponent: Element, stateName: string) {\n this._webComponent = webComponent;\n this._innerStateElement = getStateElementByWebComponent(webComponent, stateName) ?? raiseError('State element not found for web component.');\n }\n\n get(target: IInnerState, prop: string | symbol, receiver: any): any {\n if (typeof prop === 'string') {\n if (prop === \"then\") {\n // Promiseのthenと誤認識されるのを防ぐため、Promiseに存在するプロパティはProxyのgetで処理しない\n return undefined;\n }\n if (prop[0] === '$') {\n return undefined;\n }\n // 1. getter完全一致 → ローカル計算(this = receiverで依存自動追跡)\n if (this._innerStateElement.getterPaths.has(prop) && prop in target) {\n return Reflect.get(target, prop, receiver);\n }\n // 2 & 3. マッピング完全一致 / サブパス → 親の状態\n const innerPathInfo = getPathInfo(prop);\n const innerAbsPathInfo = getAbsolutePathInfo(this._innerStateElement, innerPathInfo);\n const outerAbsPathInfo = getOuterAbsolutePathInfo(this._webComponent, innerAbsPathInfo);\n if (outerAbsPathInfo !== null) {\n const loopContext = getLoopContextByNode(this._webComponent);\n let value = undefined;\n outerAbsPathInfo.stateElement.createState(\"readonly\", (state) => {\n state[setLoopContextSymbol](loopContext, () => {\n value = state[outerAbsPathInfo.pathInfo.path];\n let listIndex: IListIndex | null = null;\n if (loopContext !== null && loopContext.listIndex !== null) {\n if (outerAbsPathInfo.pathInfo.wildcardCount > 0) {\n // wildcardPathSetとloopContextのpathInfoSetのintersectionのうち、segment数が最も多いものをouterAbsPathInfoにする\n // 例: outerPathInfoが \"todos.*.name\"で、loopContextのpathInfoSetに \"todos.0.name\", \"todos.1.name\"がある場合、\"todos.0.name\"や\"todos.1.name\"をouterAbsPathInfoにする\n listIndex = loopContext.listIndex.at(outerAbsPathInfo.pathInfo.wildcardCount - 1);\n }\n }\n const absStateAddress = createAbsoluteStateAddress(outerAbsPathInfo, listIndex);\n setLastValueByAbsoluteStateAddress(absStateAddress, value);\n });\n });\n return value;\n }\n // 4. ローカルデータプロパティ → ローカル値\n if (prop in target) {\n return Reflect.get(target, prop, receiver);\n }\n // 5. エラー\n raiseError(`Property \"${prop}\" not found in inner state: no mapping rule and no local state property.`);\n } else {\n return Reflect.get(target, prop, receiver);\n }\n }\n\n set(target: IInnerState, prop: string | symbol, value: any, receiver: any): boolean {\n if (typeof prop === 'string') {\n // 1. setter完全一致 → ローカル処理(this = receiverで親への書き込み可能)\n if (this._innerStateElement.setterPaths.has(prop) && prop in target) {\n return Reflect.set(target, prop, value, receiver);\n }\n // 2 & 3. マッピング完全一致 / サブパス → 親に書く\n const innerPathInfo = getPathInfo(prop);\n const innerAbsPathInfo = getAbsolutePathInfo(this._innerStateElement, innerPathInfo);\n const outerAbsPathInfo = getOuterAbsolutePathInfo(this._webComponent, innerAbsPathInfo);\n if (outerAbsPathInfo !== null) {\n const loopContext = getLoopContextByNode(this._webComponent);\n outerAbsPathInfo.stateElement.createState(\"writable\", (state) => {\n state[setLoopContextSymbol](loopContext, () => {\n state[outerAbsPathInfo.pathInfo.path] = value;\n });\n });\n return true;\n }\n // 4. ローカルデータプロパティ → ローカルに書く\n if (prop in target) {\n return Reflect.set(target, prop, value, receiver);\n }\n // 5. エラー\n raiseError(`Property \"${prop}\" not found in inner state: no mapping rule and no local state property.`);\n } else {\n return Reflect.set(target, prop, value, receiver);\n }\n }\n\n has(target: IInnerState, prop: string | symbol): boolean {\n if (typeof prop === 'string') {\n if (prop[0] === '$') {\n return false;\n }\n // 1. getter/setter完全一致\n if ((this._innerStateElement.getterPaths.has(prop) || this._innerStateElement.setterPaths.has(prop)) && prop in target) {\n return true;\n }\n // 2 & 3. マッピング\n const innerPathInfo = getPathInfo(prop);\n const innerAbsPathInfo = getAbsolutePathInfo(this._innerStateElement, innerPathInfo);\n const outerAbsPathInfo = getOuterAbsolutePathInfo(this._webComponent, innerAbsPathInfo);\n if (outerAbsPathInfo !== null) {\n return true;\n }\n // 4. ローカルデータ\n if (prop in target) {\n return true;\n }\n // 5. 存在しない\n return false;\n } else {\n return Reflect.has(target, prop);\n }\n }\n\n}\n\nexport function createInnerState(webComponent: Element, stateName: string): IInnerState {\n const handler = new InnerStateProxyHandler(webComponent, stateName);\n const innerState = getStateElementByWebComponent(webComponent, stateName);\n /* c8 ignore start */\n if (innerState === null) {\n raiseError('State element not found for web component.');\n }\n /* c8 ignore stop */\n if (innerState.boundComponentStateProp === null) {\n raiseError('State element is not bound to any component state prop.');\n }\n if (!(innerState.boundComponentStateProp in webComponent)) {\n raiseError(`State element is not bound to a valid component state prop: ${innerState.boundComponentStateProp}`);\n }\n const state = (webComponent as any)[innerState.boundComponentStateProp];\n if (typeof state !== 'object' || state === null) {\n raiseError(`Invalid state object for component state prop: ${innerState.boundComponentStateProp}`);\n }\n return new Proxy(meltFrozenObject(state), handler);\n}","import { getAbsolutePathInfo } from \"../address/AbsolutePathInfo\";\nimport { createAbsoluteStateAddress } from \"../address/AbsoluteStateAddress\";\nimport { getPathInfo } from \"../address/PathInfo\";\nimport { IStateElement } from \"../components/types\";\nimport { raiseError } from \"../raiseError\";\nimport { getLastValueByAbsoluteStateAddress } from \"./lastValueByAbsoluteStateAddress\";\nimport { getStateElementByWebComponent } from \"./stateElementByWebComponent\";\nimport { IOuterState } from \"./types\";\n\nclass OuterStateProxyHandler implements ProxyHandler<IOuterState> {\n private _innerStateElement: IStateElement;\n constructor(webComponent: Element, stateName: string) {\n this._innerStateElement = getStateElementByWebComponent(webComponent, stateName) ?? raiseError('State element not found for web component.');\n }\n\n get(target: IOuterState, prop: string | symbol, receiver: any): any {\n if (typeof prop === 'string') {\n const innerPathInfo = getPathInfo(prop);\n const innerAbsPathInfo = getAbsolutePathInfo(this._innerStateElement, innerPathInfo);\n const absStateAddress = createAbsoluteStateAddress(innerAbsPathInfo, null);\n return getLastValueByAbsoluteStateAddress(absStateAddress);\n } else {\n return Reflect.get(target, prop, receiver);\n }\n }\n\n set(target: IOuterState, prop: string | symbol, value: any, receiver: any): boolean {\n if (typeof prop === 'string') {\n const innerPathInfo = getPathInfo(prop);\n const innerAbsPathInfo = getAbsolutePathInfo(this._innerStateElement, innerPathInfo);\n this._innerStateElement.createState(\"readonly\", (state) => {\n state.$postUpdate(innerAbsPathInfo.pathInfo.path);\n });\n return true;\n } else {\n return Reflect.set(target, prop, value, receiver);\n }\n }\n}\n\nexport function createOuterState(webComponent: Element, stateName: string): IOuterState {\n const handler = new OuterStateProxyHandler(webComponent, stateName);\n return new Proxy({}, handler);\n}\n","import { IStateElement } from \"../components/types\";\nimport { raiseError } from \"../raiseError\";\nimport { getStateElementByWebComponent } from \"./stateElementByWebComponent\";\nimport { IOuterState } from \"./types\";\n\nclass PlainOuterStateProxyHandler implements ProxyHandler<IOuterState> {\n private _innerStateElement: IStateElement;\n constructor(webComponent: Element, stateName: string) {\n this._innerStateElement = getStateElementByWebComponent(webComponent, stateName) ?? raiseError('State element not found for web component.');\n }\n\n get(target: IOuterState, prop: string | symbol, receiver: any): any {\n if (typeof prop === 'string') {\n let value;\n this._innerStateElement.createState(\"readonly\", (state) => {\n value = state[prop];\n });\n return value;\n } else {\n return Reflect.get(target, prop, receiver);\n }\n }\n\n set(target: IOuterState, prop: string | symbol, value: any, receiver: any): boolean {\n if (typeof prop === 'string') {\n this._innerStateElement.createState(\"writable\", (state) => {\n state[prop] = value;\n });\n return true;\n } else {\n return Reflect.set(target, prop, value, receiver);\n }\n }\n}\n\nexport function createPlainOuterState(webComponent: Element, stateName: string): IOuterState {\n const handler = new PlainOuterStateProxyHandler(webComponent, stateName);\n return new Proxy({}, handler);\n}\n","import { getBindingsByNode } from \"../bindings/getBindingsByNode\";\nimport { IStateElement } from \"../components/types\";\nimport { config } from \"../config\";\nimport { WEBCOMPONENT_STATE_READY_CALLBACK_NAME } from \"../define\";\nimport { raiseError } from \"../raiseError\";\nimport { markWebComponentAsComplete } from \"./completeWebComponent\";\nimport { createInnerState } from \"./innerState\";\nimport { buildPrimaryMappingRule } from \"./MappingRule\";\nimport { meltFrozenObject } from \"./meltFrozenObject\";\nimport { createOuterState } from \"./outerState\";\nimport { createPlainOuterState } from \"./plainOuterState\";\nimport { setStateElementByWebComponent } from \"./stateElementByWebComponent\";\nimport { IOuterState } from \"./types\";\n\nconst getOuter = (outerState: IOuterState) => (): IOuterState => outerState;\n\nexport function bindWebComponent(\n innerStateElement: IStateElement,\n component: Element,\n stateProp: string,\n state: Record<string, any>\n): void {\n setStateElementByWebComponent(component, stateProp, innerStateElement);\n if (component.hasAttribute(config.bindAttributeName)) {\n const bindings = (getBindingsByNode(component) ?? []).filter(\n binding => binding.propSegments[0] === stateProp\n );\n buildPrimaryMappingRule(component, stateProp, bindings);\n const outerState = createOuterState(component, stateProp);\n const innerState = createInnerState(component, stateProp);\n innerStateElement.setInitialState(innerState);\n Object.defineProperty(component, stateProp, {\n get: getOuter(outerState),\n enumerable: true,\n configurable: true,\n });\n } else {\n innerStateElement.setInitialState(meltFrozenObject(state));\n const outerState = createPlainOuterState(component, stateProp);\n Object.defineProperty(component, stateProp, {\n get: getOuter(outerState),\n enumerable: true,\n configurable: true,\n });\n }\n markWebComponentAsComplete(component, innerStateElement);\n if (WEBCOMPONENT_STATE_READY_CALLBACK_NAME in component) {\n const func = (component as any)[WEBCOMPONENT_STATE_READY_CALLBACK_NAME];\n if (typeof func === 'function') {\n func.call(component, stateProp).catch((error: any) => {\n raiseError(`Error in ${WEBCOMPONENT_STATE_READY_CALLBACK_NAME}: ${error instanceof Error ? error.message : String(error)}`);\n });\n } else {\n raiseError(`${WEBCOMPONENT_STATE_READY_CALLBACK_NAME} is not a function.`);\n }\n }\n}\n","import { config, inSsr } 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 { setStateElementByName, getBindingsReady } 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, WILDCARD } from \"../define\";\nimport { defineDCC } from \"../dcc/defineDCC\";\nimport { getPathInfo } from \"../address/PathInfo\";\nimport { IStateProxy, Mutability } from \"../proxy/types\";\nimport { createStateProxy } from \"../proxy/StateHandler\";\nimport { bindWebComponent } from \"../webComponent/bindWebComponent\";\nimport { connectedCallbackSymbol, disconnectedCallbackSymbol } from \"../proxy/symbols\";\nimport { waitInitializeBinding } from \"../bindings/initializeBindingPromiseByNode\";\nimport { getCustomElement } from \"../getCustomElement\";\nimport { Ssr } from \"./Ssr\";\nimport { VERSION } from \"../version\";\n\ntype Descriptors = Record<string, PropertyDescriptor>;\n\nfunction getAllPropertyDescriptors(obj: object): Descriptors {\n let descriptors: Descriptors = {};\n let proto = obj;\n while (proto && proto !== Object.prototype) {\n Object.assign(descriptors, Object.getOwnPropertyDescriptors(proto));\n proto = Object.getPrototypeOf(proto);\n }\n return descriptors;\n}\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 HTMLElement implements IStateElement {\n static hasConnectedCallbackPromise = true;\n\n static getBindingsReady(rootNode: Node): Promise<void> {\n return getBindingsReady(rootNode);\n }\n\n private __state: IState | undefined;\n private _name: string = 'default';\n private _initialized: 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 _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 _elementPaths: Set<string> = new Set<string>();\n private _getterPaths: Set<string> = new Set<string>();\n private _setterPaths: Set<string> = new Set<string>();\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 private _version = 0;\n private _rootNode: Node | null = null;\n private _boundComponent: Element | null = null;\n private _boundComponentStateProp: string | null = null;\n private _bindableEventMap: Record<string, string> = {};\n\n constructor() {\n super();\n this._initializePromise = new Promise<void>((resolve) => {\n this._resolveInitialize = resolve;\n });\n this._connectedCallbackPromise = new Promise<void>((resolve) => {\n this._resolveConnectedCallback = resolve;\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 this.__state = value;\n this._listPaths.clear();\n this._elementPaths.clear();\n this._getterPaths.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 this._resolveLoading?.();\n }\n\n get name(): string {\n return this._name;\n }\n\n private _loadFromSsrElement(): IState | null {\n if (!this.hasAttribute('enable-ssr')) return null;\n const name = this.getAttribute('name') || 'default';\n const root = this.parentNode;\n if (!root) return null;\n const ssrEl = Ssr.findByName(root, name);\n if (!ssrEl) return null;\n const data = ssrEl.stateData;\n return Object.keys(data).length > 0 ? data : null;\n }\n\n private async _initialize() {\n // enable-ssr (クライアント側のみ): <wcs-ssr> から初期データを取得\n const ssrState = !inSsr() ? this._loadFromSsrElement() : null;\n try {\n if (this.hasAttribute('state')) {\n const state = this.getAttribute('state');\n this._state = loadFromScriptJson(state!);\n } else if (this.hasAttribute('src')) {\n const src = this.getAttribute('src');\n if (src && src.endsWith('.json')) {\n this._state = await loadFromJsonFile(src);\n } else if (src && src.endsWith('.js')) {\n this._state = 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 this._state = JSON.parse(json!);\n } else {\n const script = this.querySelector<HTMLScriptElement>('script[type=\"module\"]');\n if (script) {\n this._state = await loadFromInnerScript(script, `${this._name}`);\n } else {\n const timerId = setTimeout(() => {\n console.warn(`[@wcstack/state] Warning: No state source found for <${config.tagNames.state}> element with name=\"${this._name}\".`);\n }, NO_SET_TIMEOUT);\n // 要注意!!!APIでセットする場合はここで待機する必要がある --(1)\n this._state = await this._setStatePromise!;\n clearTimeout(timerId);\n }\n }\n } catch(e) {\n raiseError(`Failed to initialize state: ${e}`);\n }\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 this._name = this.getAttribute('name') || 'default';\n setStateElementByName(this.rootNode!, this._name, this);\n }\n\n private async _initializeBindWebComponent() {\n if (this.hasAttribute(\"bind-component\")) {\n // wcs-stateはコンポーネントのトップレベル要素であること\n // ShadowDOM直下: parentNodeがShadowRoot → hostが親コンポーネント\n // LightDOM/ShadowDOM内のLightDOM: parentNodeがElement → それが親コンポーネント\n const parentNode = this.parentNode;\n const boundComponent = parentNode instanceof ShadowRoot\n ? parentNode.host\n : parentNode instanceof Element\n ? parentNode\n : null;\n const customTagName = boundComponent ? getCustomElement(boundComponent) : null;\n if (boundComponent === null || customTagName === null) {\n raiseError(`\"bind-component\" requires <${config.tagNames.state}> to be a direct child of a custom element.`);\n }\n // LightDOMの場合、名前空間が上位スコープと共有されるためnameが必須\n if (!(parentNode instanceof ShadowRoot) && !this.hasAttribute(\"name\")) {\n raiseError(`\"bind-component\" in Light DOM requires a \"name\" attribute to avoid namespace conflicts with the parent scope.`);\n }\n const boundComponentStateProp = this.getAttribute(\"bind-component\")!;\n await customElements.whenDefined(customTagName.toLowerCase());\n // data-wcs属性がある場合は、上位の状態によりbinding情報の設定が完了するまで待機する\n if (boundComponent.hasAttribute(config.bindAttributeName)) {\n await waitInitializeBinding(boundComponent);\n }\n if (!(boundComponentStateProp in boundComponent)) {\n raiseError(`Component does not have property \"${boundComponentStateProp}\" for state binding.`);\n }\n const state = (boundComponent as any)[boundComponentStateProp] as Record<string, any>;\n if (typeof state !== 'object' || state === null) {\n raiseError(`Component property \"${boundComponentStateProp}\" is not an object for state binding.`);\n }\n this._boundComponent = boundComponent;\n this._boundComponentStateProp = boundComponentStateProp;\n bindWebComponent(this, this._boundComponent, this._boundComponentStateProp, state);\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 async _initializeDCC(hostElement: Element, shadowRoot: ShadowRoot): Promise<void> {\n let state: IState;\n try {\n if (this.hasAttribute('src')) {\n const src = this.getAttribute('src')!;\n if (src.endsWith('.js')) {\n state = await loadFromScriptFile(src);\n } else {\n raiseError(`DCC: Unsupported src type: ${src}`);\n }\n } else {\n const script = this.querySelector<HTMLScriptElement>('script[type=\"module\"]');\n if (script) {\n state = await loadFromInnerScript(script, hostElement.tagName.toLowerCase());\n } else {\n raiseError(`DCC: No state source found for \"${hostElement.tagName.toLowerCase()}\".`);\n }\n }\n } catch (e) {\n raiseError(`DCC: Failed to load state: ${e}`);\n }\n defineDCC(hostElement, shadowRoot, state!);\n this._initialized = true;\n this._rootNode = null; // disconnectedCallbackでのstate参照を防止\n this._resolveInitialize?.();\n this._resolveConnectedCallback?.();\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 if (!this._initialized) {\n // DCC 検出: ShadowRoot 内かつホストに data-wc-definition がある場合\n const parentNode = this.parentNode;\n if (parentNode instanceof ShadowRoot &&\n parentNode.host.hasAttribute(DCC_DEFINITION_ATTRIBUTE)) {\n await this._initializeDCC(parentNode.host, parentNode);\n return;\n }\n await this._initializeBindWebComponent();\n await this._initialize();\n this._initialized = true;\n this._resolveInitialize?.();\n }\n // enable-ssr (クライアント側): SSR で $connectedCallback 済みなのでスキップ\n // inSsr() (サーバー側): レンダリング中なので実行する\n if (!this.hasAttribute('enable-ssr') || inSsr()) {\n await this._callStateConnectedCallback();\n }\n\n // サーバーモード + enable-ssr: バインディング完了後に <wcs-ssr> を生成\n if (inSsr() && this.hasAttribute('enable-ssr')) {\n await getBindingsReady(this.rootNode);\n\n const name = this.getAttribute('name') || 'default';\n const stateData = Ssr.extractStateData(this);\n const ssrEl = document.createElement(config.tagNames.ssr);\n ssrEl.setAttribute('name', name);\n ssrEl.setAttribute('version', VERSION);\n Ssr.buildContent(ssrEl, stateData);\n this.parentNode?.insertBefore(ssrEl, this);\n }\n\n this._resolveConnectedCallback?.();\n }\n\n disconnectedCallback() {\n if (this._rootNode !== null) {\n this._callStateDisconnectedCallback();\n setStateElementByName(this.rootNode, this._name, null);\n this._rootNode = null;\n }\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 elementPaths(): Set<string> {\n return this._elementPaths;\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 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 get bindableEventMap(): Record<string, string> {\n return this._bindableEventMap;\n }\n\n setBindableEventMap(map: Record<string, string>): void {\n this._bindableEventMap = map;\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): void {\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 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 private _createState<T>(rootNode: Node, mutability: Mutability, callback: (state: IStateProxy) => T): T {\n try {\n const stateProxy = createStateProxy(rootNode, this._state, this._name, 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 bindProperty(prop: string, desc: PropertyDescriptor): void {\n Object.defineProperty(this._state, prop, desc);\n }\n\n setInitialState(state: Record<string, any>): void {\n if (!this._initialized) {\n this._resolveSetState?.(state);\n } else {\n this._state = state;\n }\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 { IState } from \"../types\";\nimport { DCC_DEFINITION_ATTRIBUTE, STATE_BINDABLES_NAME } from \"../define\";\nimport { config } from \"../config\";\nimport { raiseError } from \"../raiseError\";\nimport { getterFn, setterFn, callFn, isInternalProperty } from \"./dccPropertyFactories\";\nimport { createWcBindable, createBindableEventMap, IWcBindable } from \"./wcBindable\";\nimport { State } from \"../components/State\";\n\nexport function defineDCC(hostElement: Element, shadowRoot: ShadowRoot, state: IState): void {\n const tagName = hostElement.tagName.toLowerCase();\n\n // バリデーション\n if (!tagName.includes(\"-\")) {\n raiseError(`DCC: \"${tagName}\" is not a valid custom element name (must contain a hyphen).`);\n }\n if (customElements.get(tagName)) {\n // 既に登録済みならスキップ\n return;\n }\n\n // ShadowRoot は cloneNode 不可のため、template 経由で内容をクローン\n const template = document.createElement(\"template\");\n template.innerHTML = shadowRoot.innerHTML;\n const shadowRootMode = shadowRoot.mode as ShadowRootMode;\n\n // $bindables から wcBindable + bindableEventMap を生成\n const bindables: string[] = Array.isArray(state[STATE_BINDABLES_NAME])\n ? state[STATE_BINDABLES_NAME]\n : [];\n const wcBindable: IWcBindable | null = bindables.length > 0\n ? createWcBindable(tagName, bindables)\n : null;\n const bindableEventMap: Record<string, string> = bindables.length > 0\n ? createBindableEventMap(tagName, bindables)\n : {};\n\n // DCC クラス生成\n const stateTagSelector = `${config.tagNames.state}:not([name])` as const;\n\n const DCCElement = class extends HTMLElement {\n static template = template;\n static shadowRootMode = shadowRootMode;\n static wcBindable = wcBindable;\n static bindableEventMap = bindableEventMap;\n\n private _shadow: ShadowRoot | null = null;\n\n connectedCallback() {\n if (this.hasAttribute(DCC_DEFINITION_ATTRIBUTE)) return;\n this._shadow = this.attachShadow({ mode: DCCElement.shadowRootMode });\n this._shadow.appendChild(DCCElement.template.content.cloneNode(true));\n\n // bindableEventMap の設定\n if (Object.keys(DCCElement.bindableEventMap).length > 0) {\n const stateEl = this._shadow.querySelector(stateTagSelector) as State | null;\n if (stateEl) {\n stateEl.initializePromise.then(() => {\n stateEl.setBindableEventMap(DCCElement.bindableEventMap);\n });\n }\n }\n }\n\n get stateElement() {\n return this._shadow?.querySelector(stateTagSelector) as State | null;\n }\n };\n\n // state プロパティを走査して DCC クラスのプロトタイプにgetter/setter/methodを定義\n const descriptors = Object.getOwnPropertyDescriptors(state);\n for (const [name, desc] of Object.entries(descriptors)) {\n if (isInternalProperty(name)) continue;\n\n const newDesc: PropertyDescriptor = { configurable: true, enumerable: true };\n if (typeof desc.value === \"function\") {\n const isAsync = desc.value.constructor?.name === \"AsyncFunction\";\n newDesc.value = callFn(name, isAsync);\n } else {\n newDesc.get = getterFn(name);\n newDesc.set = setterFn(name);\n }\n Object.defineProperty(DCCElement.prototype, name, newDesc);\n }\n\n // カスタム要素登録\n customElements.define(tagName, DCCElement);\n}\n","export interface IWcBindableProperty {\n name: string;\n event: string;\n}\n\nexport interface IWcBindable {\n protocol: string;\n version: number;\n properties: IWcBindableProperty[];\n}\n\nexport function createWcBindable(tagName: string, bindables: string[]): IWcBindable {\n const properties: IWcBindableProperty[] = bindables.map((propName) => ({\n name: propName,\n event: `${tagName}:${propName}-changed`,\n }));\n return {\n protocol: \"wc-bindable\",\n version: 1,\n properties,\n };\n}\n\nexport function createBindableEventMap(tagName: string, bindables: string[]): Record<string, string> {\n const map: Record<string, string> = {};\n for (const propName of bindables) {\n map[propName] = `${tagName}:${propName}-changed`;\n }\n return map;\n}\n","import { Ssr } from \"./components/Ssr\";\nimport { State } from \"./components/State\";\nimport { config } from \"./config\";\n\nexport function registerComponents() {\n if (!customElements.get(config.tagNames.ssr)) {\n customElements.define(config.tagNames.ssr, Ssr);\n }\n if (!customElements.get(config.tagNames.state)) {\n customElements.define(config.tagNames.state, State);\n }\n}\n","import { setConfig } from \"./config\";\nimport { registerComponents } from \"./registerComponents\";\nimport { IWritableConfig } from \"./types\";\n\nexport function bootstrapState(config?: IWritableConfig): void {\n if (config) {\n setConfig(config);\n }\n registerComponents();\n}","/**\n * defineState.ts\n *\n * 状態オブジェクトに型付けを提供するためのユーティリティ。\n * defineState() はアイデンティティ関数で、ThisType<> を付与することで\n * メソッド・computed getter 内の this に型補完を提供する。\n *\n * テンプレートリテラル型によるドットパスの型解決:\n * - WcsPaths<T> : T から生成される全ドットパスの union\n * - WcsPathValue<T,P>: パス P に対応する値の型\n * - WcsPathAccessor<T>: ブラケットアクセス用マップ型\n */\n\n// ============================================================\n// Internal helper types\n// ============================================================\n\n/**\n * `any` 型を検出する。\n * `0 extends (1 & T)` は T が `any` の場合のみ true になる。\n */\ntype IsAny<T> = 0 extends (1 & T) ? true : false;\n\n/**\n * T がドットパス再帰の対象となる「プレーンなデータオブジェクト」かどうかを判定する。\n * プリミティブ、組み込みオブジェクト (Date, Map 等)、関数、配列、any は除外。\n */\ntype IsPlainObject<T> =\n IsAny<T> extends true ? false :\n T extends\n | string | number | boolean | null | undefined | symbol | bigint\n | Function | Date | RegExp | Error\n | Map<any, any> | Set<any> | WeakMap<any, any> | WeakSet<any>\n | Promise<any> | readonly any[]\n ? false\n : T extends Record<string, any>\n ? true\n : false;\n\n/**\n * T のキーのうち、関数でないもの(データプロパティ・computed getter)を抽出する。\n * メソッド(イベントハンドラ等)はドットパスの対象外。\n * any 型のプロパティは除外せず保持する。\n */\ntype DataKeys<T> = {\n [K in keyof T & string]: IsAny<T[K]> extends true ? K : T[K] extends Function ? never : K;\n}[keyof T & string];\n\n// ============================================================\n// WcsPaths — ドットパスの union 生成\n// ============================================================\n\n/**\n * 型 T から生成される全てのドットパスの union。\n * 配列プロパティはワイルドカード `*` を使用: `items.*.name`\n *\n * 再帰の深さは最大4レベルに制限(コンパイル性能の確保)。\n *\n * @example\n * ```ts\n * type S = {\n * count: number;\n * users: { name: string; age: number }[];\n * cart: { items: { price: number }[] };\n * };\n * type P = WcsPaths<S>;\n * // = \"count\" | \"users\" | \"users.*\" | \"users.*.name\" | \"users.*.age\"\n * // | \"cart\" | \"cart.items\" | \"cart.items.*\" | \"cart.items.*.price\"\n * ```\n */\nexport type WcsPaths<T, Depth extends readonly any[] = []> =\n Depth[\"length\"] extends 4 ? never :\n {\n [K in DataKeys<T>]:\n | K\n | (T[K] extends readonly (infer E)[]\n ? IsPlainObject<E> extends true\n ? `${K}.*` | WcsSubPaths<E, `${K}.*.`, [...Depth, 0]>\n : `${K}.*`\n : IsPlainObject<T[K]> extends true\n ? WcsSubPaths<T[K], `${K}.`, [...Depth, 0]>\n : never)\n }[DataKeys<T>];\n\n/** @internal プレフィックス付きサブパスの生成ヘルパー */\ntype WcsSubPaths<T, Prefix extends string, Depth extends readonly any[]> =\n WcsPaths<T, Depth> extends infer P extends string\n ? `${Prefix}${P}`\n : never;\n\n// ============================================================\n// WcsPathValue — パスから値の型を解決\n// ============================================================\n\n/**\n * ドットパス P に対応する値の型を T から解決する。\n *\n * 解決順序:\n * 1. T の直接キー(computed getter 含む)\n * 2. `K.*` → 配列要素型\n * 3. `K.rest` → オブジェクト/配列のネストを再帰的に辿る\n *\n * @example\n * ```ts\n * type S = { cart: { items: { price: number; qty: number }[] } };\n * type V1 = WcsPathValue<S, \"cart.items.*.price\">; // number\n * type V2 = WcsPathValue<S, \"cart.items.*\">; // { price: number; qty: number }\n * type V3 = WcsPathValue<S, \"cart\">; // { items: ... }\n * ```\n */\nexport type WcsPathValue<T, P extends string> =\n // 1. Direct key (includes computed getters like \"users.*.ageCategory\")\n P extends keyof T\n ? T[P]\n // 2. K.* → array element type\n : P extends `${infer K}.*`\n ? K extends keyof T\n ? T[K] extends readonly (infer E)[] ? E : never\n : never\n // 3. K.rest → recurse into nested structure\n : P extends `${infer K}.${infer Rest}`\n ? K extends keyof T\n ? T[K] extends readonly (infer E)[]\n // Array: expect *.subpath or *\n ? Rest extends `*.${infer SubRest}`\n ? WcsPathValue<E, SubRest>\n : Rest extends \"*\"\n ? E\n : never\n // Object: recurse\n : T[K] extends Record<string, any>\n ? WcsPathValue<T[K], Rest>\n : never\n : never\n : never;\n\n// ============================================================\n// WcsPathAccessor — ブラケットアクセス用マップ型\n// ============================================================\n\n/**\n * 全ドットパスに対する型付きブラケットアクセスを提供するマップ型。\n *\n * `this[\"users.*.name\"]` のようなアクセスに対して、\n * WcsPaths で生成されたパスに対応する値の型を返す。\n */\ntype WcsPathAccessor<T> = {\n [P in WcsPaths<T>]: WcsPathValue<T, P>;\n};\n\n// ============================================================\n// State Proxy API — this 経由でアクセスできるAPI\n// ============================================================\n\n/**\n * `<wcs-state>` の Proxy 経由で提供されるAPIメソッド。\n * state定義オブジェクト内のメソッド・getter で `this.` 経由で利用可能。\n */\nexport interface WcsStateApi {\n /**\n * ワイルドカードを含むパスにマッチする全要素を配列で取得する。\n *\n * @example\n * ```ts\n * get \"cart.totalPrice\"() {\n * return this.$getAll(\"cart.items.*.price\", []).reduce((sum, v) => sum + v, 0);\n * }\n * ```\n */\n $getAll<V = any>(path: string, defaultValue?: V[]): V[];\n\n /**\n * 指定パスの更新を手動でトリガーする。\n * Proxy の set トラップを経由せずに内部状態を変更した場合に使用。\n */\n $postUpdate(path: string): void;\n\n /**\n * パスとインデックス配列を指定して、ワイルドカードを解決した値を取得・設定する。\n *\n * @param path - ワイルドカードを含むパス\n * @param indexes - 各ワイルドカード階層のインデックス\n * @param value - 設定する値(省略時は取得)\n */\n $resolve(path: string, indexes: number[], value?: any): any;\n\n /**\n * 指定パスへの依存関係を明示的に登録する。\n * computed getter 内で動的にパスを組み立てる場合に使用。\n */\n $trackDependency(path: string): void;\n\n /** `<wcs-state>` 要素への参照 */\n readonly $stateElement: HTMLElement;\n\n // ループインデックス変数 ($1〜$9)\n // for テンプレート内のイベントハンドラで、ネストされたループの\n // 各階層のインデックスにアクセスするために使用。\n readonly $1: number;\n readonly $2: number;\n readonly $3: number;\n readonly $4: number;\n readonly $5: number;\n readonly $6: number;\n readonly $7: number;\n readonly $8: number;\n readonly $9: number;\n}\n\n// ============================================================\n// WcsThis — state メソッド/getter 内の this の型\n// ============================================================\n\n/**\n * state定義オブジェクト内の `this` の型。\n *\n * - `T` のプロパティに型付きでアクセス可能(直接キー)\n * - `WcsPathAccessor<T>` によるネストされたドットパスの型付きアクセス\n * - `WcsStateApi` のメソッド ($getAll, $postUpdate 等) にアクセス可能\n * - 動的パス (`this[\\`items.${i}.name\\`]`) は型チェック対象外(キャストが必要)\n *\n * @example\n * ```ts\n * defineState({\n * count: 0,\n * users: [] as { name: string; age: number }[],\n * increment() {\n * this.count++; // number\n * this[\"users.*.name\"]; // string (パス型解決)\n * this.$getAll(\"path\", []); // API\n * }\n * });\n * ```\n */\nexport type WcsThis<T> = T & WcsStateApi & WcsPathAccessor<T>;\n\n// ============================================================\n// defineState — 型付き状態定義関数\n// ============================================================\n\n/**\n * `<wcs-state>` 用の型付き状態オブジェクトを定義する。\n *\n * ランタイムではアイデンティティ関数(引数をそのまま返す)として動作し、\n * コストはゼロ。TypeScript の `ThisType<>` を利用して、メソッド・getter 内の\n * `this` に型補完を提供する。\n *\n * ### 基本的な使い方 (TypeScript)\n * ```ts\n * import { defineState } from '@wcstack/state';\n *\n * export default defineState({\n * count: 0,\n * users: [] as { name: string; age: number }[],\n *\n * increment() {\n * this.count++; // ✅ number\n * this[\"users.*.name\"]; // ✅ string (ドットパス型解決)\n * },\n *\n * get \"users.*.ageCategory\"() {\n * return this[\"users.*.age\"] < 25 ? \"Young\" : \"Adult\";\n * }\n * });\n * ```\n *\n * ### JavaScript (JSDoc)\n * ```js\n * import { defineState } from '@wcstack/state';\n *\n * export default defineState({\n * count: 0,\n * increment() {\n * this.count++; // ✅ JSDoc + tsconfig checkJs で型補完\n * }\n * });\n * ```\n *\n * ### HTML インラインスクリプト\n * ```html\n * <wcs-state>\n * <script type=\"module\">\n * import { defineState } from '@wcstack/state';\n * export default defineState({\n * count: 0,\n * increment() { this.count++; }\n * });\n * </script>\n * </wcs-state>\n * ```\n *\n * ### ライフサイクルコールバック\n * ```ts\n * export default defineState({\n * data: null,\n * async $connectedCallback() {\n * this.data = await fetch('/api/data').then(r => r.json());\n * },\n * $disconnectedCallback() {\n * // cleanup\n * },\n * $updatedCallback() {\n * // called after DOM update\n * }\n * });\n * ```\n */\nexport function defineState<T extends Record<string, any>>(\n definition: T & ThisType<WcsThis<T>>\n): T {\n return definition;\n}\n"],"names":["_inSsrCache","inSsr","html","document","querySelector","hasAttribute","_config","bindAttributeName","commentTextPrefix","commentForPrefix","commentIfPrefix","commentElseIfPrefix","commentElsePrefix","tagNames","state","ssr","locale","debug","enableMustache","config","getConfig","VERSION","raiseError","message","Error","bindingPromiseByNode","WeakMap","id","getInitializeBindingPromiseByNode","node","resolveFn","bindingPromise","get","promise","Promise","resolve","set","async","waitInitializeBinding","resolveInitializedBinding","replaceToReplaceNode","bindingInfo","replaceNode","parentNode","replaceChild","resolveNodePath","root","path","currentNode","length","i","childNodes","getBindingInfos","parseBindingTextResults","bindingInfos","parseBindingTextResult","bindingType","push","createTextNode","bindingsByNode","getBindingsByNode","setBindingsByNode","bindings","DELIMITER","WILDCARD","MAX_LOOP_DEPTH","tmpIndexByIndexName","INDEX_BY_INDEX_NAME","Object","freeze","STATE_CONNECTED_CALLBACK_NAME","STATE_DISCONNECTED_CALLBACK_NAME","WEBCOMPONENT_STATE_READY_CALLBACK_NAME","STATE_BINDABLES_NAME","DCC_DEFINITION_ATTRIBUTE","_cache","Map","getPathInfo","pathInfo","PathInfo","segments","lastSegment","cumulativePaths","cumulativePathSet","cumulativePathInfos","cumulativePathInfoSet","parentPath","wildcardPaths","wildcardPathSet","indexByWildcardPath","wildcardPathInfos","wildcardPathInfoSet","wildcardParentPaths","wildcardParentPathSet","wildcardParentPathInfos","wildcardParentPathInfoSet","wildcardPositions","lastWildcardPath","lastWildcardInfo","wildcardCount","parentPathInfo","constructor","getPattern","_path","this","split","currentPatternPath","prevPatternPath","Set","STRUCTURAL_BINDING_TYPE_SET","optionsRequired","fnName","optionMustBeNumber","valueMustBeNumber","valueMustBeDate","validateNumberString","value","isNaN","Number","builtinFilters","eq","options","opt","ne","not","_options","lt","le","gt","ge","inc","dec","mul","div","mod","fix","toFixed","toLocaleString","uc","String","toUpperCase","lc","toLowerCase","cap","v","charAt","slice","trim","numberedOpts","opt1","opt2","substr","pad","padStart","rep","repeat","rev","reverse","join","int","parseInt","float","parseFloat","round","optValue","Math","pow","floor","ceil","percent","date","Date","toLocaleDateString","time","toLocaleTimeString","datetime","ymd","year","getFullYear","toString","month","getMonth","day","getDate","falsy","truthy","defaults","boolean","Boolean","number","string","null","outputBuiltinFilters","builtinFiltersByFilterIOType","input","output","builtinFilterFn","name","filters","filter","filterFnByKey","parseFilters","filterTextList","filterIOType","map","filterText","openParenIndex","indexOf","closeParenIndex","lastIndexOf","filterName","filterKey","filterFn","args","argsText","substring","current","inQuote","hasQuote","char","last","parseFilterArgs","trimFn","s","cacheFilterInfos","parseStatePart","statePart","pos","stateAndPath","filterTexts","filtersText","has","statePathName","stateName","statePathInfo","outFilters","parseBindTextsForElement","bindText","bindTexts","results","separatorIndex","propPart","propName","propSegments","propModifiers","inFilters","stateResult","propResult","propText","propModifiersText","parsePropPart","startsWith","some","r","bindTextByNode","bindingTypeKeywordSet","EMBEDDED_REGEX","RegExp","parseCommentNode","savedText","nodeType","Node","COMMENT_NODE","text","data","match","exec","keyword","getParseBindTextResults","ELEMENT_NODE","getAttribute","bindTextOrUUID","fragmentInfo","getFragmentInfoByUUID","parseBindTextResult","uuid","getSubscriberNodes","subscriberNodes","walker","createTreeWalker","NodeFilter","SHOW_ELEMENT","SHOW_COMMENT","acceptNode","FILTER_ACCEPT","FILTER_SKIP","nextNode","registeredNodeSet","WeakSet","collectNodesAndBindingInfos","allBindings","add","loopContextByNode","getLoopContextByNode","paramNode","loopContext","setLoopContextByNode","delete","setLoopContextAsyncSymbol","Symbol","setLoopContextSymbol","getByAddressSymbol","setByAddressSymbol","connectedCallbackSymbol","disconnectedCallbackSymbol","updatedCallbackSymbol","handlerByHandlerKey","bindingSetByHandlerKey","attachEventHandler","binding","key","modifierKey","m","sort","getHandlerKey","stateEventHandler","handlerName","modifiers","event","includes","preventDefault","stopPropagation","target","stateElement","getStateElementByName","getRootNode","createStateAsync","handler","Reflect","apply","listIndex","indexes","eventName","addEventListener","bindingSet","cache","getCustomElement","cached","undefined","element","tagName","is","CHECK_TYPES","DEFAULT_VALUE_PROP_NAMES","DEFAULT_GETTER","e","detail","attachTwowayEventHandler","customTagName","customElements","whenDefined","then","inputType","customClass","bindable","wcBindable","protocol","version","properties","p","isPossibleTwoWay","propDesc","find","modifier","getEventName","valueGetter","getter","getValueGetter","hasGetter","f","twowayEventHandler","console","warn","newValue","filteredNewValue","createState","twowayEventHandlerFunction","lastListValueByAbsoluteStateAddress","getLastListValueByAbsoluteStateAddress","address","setLastListValueByAbsoluteStateAddress","getAbsolutePathInfo","pathMap","absolutePathInfo","AbsolutePathInfo","parentAbsolutePathInfo","_cacheNullListIndex","AbsoluteStateAddress","_parentAbsoluteAddress","parentAbsoluteAddress","parentListIndex","createAbsoluteStateAddress","cacheByAbsolutePathInfo","rootNodeByFragment","setRootNodeByFragment","fragment","rootNode","getRootNodeByFragment","cacheCalcWildcardLen","calcWildcardLen","targetPathInfo","path1","path2","len","intersection","size","listIndexByBindingInfoByLoopContext","getListIndexByBindingInfo","listIndexByBindingInfo","wildcardLen","at","absoluteStateAddressByBinding","getAbsoluteStateAddressByBinding","absoluteStateAddress","isConnected","nodeName","clearAbsoluteStateAddressByBinding","completeByStateElementByWebComponent","isWebComponentComplete","webComponent","completeByStateElement","getFilteredValue","filteredValue","EMPTY_ARRAY","StateAddress","_parentAddress","parentAddress","createStateAddress","cacheByPathInfo","indexBindingsByContent","getIndexBindingsByContent","content","setIndexBindingsByContent","prototype","difference","other","result","elem","count","getUUID","ListIndex","position","_index","_version","_indexes","_listIndexes","index","dirty","listIndexes","WeakRef","varName","deref","createListIndex","listIndexesByList","getListIndexesByList","list","setListIndexesByList","listDiffByOldListByNewList","EMPTY_LIST","EMPTY_SET","createListDiff","rawOldList","rawNewList","oldList","Array","isArray","newList","cachedDiff","diffByNewList","getListDiff","oldIndexes","retValue","newIndexes","changeIndexSet","deleteIndexSet","addIndexSet","newListIndex","isSameList","indexByValue","val","newIndexSet","oldIndexSet","existingIndexes","oldIndex","shift","existingListIndex","calcDiffIndexes","diff","setListDiff","bindingSetByAbsoluteStateAddress","getBindingSetByAbsoluteStateAddress","addBindingByAbsoluteStateAddress","removeBindingByAbsoluteStateAddress","stateAddressByBindingInfo","clearStateAddressByBindingInfo","bindingsByContent","getBindingsByContent","setBindingsByContent","nodesByContent","getNodesByContent","setNodesByContent","nodes","bindLoopContextToContent","activateContent","context","applyChange","deactivateContent","mounted","unbindLoopContextToContent","contentSetByNode","setContentByNode","contents","getContentSetByNode","recursiveBindingTypes","Content","_content","_childNodeArray","_firstNode","_lastNode","_mounted","from","firstNode","lastNode","appendTo","targetNode","appendChild","mountAfter","nextSibling","insertBefore","unmount","removeChild","createContentFromNodes","createDocumentFragment","createContent","cloneFragment","importNode","initialInfo","nodeInfos","nodeInfo","nodePath","parseBindTextResults","collectNodesAndBindingInfosByFragment","_initializeBindings","initializeBindingsByFragment","indexBindings","lastNodeByNode","contentByListIndexByNode","pooledContentsByNode","isOnlyNodeInParentContentByNode","hydrateSetContent","setContent","hydrateSetLastNode","getPooledContents","setPooledContent","getContent","contentByListIndex","lastConnectedByNode","bindingInfoText","applyChangeToIf","rawNewValue","currentConnected","values","next","ssrMode","log","startComment","createComment","endComment","afterNode","store","getSsrProperties","trackedNodes","SSR_ATTR_PROPS","textContent","setAttribute","checked","removeAttribute","selected","disabled","selectedIndex","querySelectorAll","idx","applyChangeToProperty","_context","firstSegment","error","attrHandler","entries","existing","addSsrProperty","subObject","segment","oldValue","isFrozen","ssrWrappedNodes","applyChangeToWebComponent","restSegments","getValue","stateAddress","getStateAddressByBindingInfo","indexName","indexPos","getIndexValueByLoopContext","applyChangeByFirstSegment","class","className","classList","toggle","attr","attrName","style","styleName","applyChangeByBindingType","nodeValue","for","listPathInfo","absAddress","lastValue","newListValueByAbsAddress","isOnlyNode","prevCheckNode","previousSibling","nextCheckNode","onlyNode","TEXT_NODE","isOnlyNodeInParentContent","deleteIndex","elementPathInfo","loopContextStack","createLoopContext","pooledContents","pop","indexBinding","if","else","elseif","radio","elementFilteredValue","checkbox","normalizedNewValue","fnByBinding","deferredSelectBindingByBinding","_applyChange","deferredSelectBindings","fn","appliedBindingSet","updatedAbsAddressSetByStateElement","customTag","DocumentFragment","ShadowRoot","targetState","newContext","applyChangeFromBindings","bindingIndex","nextBindingInfo","nextRootNode","newListValue","absAddressSet","radioEventHandlerFunction","type","attachRadioEventHandler","radioEventHandler","checkboxEventHandlerFunction","currentValue","concat","toSpliced","attachCheckboxEventHandler","checkboxEventHandler","initializeBindings","parentLoopContext","setPathInfo","MUSTACHE_REGEX","SKIP_TAGS","convertMustacheToComments","SHOW_TEXT","textNodes","textNode","parentElement","replaceTextNode","convertTextNodes","templates","template","namespaceURI","newTemplate","createElement","childNode","attributes","replaceWith","lastIndex","test","_notFilterInfo","createNotFilter","COMMENT_REGEX","expandShorthandInStatePart","forPath","prefix","pipeIndex","atIndex","pathPart","suffix","expandCommentData","commentPrefix","commentSuffix","expandBindAttribute","attrValue","parts","changed","part","trimmed","colonIndex","expanded","expandShorthandInBindAttribute","expandShorthandPaths","bindAttr","comment","HTMLTemplateElement","getNodePath","unshift","getFragmentNodeInfos","fragmnentNodeInfos","subscriberNode","optimizeFragment","keywordByBindingType","notFilter","cloneNotParseBindTextResult","_getFragmentInfo","collectStructuralFragments","walkRoot","elseKeyword","lastIfFragmentInfo","elseFragmentInfos","childForPath","setFragmentInfoByUUID","lastElseFragmentInfo","placeHolder","remove","elseUUID","elseFragmentInfo","elsePlaceHolder","waitForStateInitialize","elements","promises","initializePromise","all","buildBindings","body","shadowRoot","host","STRUCTURAL_TYPES","collectBindingsFromLiveNodes","parent","wrapper","firstChild","findPlaceholderComment","pattern","restoreFragments","ssrEl","lastIfParseResult","tpl","hydrateBindings","ssrElements","ssrNode","verifyVersion","Ssr","cleanupDom","blocks","startComments","startMatch","SSR_BLOCK_START","info","sibling","endPattern","collectSsrBlocks","listIndexesByUuid","block","placeholderComment","hydrateBlocks","removeBlockBoundaryComments","ssrParents","el","restoreTextBindings","normalBindings","structuralBindings","absAddr","restoredSsrElements","props","hydrateProps","propMap","completedEls","stateElementByNameByNode","bindingsReadyByNode","stateElementByName","getBindingsReady","setStateElementByName","enableSsr","ready","queueMicrotask","fragmentInfoByUUID","bindingPartial","nodeBindingPartial","nodeStateElement","SSR_PLACEHOLDER_COMMENT","SSR_BLOCK_END","SSR_TEXT_START","HTMLElement","_stateData","_templates","_hydrateProps","stateData","_loadStateData","_loadTemplates","_loadHydrateProps","getTemplate","serverVersion","serverParts","clientParts","setStateData","setHydrateProps","script","JSON","parse","findByName","parentEl","Element","Document","documentElement","extractStateData","stateEl","raw","__state","buildContent","jsonScript","stringify","uuids","keys","bindResult","cloneNode","ssrNodes","propsData","entry","propsScript","clear","toRemove","removeStructuralComments","bindComment","templateByUuid","walker1","walker2","placeholders","restored","imported","child","ssrIdElements","loadFromInnerScript","scriptModule","uniq_comment","URL","createObjectURL","blob","Blob","url","import","revokeObjectURL","b64","btoa","fromCodePoint","TextEncoder","encode","default","loadFromScriptFile","LoopContextStack","_loopContextStack","fill","_length","elementStateAddress","callback","lastLoopContext","prevWildcardPathInfo","finally","getterFn","setterFn","callFn","isAsync","isInternalProperty","ResolvedAddress","paths","wildcardType","wildcardIndexes","tmpPatternSegments","incompleteCount","completeCount","lastPath","getResolvedAddress","nameInfo","cacheEntryByAbsoluteStateAddress","setCacheEntryByAbsoluteStateAddress","cacheEntry","dirtyCacheEntryByAbsoluteStateAddress","_getByAddress","receiver","parentValue","getByAddress","getterPaths","pushAddress","popAddress","_getByAddressWithCache","getCacheEntryByAbsoluteStateAddress","addressStackLength","lastInfo","lastAddressStack","addDynamicDependency","checkDependency","getContextListIndex","structuredPath","updater","_queueAbsoluteAddresses","enqueueAbsoluteAddress","absoluteAddress","requireStartProcess","absoluteAddresses","testApplyChange","absoluteAddressSet","processBindings","getUpdater","swapInfoByStateAddress","setSwapInfoByAddress","swapInfo","_walkExpandWildcard","currentWildcardIndex","parentAbsPathInfo","stateProxy","loopIndexes","listDiff","searchType","getIndexes","targetListIndexes","walkDependency","startAddress","staticDependency","dynamicDependency","listPathSet","staticMap","dynamicMap","visited","stack","depth","sourcePath","nextDepth","nextEntries","staticDeps","dep","depPathInfo","depAddress","dynamicDeps","expandContext","_walkDependency","_setByAddress","setterPaths","listPaths","absDepAddress","_setByAddressWithSwap","getSwapInfoByAddress","currentParentValue","currentListIndexes","curIndex","setByAddress","isSwappable","elementPaths","cacheable","bindableEventMap","dispatchEvent","CustomEvent","bubbles","_prop","wildcardParentPathInfo","wildcardAddress","lastValueByListAddress","getListIndex","resolvedAddress","_setLoopContext","setLoopContext","clearLoopContext","prop","newValueByAddress","wildcardPattern","walkWildcardPattern","wildcardIndexPos","parentIndexes","resultIndexes","resultValues","getAll","postUpdate","_target","_receiver","trackDependency","setLoopContextAsync","call","connectedCallback","disconnectedCallback","refs","indexesListByPath","ref","pathName","indexesList","updatedCallback","StateHandler","_stateElement","_stateName","_addressStack","_addressStackIndex","_loopContext","_mutability","mutability","trapGet","trapSet","lastValueByAbsoluteStateAddress","stateElementByWebComponent","getStateElementByWebComponent","stateMap","innerMappingByElement","outerMappingByElement","primaryMappingRuleSetByElement","primaryBindingByMappingRule","createMappingRuleByBinding","innerState","innerAbsPathInfo","outerAbsPathInfo","getOuterAbsolutePathInfo","innerMapping","outerMapping","primaryMappingRuleSet","primaryMappingRule","currentPrimaryMappingRule","primaryBinding","outerRemainingSegments","outerPathInfo","outerStateElement","addBindingByNode","meltFrozenObject","frozenObj","obj","proto","getPrototypeOf","clone","create","descriptors","getOwnPropertyDescriptors","descriptor","writable","defineProperties","cloneWithDescriptors","InnerStateProxyHandler","_webComponent","_innerStateElement","innerPathInfo","setLastValueByAbsoluteStateAddress","OuterStateProxyHandler","absStateAddress","$postUpdate","PlainOuterStateProxyHandler","getOuter","outerState","bindWebComponent","innerStateElement","component","stateProp","setStateElementByWebComponent","innerMappingRule","outerMappingRule","mappingRule","buildPrimaryMappingRule","Proxy","createOuterState","boundComponentStateProp","createInnerState","setInitialState","defineProperty","enumerable","configurable","createPlainOuterState","markWebComponentAsComplete","func","catch","getStateInfo","assign","getAllPropertyDescriptors","State","static","_name","_initialized","_initializePromise","_resolveInitialize","_connectedCallbackPromise","_resolveConnectedCallback","_loadingPromise","_resolveLoading","_setStatePromise","_resolveSetState","_listPaths","_elementPaths","_getterPaths","_setterPaths","createLoopContextStack","_dynamicDependency","_staticDependency","_pathSet","_rootNode","_boundComponent","_boundComponentStateProp","_bindableEventMap","super","_state","stateInfo","_loadFromSsrElement","_initialize","ssrState","getElementById","loadFromScriptJson","src","endsWith","response","fetch","ok","statusText","json","loadFromJsonFile","timerId","setTimeout","clearTimeout","desc","getOwnPropertyDescriptor","_initializeBindWebComponent","boundComponent","_callStateConnectedCallback","_initializeDCC","hostElement","innerHTML","shadowRootMode","mode","bindables","createWcBindable","createBindableEventMap","stateTagSelector","DCCElement","_shadow","attachShadow","setBindableEventMap","newDesc","define","defineDCC","_callStateDisconnectedCallback","connectedCallbackPromise","_addDependency","targetPath","deps","addStaticDependency","currentPathInfo","_createState","createStateProxy","nextVersion","bindProperty","registerComponents","bootstrapState","partialConfig","defineState","definition"],"mappings":"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"}