@wcstack/state 1.3.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.ja.md +1078 -0
- package/README.md +1078 -0
- package/dist/address/AbsolutePathInfo.d.ts +4 -0
- package/dist/address/AbsolutePathInfo.d.ts.map +1 -0
- package/dist/address/AbsolutePathInfo.js +33 -0
- package/dist/address/AbsolutePathInfo.js.map +1 -0
- package/dist/address/AbsoluteStateAddress.d.ts +4 -0
- package/dist/address/AbsoluteStateAddress.d.ts.map +1 -0
- package/dist/address/AbsoluteStateAddress.js +56 -0
- package/dist/address/AbsoluteStateAddress.js.map +1 -0
- package/dist/address/PathInfo.d.ts +3 -0
- package/dist/address/PathInfo.d.ts.map +1 -0
- package/dist/address/PathInfo.js +104 -0
- package/dist/address/PathInfo.js.map +1 -0
- package/dist/address/ResolvedAddress.d.ts +31 -0
- package/dist/address/ResolvedAddress.d.ts.map +1 -0
- package/dist/address/ResolvedAddress.js +110 -0
- package/dist/address/ResolvedAddress.js.map +1 -0
- package/dist/address/StateAddress.d.ts +4 -0
- package/dist/address/StateAddress.d.ts.map +1 -0
- package/dist/address/StateAddress.js +56 -0
- package/dist/address/StateAddress.js.map +1 -0
- package/dist/address/calcWildcardLen.d.ts +3 -0
- package/dist/address/calcWildcardLen.d.ts.map +1 -0
- package/dist/address/calcWildcardLen.js +31 -0
- package/dist/address/calcWildcardLen.js.map +1 -0
- package/dist/address/types.d.ts +54 -0
- package/dist/address/types.d.ts.map +1 -0
- package/dist/address/types.js +2 -0
- package/dist/address/types.js.map +1 -0
- package/dist/apply/applyChange.d.ts +4 -0
- package/dist/apply/applyChange.d.ts.map +1 -0
- package/dist/apply/applyChange.js +105 -0
- package/dist/apply/applyChange.js.map +1 -0
- package/dist/apply/applyChangeFromBindings.d.ts +9 -0
- package/dist/apply/applyChangeFromBindings.d.ts.map +1 -0
- package/dist/apply/applyChangeFromBindings.js +74 -0
- package/dist/apply/applyChangeFromBindings.js.map +1 -0
- package/dist/apply/applyChangeToAttribute.d.ts +4 -0
- package/dist/apply/applyChangeToAttribute.d.ts.map +1 -0
- package/dist/apply/applyChangeToAttribute.js +8 -0
- package/dist/apply/applyChangeToAttribute.js.map +1 -0
- package/dist/apply/applyChangeToCheckbox.d.ts +4 -0
- package/dist/apply/applyChangeToCheckbox.d.ts.map +1 -0
- package/dist/apply/applyChangeToCheckbox.js +11 -0
- package/dist/apply/applyChangeToCheckbox.js.map +1 -0
- package/dist/apply/applyChangeToClass.d.ts +4 -0
- package/dist/apply/applyChangeToClass.d.ts.map +1 -0
- package/dist/apply/applyChangeToClass.js +10 -0
- package/dist/apply/applyChangeToClass.js.map +1 -0
- package/dist/apply/applyChangeToFor.d.ts +9 -0
- package/dist/apply/applyChangeToFor.d.ts.map +1 -0
- package/dist/apply/applyChangeToFor.js +186 -0
- package/dist/apply/applyChangeToFor.js.map +1 -0
- package/dist/apply/applyChangeToIf.d.ts +4 -0
- package/dist/apply/applyChangeToIf.d.ts.map +1 -0
- package/dist/apply/applyChangeToIf.js +42 -0
- package/dist/apply/applyChangeToIf.js.map +1 -0
- package/dist/apply/applyChangeToProperty.d.ts +4 -0
- package/dist/apply/applyChangeToProperty.d.ts.map +1 -0
- package/dist/apply/applyChangeToProperty.js +37 -0
- package/dist/apply/applyChangeToProperty.js.map +1 -0
- package/dist/apply/applyChangeToRadio.d.ts +4 -0
- package/dist/apply/applyChangeToRadio.d.ts.map +1 -0
- package/dist/apply/applyChangeToRadio.js +8 -0
- package/dist/apply/applyChangeToRadio.js.map +1 -0
- package/dist/apply/applyChangeToStyle.d.ts +4 -0
- package/dist/apply/applyChangeToStyle.d.ts.map +1 -0
- package/dist/apply/applyChangeToStyle.js +9 -0
- package/dist/apply/applyChangeToStyle.js.map +1 -0
- package/dist/apply/applyChangeToText.d.ts +4 -0
- package/dist/apply/applyChangeToText.d.ts.map +1 -0
- package/dist/apply/applyChangeToText.js +6 -0
- package/dist/apply/applyChangeToText.js.map +1 -0
- package/dist/apply/applyChangeToWebComponent.d.ts +4 -0
- package/dist/apply/applyChangeToWebComponent.d.ts.map +1 -0
- package/dist/apply/applyChangeToWebComponent.js +15 -0
- package/dist/apply/applyChangeToWebComponent.js.map +1 -0
- package/dist/apply/getFilteredValue.d.ts +3 -0
- package/dist/apply/getFilteredValue.d.ts.map +1 -0
- package/dist/apply/getFilteredValue.js +8 -0
- package/dist/apply/getFilteredValue.js.map +1 -0
- package/dist/apply/getValue.d.ts +4 -0
- package/dist/apply/getValue.d.ts.map +1 -0
- package/dist/apply/getValue.js +20 -0
- package/dist/apply/getValue.js.map +1 -0
- package/dist/apply/rootNodeByFragment.d.ts +3 -0
- package/dist/apply/rootNodeByFragment.d.ts.map +1 -0
- package/dist/apply/rootNodeByFragment.js +13 -0
- package/dist/apply/rootNodeByFragment.js.map +1 -0
- package/dist/apply/types.d.ts +15 -0
- package/dist/apply/types.d.ts.map +1 -0
- package/dist/apply/types.js +2 -0
- package/dist/apply/types.js.map +1 -0
- package/dist/applyChangeToNode.d.ts +2 -0
- package/dist/applyChangeToNode.d.ts.map +1 -0
- package/dist/applyChangeToNode.js +38 -0
- package/dist/applyChangeToNode.js.map +1 -0
- package/dist/auto.js +3 -0
- package/dist/auto.min.js +3 -0
- package/dist/bindTextParser/parseBindTextForEmbeddedNode.d.ts +3 -0
- package/dist/bindTextParser/parseBindTextForEmbeddedNode.d.ts.map +1 -0
- package/dist/bindTextParser/parseBindTextForEmbeddedNode.js +13 -0
- package/dist/bindTextParser/parseBindTextForEmbeddedNode.js.map +1 -0
- package/dist/bindTextParser/parseBindTextsForElement.d.ts +3 -0
- package/dist/bindTextParser/parseBindTextsForElement.d.ts.map +1 -0
- package/dist/bindTextParser/parseBindTextsForElement.js +80 -0
- package/dist/bindTextParser/parseBindTextsForElement.js.map +1 -0
- package/dist/bindTextParser/parseFilterArgs.d.ts +2 -0
- package/dist/bindTextParser/parseFilterArgs.d.ts.map +1 -0
- package/dist/bindTextParser/parseFilterArgs.js +31 -0
- package/dist/bindTextParser/parseFilterArgs.js.map +1 -0
- package/dist/bindTextParser/parseFilters.d.ts +4 -0
- package/dist/bindTextParser/parseFilters.d.ts.map +1 -0
- package/dist/bindTextParser/parseFilters.js +52 -0
- package/dist/bindTextParser/parseFilters.js.map +1 -0
- package/dist/bindTextParser/parsePropPart.d.ts +5 -0
- package/dist/bindTextParser/parsePropPart.d.ts.map +1 -0
- package/dist/bindTextParser/parsePropPart.js +44 -0
- package/dist/bindTextParser/parsePropPart.js.map +1 -0
- package/dist/bindTextParser/parseStatePart.d.ts +5 -0
- package/dist/bindTextParser/parseStatePart.d.ts.map +1 -0
- package/dist/bindTextParser/parseStatePart.js +39 -0
- package/dist/bindTextParser/parseStatePart.js.map +1 -0
- package/dist/bindTextParser/types.d.ts +3 -0
- package/dist/bindTextParser/types.d.ts.map +1 -0
- package/dist/bindTextParser/types.js +2 -0
- package/dist/bindTextParser/types.js.map +1 -0
- package/dist/bindTextParser/utils.d.ts +2 -0
- package/dist/bindTextParser/utils.d.ts.map +1 -0
- package/dist/bindTextParser/utils.js +2 -0
- package/dist/bindTextParser/utils.js.map +1 -0
- package/dist/binding/getAbsoluteStateAddressByBinding.d.ts +5 -0
- package/dist/binding/getAbsoluteStateAddressByBinding.d.ts.map +1 -0
- package/dist/binding/getAbsoluteStateAddressByBinding.js +41 -0
- package/dist/binding/getAbsoluteStateAddressByBinding.js.map +1 -0
- package/dist/binding/getBindingSetByAbsoluteStateAddress.d.ts +7 -0
- package/dist/binding/getBindingSetByAbsoluteStateAddress.d.ts.map +1 -0
- package/dist/binding/getBindingSetByAbsoluteStateAddress.js +22 -0
- package/dist/binding/getBindingSetByAbsoluteStateAddress.js.map +1 -0
- package/dist/binding/getStateAddressByBindingInfo.d.ts +5 -0
- package/dist/binding/getStateAddressByBindingInfo.d.ts.map +1 -0
- package/dist/binding/getStateAddressByBindingInfo.js +28 -0
- package/dist/binding/getStateAddressByBindingInfo.js.map +1 -0
- package/dist/binding/types.d.ts +23 -0
- package/dist/binding/types.d.ts.map +1 -0
- package/dist/binding/types.js +2 -0
- package/dist/binding/types.js.map +1 -0
- package/dist/bindings/bindLoopContextToContent.d.ts +5 -0
- package/dist/bindings/bindLoopContextToContent.d.ts.map +1 -0
- package/dist/bindings/bindLoopContextToContent.js +15 -0
- package/dist/bindings/bindLoopContextToContent.js.map +1 -0
- package/dist/bindings/bindingsByContent.d.ts +5 -0
- package/dist/bindings/bindingsByContent.d.ts.map +1 -0
- package/dist/bindings/bindingsByContent.js +8 -0
- package/dist/bindings/bindingsByContent.js.map +1 -0
- package/dist/bindings/collectNodesAndBindingInfos.d.ts +6 -0
- package/dist/bindings/collectNodesAndBindingInfos.d.ts.map +1 -0
- package/dist/bindings/collectNodesAndBindingInfos.js +46 -0
- package/dist/bindings/collectNodesAndBindingInfos.js.map +1 -0
- package/dist/bindings/getBindingInfos.d.ts +4 -0
- package/dist/bindings/getBindingInfos.d.ts.map +1 -0
- package/dist/bindings/getBindingInfos.js +22 -0
- package/dist/bindings/getBindingInfos.js.map +1 -0
- package/dist/bindings/getBindingsByNode.d.ts +5 -0
- package/dist/bindings/getBindingsByNode.d.ts.map +1 -0
- package/dist/bindings/getBindingsByNode.js +17 -0
- package/dist/bindings/getBindingsByNode.js.map +1 -0
- package/dist/bindings/getParseBindTextResults.d.ts +3 -0
- package/dist/bindings/getParseBindTextResults.d.ts.map +1 -0
- package/dist/bindings/getParseBindTextResults.js +36 -0
- package/dist/bindings/getParseBindTextResults.js.map +1 -0
- package/dist/bindings/getSubscriberNodes.d.ts +7 -0
- package/dist/bindings/getSubscriberNodes.d.ts.map +1 -0
- package/dist/bindings/getSubscriberNodes.js +32 -0
- package/dist/bindings/getSubscriberNodes.js.map +1 -0
- package/dist/bindings/indexBindingsByContent.d.ts +5 -0
- package/dist/bindings/indexBindingsByContent.d.ts.map +1 -0
- package/dist/bindings/indexBindingsByContent.js +8 -0
- package/dist/bindings/indexBindingsByContent.js.map +1 -0
- package/dist/bindings/initializeBindingPromiseByNode.d.ts +5 -0
- package/dist/bindings/initializeBindingPromiseByNode.d.ts.map +1 -0
- package/dist/bindings/initializeBindingPromiseByNode.js +28 -0
- package/dist/bindings/initializeBindingPromiseByNode.js.map +1 -0
- package/dist/bindings/initializeBindings.d.ts +6 -0
- package/dist/bindings/initializeBindings.d.ts.map +1 -0
- package/dist/bindings/initializeBindings.js +59 -0
- package/dist/bindings/initializeBindings.js.map +1 -0
- package/dist/bindings/nodesByContent.d.ts +4 -0
- package/dist/bindings/nodesByContent.d.ts.map +1 -0
- package/dist/bindings/nodesByContent.js +8 -0
- package/dist/bindings/nodesByContent.js.map +1 -0
- package/dist/bindings/parseCommentNode.d.ts +3 -0
- package/dist/bindings/parseCommentNode.d.ts.map +1 -0
- package/dist/bindings/parseCommentNode.js +47 -0
- package/dist/bindings/parseCommentNode.js.map +1 -0
- package/dist/bindings/replaceToReplaceNode.d.ts +3 -0
- package/dist/bindings/replaceToReplaceNode.d.ts.map +1 -0
- package/dist/bindings/replaceToReplaceNode.js +13 -0
- package/dist/bindings/replaceToReplaceNode.js.map +1 -0
- package/dist/bindings/types.d.ts +11 -0
- package/dist/bindings/types.d.ts.map +1 -0
- package/dist/bindings/types.js +2 -0
- package/dist/bindings/types.js.map +1 -0
- package/dist/bootstrapState.d.ts +3 -0
- package/dist/bootstrapState.d.ts.map +1 -0
- package/dist/bootstrapState.js +9 -0
- package/dist/bootstrapState.js.map +1 -0
- package/dist/buildBindings.d.ts +2 -0
- package/dist/buildBindings.d.ts.map +1 -0
- package/dist/buildBindings.js +30 -0
- package/dist/buildBindings.js.map +1 -0
- package/dist/cache/cacheEntryByAbsoluteStateAddress.d.ts +6 -0
- package/dist/cache/cacheEntryByAbsoluteStateAddress.d.ts.map +1 -0
- package/dist/cache/cacheEntryByAbsoluteStateAddress.js +19 -0
- package/dist/cache/cacheEntryByAbsoluteStateAddress.js.map +1 -0
- package/dist/cache/types.d.ts +5 -0
- package/dist/cache/types.d.ts.map +1 -0
- package/dist/cache/types.js +2 -0
- package/dist/cache/types.js.map +1 -0
- package/dist/components/State.d.ts +83 -0
- package/dist/components/State.d.ts.map +1 -0
- package/dist/components/State.js +340 -0
- package/dist/components/State.js.map +1 -0
- package/dist/components/types.d.ts +26 -0
- package/dist/components/types.d.ts.map +1 -0
- package/dist/components/types.js +2 -0
- package/dist/components/types.js.map +1 -0
- package/dist/config.d.ts +4 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +49 -0
- package/dist/config.js.map +1 -0
- package/dist/createEmptyArray.d.ts +2 -0
- package/dist/createEmptyArray.d.ts.map +1 -0
- package/dist/createEmptyArray.js +4 -0
- package/dist/createEmptyArray.js.map +1 -0
- package/dist/createEmptySet.d.ts +2 -0
- package/dist/createEmptySet.d.ts.map +1 -0
- package/dist/createEmptySet.js +4 -0
- package/dist/createEmptySet.js.map +1 -0
- package/dist/define.d.ts +14 -0
- package/dist/define.d.ts.map +1 -0
- package/dist/define.js +25 -0
- package/dist/define.js.map +1 -0
- package/dist/dependency/types.d.ts +2 -0
- package/dist/dependency/types.d.ts.map +1 -0
- package/dist/dependency/types.js +2 -0
- package/dist/dependency/types.js.map +1 -0
- package/dist/dependency/walkDependency.d.ts +6 -0
- package/dist/dependency/walkDependency.d.ts.map +1 -0
- package/dist/dependency/walkDependency.js +194 -0
- package/dist/dependency/walkDependency.js.map +1 -0
- package/dist/event/checkboxHandler.d.ts +14 -0
- package/dist/event/checkboxHandler.d.ts.map +1 -0
- package/dist/event/checkboxHandler.js +120 -0
- package/dist/event/checkboxHandler.js.map +1 -0
- package/dist/event/handler.d.ts +8 -0
- package/dist/event/handler.d.ts.map +1 -0
- package/dist/event/handler.js +81 -0
- package/dist/event/handler.js.map +1 -0
- package/dist/event/isPossibleTwoWay.d.ts +2 -0
- package/dist/event/isPossibleTwoWay.d.ts.map +1 -0
- package/dist/event/isPossibleTwoWay.js +29 -0
- package/dist/event/isPossibleTwoWay.js.map +1 -0
- package/dist/event/radioHandler.d.ts +14 -0
- package/dist/event/radioHandler.d.ts.map +1 -0
- package/dist/event/radioHandler.js +101 -0
- package/dist/event/radioHandler.js.map +1 -0
- package/dist/event/twowayHandler.d.ts +14 -0
- package/dist/event/twowayHandler.d.ts.map +1 -0
- package/dist/event/twowayHandler.js +100 -0
- package/dist/event/twowayHandler.js.map +1 -0
- package/dist/exports.d.ts +3 -0
- package/dist/exports.d.ts.map +1 -0
- package/dist/exports.js +2 -0
- package/dist/exports.js.map +1 -0
- package/dist/filters/builtinFilters.d.ts +16 -0
- package/dist/filters/builtinFilters.d.ts.map +1 -0
- package/dist/filters/builtinFilters.js +716 -0
- package/dist/filters/builtinFilters.js.map +1 -0
- package/dist/filters/errorMessages.d.ts +43 -0
- package/dist/filters/errorMessages.d.ts.map +1 -0
- package/dist/filters/errorMessages.js +72 -0
- package/dist/filters/errorMessages.js.map +1 -0
- package/dist/filters/types.d.ts +23 -0
- package/dist/filters/types.d.ts.map +1 -0
- package/dist/filters/types.js +2 -0
- package/dist/filters/types.js.map +1 -0
- package/dist/getUUID.d.ts +2 -0
- package/dist/getUUID.d.ts.map +1 -0
- package/dist/getUUID.js +5 -0
- package/dist/getUUID.js.map +1 -0
- package/dist/hydrater/hydrate.d.ts +1 -0
- package/dist/hydrater/hydrate.d.ts.map +1 -0
- package/dist/hydrater/hydrate.js +2 -0
- package/dist/hydrater/hydrate.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.esm.js +5677 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/index.esm.min.js +2 -0
- package/dist/index.esm.min.js.map +1 -0
- package/dist/isCustomElement.d.ts +2 -0
- package/dist/isCustomElement.d.ts.map +1 -0
- package/dist/isCustomElement.js +26 -0
- package/dist/isCustomElement.js.map +1 -0
- package/dist/list/createListDiff.d.ts +13 -0
- package/dist/list/createListDiff.d.ts.map +1 -0
- package/dist/list/createListDiff.js +181 -0
- package/dist/list/createListDiff.js.map +1 -0
- package/dist/list/createListIndex.d.ts +10 -0
- package/dist/list/createListIndex.d.ts.map +1 -0
- package/dist/list/createListIndex.js +136 -0
- package/dist/list/createListIndex.js.map +1 -0
- package/dist/list/getIndexValueByLoopContext.d.ts +3 -0
- package/dist/list/getIndexValueByLoopContext.d.ts.map +1 -0
- package/dist/list/getIndexValueByLoopContext.js +18 -0
- package/dist/list/getIndexValueByLoopContext.js.map +1 -0
- package/dist/list/getListIndexByBindingInfo.d.ts +4 -0
- package/dist/list/getListIndexByBindingInfo.d.ts.map +1 -0
- package/dist/list/getListIndexByBindingInfo.js +32 -0
- package/dist/list/getListIndexByBindingInfo.js.map +1 -0
- package/dist/list/lastListValueByAbsoluteStateAddress.d.ts +6 -0
- package/dist/list/lastListValueByAbsoluteStateAddress.d.ts.map +1 -0
- package/dist/list/lastListValueByAbsoluteStateAddress.js +14 -0
- package/dist/list/lastListValueByAbsoluteStateAddress.js.map +1 -0
- package/dist/list/listIndexesByList.d.ts +4 -0
- package/dist/list/listIndexesByList.d.ts.map +1 -0
- package/dist/list/listIndexesByList.js +12 -0
- package/dist/list/listIndexesByList.js.map +1 -0
- package/dist/list/loopContext.d.ts +3 -0
- package/dist/list/loopContext.d.ts.map +1 -0
- package/dist/list/loopContext.js +54 -0
- package/dist/list/loopContext.js.map +1 -0
- package/dist/list/loopContextByNode.d.ts +4 -0
- package/dist/list/loopContextByNode.d.ts.map +1 -0
- package/dist/list/loopContextByNode.js +20 -0
- package/dist/list/loopContextByNode.js.map +1 -0
- package/dist/list/types.d.ts +38 -0
- package/dist/list/types.d.ts.map +1 -0
- package/dist/list/types.js +2 -0
- package/dist/list/types.js.map +1 -0
- package/dist/mustache/convertMustacheToComments.d.ts +2 -0
- package/dist/mustache/convertMustacheToComments.d.ts.map +1 -0
- package/dist/mustache/convertMustacheToComments.js +66 -0
- package/dist/mustache/convertMustacheToComments.js.map +1 -0
- package/dist/polyfills.d.ts +8 -0
- package/dist/polyfills.d.ts.map +1 -0
- package/dist/polyfills.js +22 -0
- package/dist/polyfills.js.map +1 -0
- package/dist/proxy/StateHandler.d.ts +32 -0
- package/dist/proxy/StateHandler.d.ts.map +1 -0
- package/dist/proxy/StateHandler.js +91 -0
- package/dist/proxy/StateHandler.js.map +1 -0
- package/dist/proxy/apis/connectedCallback.d.ts +18 -0
- package/dist/proxy/apis/connectedCallback.d.ts.map +1 -0
- package/dist/proxy/apis/connectedCallback.js +23 -0
- package/dist/proxy/apis/connectedCallback.js.map +1 -0
- package/dist/proxy/apis/disconnectedCallback.d.ts +17 -0
- package/dist/proxy/apis/disconnectedCallback.d.ts.map +1 -0
- package/dist/proxy/apis/disconnectedCallback.js +22 -0
- package/dist/proxy/apis/disconnectedCallback.js.map +1 -0
- package/dist/proxy/apis/getAll.d.ts +11 -0
- package/dist/proxy/apis/getAll.d.ts.map +1 -0
- package/dist/proxy/apis/getAll.js +87 -0
- package/dist/proxy/apis/getAll.js.map +1 -0
- package/dist/proxy/apis/postUpdate.d.ts +5 -0
- package/dist/proxy/apis/postUpdate.d.ts.map +1 -0
- package/dist/proxy/apis/postUpdate.js +30 -0
- package/dist/proxy/apis/postUpdate.js.map +1 -0
- package/dist/proxy/apis/resolve.d.ts +22 -0
- package/dist/proxy/apis/resolve.d.ts.map +1 -0
- package/dist/proxy/apis/resolve.js +65 -0
- package/dist/proxy/apis/resolve.js.map +1 -0
- package/dist/proxy/apis/trackDependency.d.ts +34 -0
- package/dist/proxy/apis/trackDependency.d.ts.map +1 -0
- package/dist/proxy/apis/trackDependency.js +32 -0
- package/dist/proxy/apis/trackDependency.js.map +1 -0
- package/dist/proxy/apis/updatedCallback.d.ts +28 -0
- package/dist/proxy/apis/updatedCallback.d.ts.map +1 -0
- package/dist/proxy/apis/updatedCallback.js +56 -0
- package/dist/proxy/apis/updatedCallback.js.map +1 -0
- package/dist/proxy/methods/checkDependency.d.ts +4 -0
- package/dist/proxy/methods/checkDependency.d.ts.map +1 -0
- package/dist/proxy/methods/checkDependency.js +16 -0
- package/dist/proxy/methods/checkDependency.js.map +1 -0
- package/dist/proxy/methods/getByAddress.d.ts +23 -0
- package/dist/proxy/methods/getByAddress.d.ts.map +1 -0
- package/dist/proxy/methods/getByAddress.js +81 -0
- package/dist/proxy/methods/getByAddress.js.map +1 -0
- package/dist/proxy/methods/getContextListIndex.d.ts +21 -0
- package/dist/proxy/methods/getContextListIndex.d.ts.map +1 -0
- package/dist/proxy/methods/getContextListIndex.js +32 -0
- package/dist/proxy/methods/getContextListIndex.js.map +1 -0
- package/dist/proxy/methods/getListIndex.d.ts +22 -0
- package/dist/proxy/methods/getListIndex.d.ts.map +1 -0
- package/dist/proxy/methods/getListIndex.js +55 -0
- package/dist/proxy/methods/getListIndex.js.map +1 -0
- package/dist/proxy/methods/setByAddress.d.ts +21 -0
- package/dist/proxy/methods/setByAddress.d.ts.map +1 -0
- package/dist/proxy/methods/setByAddress.js +135 -0
- package/dist/proxy/methods/setByAddress.js.map +1 -0
- package/dist/proxy/methods/setLoopContext.d.ts +22 -0
- package/dist/proxy/methods/setLoopContext.d.ts.map +1 -0
- package/dist/proxy/methods/setLoopContext.js +43 -0
- package/dist/proxy/methods/setLoopContext.js.map +1 -0
- package/dist/proxy/methods/swapInfo.d.ts +5 -0
- package/dist/proxy/methods/swapInfo.d.ts.map +1 -0
- package/dist/proxy/methods/swapInfo.js +13 -0
- package/dist/proxy/methods/swapInfo.js.map +1 -0
- package/dist/proxy/methods/types.d.ts +6 -0
- package/dist/proxy/methods/types.d.ts.map +1 -0
- package/dist/proxy/methods/types.js +2 -0
- package/dist/proxy/methods/types.js.map +1 -0
- package/dist/proxy/symbols.d.ts +8 -0
- package/dist/proxy/symbols.d.ts.map +1 -0
- package/dist/proxy/symbols.js +8 -0
- package/dist/proxy/symbols.js.map +1 -0
- package/dist/proxy/traps/get.d.ts +21 -0
- package/dist/proxy/traps/get.d.ts.map +1 -0
- package/dist/proxy/traps/get.js +120 -0
- package/dist/proxy/traps/get.js.map +1 -0
- package/dist/proxy/traps/set.d.ts +18 -0
- package/dist/proxy/traps/set.d.ts.map +1 -0
- package/dist/proxy/traps/set.js +31 -0
- package/dist/proxy/traps/set.js.map +1 -0
- package/dist/proxy/types.d.ts +27 -0
- package/dist/proxy/types.d.ts.map +1 -0
- package/dist/proxy/types.js +2 -0
- package/dist/proxy/types.js.map +1 -0
- package/dist/raiseError.d.ts +2 -0
- package/dist/raiseError.d.ts.map +1 -0
- package/dist/raiseError.js +4 -0
- package/dist/raiseError.js.map +1 -0
- package/dist/registerComponents.d.ts +2 -0
- package/dist/registerComponents.d.ts.map +1 -0
- package/dist/registerComponents.js +9 -0
- package/dist/registerComponents.js.map +1 -0
- package/dist/stateElementByName.d.ts +4 -0
- package/dist/stateElementByName.d.ts.map +1 -0
- package/dist/stateElementByName.js +53 -0
- package/dist/stateElementByName.js.map +1 -0
- package/dist/stateLoader/loadFromInnerScript.d.ts +3 -0
- package/dist/stateLoader/loadFromInnerScript.d.ts.map +1 -0
- package/dist/stateLoader/loadFromInnerScript.js +24 -0
- package/dist/stateLoader/loadFromInnerScript.js.map +1 -0
- package/dist/stateLoader/loadFromJsonFile.d.ts +3 -0
- package/dist/stateLoader/loadFromJsonFile.d.ts.map +1 -0
- package/dist/stateLoader/loadFromJsonFile.js +16 -0
- package/dist/stateLoader/loadFromJsonFile.js.map +1 -0
- package/dist/stateLoader/loadFromScriptFile.d.ts +3 -0
- package/dist/stateLoader/loadFromScriptFile.d.ts.map +1 -0
- package/dist/stateLoader/loadFromScriptFile.js +11 -0
- package/dist/stateLoader/loadFromScriptFile.js.map +1 -0
- package/dist/stateLoader/loadFromScriptJson.d.ts +3 -0
- package/dist/stateLoader/loadFromScriptJson.d.ts.map +1 -0
- package/dist/stateLoader/loadFromScriptJson.js +15 -0
- package/dist/stateLoader/loadFromScriptJson.js.map +1 -0
- package/dist/structural/activateContent.d.ts +6 -0
- package/dist/structural/activateContent.d.ts.map +1 -0
- package/dist/structural/activateContent.js +29 -0
- package/dist/structural/activateContent.js.map +1 -0
- package/dist/structural/collectStructuralFragments.d.ts +2 -0
- package/dist/structural/collectStructuralFragments.d.ts.map +1 -0
- package/dist/structural/collectStructuralFragments.js +160 -0
- package/dist/structural/collectStructuralFragments.js.map +1 -0
- package/dist/structural/contentsByNode.d.ts +5 -0
- package/dist/structural/contentsByNode.d.ts.map +1 -0
- package/dist/structural/contentsByNode.js +29 -0
- package/dist/structural/contentsByNode.js.map +1 -0
- package/dist/structural/createContent.d.ts +4 -0
- package/dist/structural/createContent.d.ts.map +1 -0
- package/dist/structural/createContent.js +92 -0
- package/dist/structural/createContent.js.map +1 -0
- package/dist/structural/createNotFilter.d.ts +3 -0
- package/dist/structural/createNotFilter.d.ts.map +1 -0
- package/dist/structural/createNotFilter.js +17 -0
- package/dist/structural/createNotFilter.js.map +1 -0
- package/dist/structural/define.d.ts +3 -0
- package/dist/structural/define.d.ts.map +1 -0
- package/dist/structural/define.js +7 -0
- package/dist/structural/define.js.map +1 -0
- package/dist/structural/expandShorthandPaths.d.ts +3 -0
- package/dist/structural/expandShorthandPaths.d.ts.map +1 -0
- package/dist/structural/expandShorthandPaths.js +96 -0
- package/dist/structural/expandShorthandPaths.js.map +1 -0
- package/dist/structural/fragmentInfoByUUID.d.ts +4 -0
- package/dist/structural/fragmentInfoByUUID.d.ts.map +1 -0
- package/dist/structural/fragmentInfoByUUID.js +30 -0
- package/dist/structural/fragmentInfoByUUID.js.map +1 -0
- package/dist/structural/getFragmentNodeInfos.d.ts +3 -0
- package/dist/structural/getFragmentNodeInfos.d.ts.map +1 -0
- package/dist/structural/getFragmentNodeInfos.js +16 -0
- package/dist/structural/getFragmentNodeInfos.js.map +1 -0
- package/dist/structural/getNodePath.d.ts +2 -0
- package/dist/structural/getNodePath.d.ts.map +1 -0
- package/dist/structural/getNodePath.js +12 -0
- package/dist/structural/getNodePath.js.map +1 -0
- package/dist/structural/optimizeFragment.d.ts +2 -0
- package/dist/structural/optimizeFragment.d.ts.map +1 -0
- package/dist/structural/optimizeFragment.js +13 -0
- package/dist/structural/optimizeFragment.js.map +1 -0
- package/dist/structural/resolveNodePath.d.ts +2 -0
- package/dist/structural/resolveNodePath.d.ts.map +1 -0
- package/dist/structural/resolveNodePath.js +13 -0
- package/dist/structural/resolveNodePath.js.map +1 -0
- package/dist/structural/types.d.ts +19 -0
- package/dist/structural/types.d.ts.map +1 -0
- package/dist/structural/types.js +2 -0
- package/dist/structural/types.js.map +1 -0
- package/dist/types.d.ts +35 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/updater/types.d.ts +7 -0
- package/dist/updater/types.d.ts.map +1 -0
- package/dist/updater/types.js +2 -0
- package/dist/updater/types.js.map +1 -0
- package/dist/updater/updater.d.ts +14 -0
- package/dist/updater/updater.d.ts.map +1 -0
- package/dist/updater/updater.js +49 -0
- package/dist/updater/updater.js.map +1 -0
- package/dist/version/types.d.ts +5 -0
- package/dist/version/types.d.ts.map +1 -0
- package/dist/version/types.js +2 -0
- package/dist/version/types.js.map +1 -0
- package/dist/version/version.d.ts +3 -0
- package/dist/version/version.d.ts.map +1 -0
- package/dist/version/version.js +9 -0
- package/dist/version/version.js.map +1 -0
- package/dist/waitForStateInitialize.d.ts +2 -0
- package/dist/waitForStateInitialize.d.ts.map +1 -0
- package/dist/waitForStateInitialize.js +12 -0
- package/dist/waitForStateInitialize.js.map +1 -0
- package/dist/webComponent/MappingRule.d.ts +10 -0
- package/dist/webComponent/MappingRule.d.ts.map +1 -0
- package/dist/webComponent/MappingRule.js +120 -0
- package/dist/webComponent/MappingRule.js.map +1 -0
- package/dist/webComponent/bindWebComponent.d.ts +3 -0
- package/dist/webComponent/bindWebComponent.d.ts.map +1 -0
- package/dist/webComponent/bindWebComponent.js +49 -0
- package/dist/webComponent/bindWebComponent.js.map +1 -0
- package/dist/webComponent/completeWebComponent.d.ts +4 -0
- package/dist/webComponent/completeWebComponent.d.ts.map +1 -0
- package/dist/webComponent/completeWebComponent.js +17 -0
- package/dist/webComponent/completeWebComponent.js.map +1 -0
- package/dist/webComponent/innerState.d.ts +3 -0
- package/dist/webComponent/innerState.d.ts.map +1 -0
- package/dist/webComponent/innerState.js +120 -0
- package/dist/webComponent/innerState.js.map +1 -0
- package/dist/webComponent/lastValueByAbsoluteStateAddress.d.ts +4 -0
- package/dist/webComponent/lastValueByAbsoluteStateAddress.d.ts.map +1 -0
- package/dist/webComponent/lastValueByAbsoluteStateAddress.js +10 -0
- package/dist/webComponent/lastValueByAbsoluteStateAddress.js.map +1 -0
- package/dist/webComponent/meltFrozenObject.d.ts +2 -0
- package/dist/webComponent/meltFrozenObject.d.ts.map +1 -0
- package/dist/webComponent/meltFrozenObject.js +17 -0
- package/dist/webComponent/meltFrozenObject.js.map +1 -0
- package/dist/webComponent/outerState.d.ts +3 -0
- package/dist/webComponent/outerState.d.ts.map +1 -0
- package/dist/webComponent/outerState.js +41 -0
- package/dist/webComponent/outerState.js.map +1 -0
- package/dist/webComponent/plainOuterState.d.ts +3 -0
- package/dist/webComponent/plainOuterState.d.ts.map +1 -0
- package/dist/webComponent/plainOuterState.js +36 -0
- package/dist/webComponent/plainOuterState.js.map +1 -0
- package/dist/webComponent/stateElementByWebComponent.d.ts +4 -0
- package/dist/webComponent/stateElementByWebComponent.d.ts.map +1 -0
- package/dist/webComponent/stateElementByWebComponent.js +17 -0
- package/dist/webComponent/stateElementByWebComponent.js.map +1 -0
- package/dist/webComponent/types.d.ts +3 -0
- package/dist/webComponent/types.d.ts.map +1 -0
- package/dist/webComponent/types.js +2 -0
- package/dist/webComponent/types.js.map +1 -0
- package/package.json +70 -0
package/README.ja.md
ADDED
|
@@ -0,0 +1,1078 @@
|
|
|
1
|
+
# @wcstack/state
|
|
2
|
+
|
|
3
|
+
Web Components のための宣言的リアクティブ状態管理。
|
|
4
|
+
`<wcs-state>` カスタム要素と `data-wcs` 属性バインディング — ランタイム依存ゼロ。
|
|
5
|
+
|
|
6
|
+
## 特徴
|
|
7
|
+
|
|
8
|
+
- **宣言的データバインディング** — `data-wcs` 属性によるプロパティ / テキスト / イベント / 構造バインディング
|
|
9
|
+
- **リアクティブ Proxy** — ES Proxy による依存追跡付き自動 DOM 更新
|
|
10
|
+
- **構造ディレクティブ** — `<template>` 要素による `for`, `if` / `elseif` / `else`
|
|
11
|
+
- **組み込みフィルタ** — フォーマット、比較、算術、日付など 40 種類
|
|
12
|
+
- **双方向バインディング** — `<input>`, `<select>`, `<textarea>` で自動有効
|
|
13
|
+
- **Web Component バインディング** — Shadow DOM コンポーネントとの双方向状態バインディング
|
|
14
|
+
- **パス getter** — ドットパスキー getter(`get "users.*.fullName"()`)によるデータツリーの任意の深さへのフラットな仮想プロパティ定義、自動依存追跡・キャッシュ
|
|
15
|
+
- **Mustache 構文** — テキストノードでの `{{ path|filter }}`
|
|
16
|
+
- **複数の状態ソース** — JSON, JS モジュール, インラインスクリプト, API, 属性
|
|
17
|
+
- **SVG サポート** — `<svg>` 要素内でのフルバインディング対応
|
|
18
|
+
- **ライフサイクルフック** — `$connectedCallback` / `$disconnectedCallback` / `$updatedCallback`、Web Component 用 `$stateReadyCallback`
|
|
19
|
+
- **依存ゼロ** — ランタイム依存なし
|
|
20
|
+
|
|
21
|
+
## インストール
|
|
22
|
+
|
|
23
|
+
### CDN(推奨)
|
|
24
|
+
|
|
25
|
+
```html
|
|
26
|
+
<!-- 自動初期化 — これだけで動作します -->
|
|
27
|
+
<script type="module" src="https://cdn.jsdelivr.net/npm/@wcstack/state/dist/auto.js"></script>
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### CDN(手動初期化)
|
|
31
|
+
|
|
32
|
+
```html
|
|
33
|
+
<script type="module">
|
|
34
|
+
import { bootstrapState } from 'https://cdn.jsdelivr.net/npm/@wcstack/state/dist/index.esm.js';
|
|
35
|
+
bootstrapState();
|
|
36
|
+
</script>
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## 基本的な使い方
|
|
40
|
+
|
|
41
|
+
```html
|
|
42
|
+
<wcs-state>
|
|
43
|
+
<script type="module">
|
|
44
|
+
export default {
|
|
45
|
+
count: 0,
|
|
46
|
+
user: { id: 1, name: "Alice" },
|
|
47
|
+
users: [
|
|
48
|
+
{ id: 1, name: "Alice" },
|
|
49
|
+
{ id: 2, name: "Bob" },
|
|
50
|
+
{ id: 3, name: "Charlie" }
|
|
51
|
+
],
|
|
52
|
+
countUp() { this.count += 1; },
|
|
53
|
+
clearCount() { this.count = 0; },
|
|
54
|
+
get "users.*.displayName"() {
|
|
55
|
+
return this["users.*.name"] + " (ID: " + this["users.*.id"] + ")";
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
</script>
|
|
59
|
+
</wcs-state>
|
|
60
|
+
|
|
61
|
+
<!-- テキストバインディング -->
|
|
62
|
+
<div data-wcs="textContent: count"></div>
|
|
63
|
+
{{ count }}
|
|
64
|
+
|
|
65
|
+
<!-- 双方向入力バインディング -->
|
|
66
|
+
<input type="text" data-wcs="value: user.name">
|
|
67
|
+
|
|
68
|
+
<!-- イベントバインディング -->
|
|
69
|
+
<button data-wcs="onclick: countUp">Increment</button>
|
|
70
|
+
|
|
71
|
+
<!-- 条件付きクラス -->
|
|
72
|
+
<div data-wcs="textContent: count; class.over: count|gt(10)"></div>
|
|
73
|
+
|
|
74
|
+
<!-- ループ -->
|
|
75
|
+
<template data-wcs="for: users">
|
|
76
|
+
<div>
|
|
77
|
+
<span data-wcs="textContent: .id"></span>:
|
|
78
|
+
<span data-wcs="textContent: .displayName"></span>
|
|
79
|
+
</div>
|
|
80
|
+
</template>
|
|
81
|
+
|
|
82
|
+
<!-- 条件分岐レンダリング -->
|
|
83
|
+
<template data-wcs="if: count|gt(0)">
|
|
84
|
+
<p>カウントは正の値です。</p>
|
|
85
|
+
</template>
|
|
86
|
+
<template data-wcs="elseif: count|lt(0)">
|
|
87
|
+
<p>カウントは負の値です。</p>
|
|
88
|
+
</template>
|
|
89
|
+
<template data-wcs="else:">
|
|
90
|
+
<p>カウントはゼロです。</p>
|
|
91
|
+
</template>
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
## 状態の初期化
|
|
95
|
+
|
|
96
|
+
`<wcs-state>` は複数の方法で初期状態を読み込めます:
|
|
97
|
+
|
|
98
|
+
```html
|
|
99
|
+
<!-- 1. <script type="application/json"> を id で参照 -->
|
|
100
|
+
<script type="application/json" id="state">
|
|
101
|
+
{ "count": 0 }
|
|
102
|
+
</script>
|
|
103
|
+
<wcs-state state="state"></wcs-state>
|
|
104
|
+
|
|
105
|
+
<!-- 2. インライン JSON 属性 -->
|
|
106
|
+
<wcs-state json='{ "count": 0 }'></wcs-state>
|
|
107
|
+
|
|
108
|
+
<!-- 3. 外部 JSON ファイル -->
|
|
109
|
+
<wcs-state src="./data.json"></wcs-state>
|
|
110
|
+
|
|
111
|
+
<!-- 4. 外部 JS モジュール (export default { ... }) -->
|
|
112
|
+
<wcs-state src="./state.js"></wcs-state>
|
|
113
|
+
|
|
114
|
+
<!-- 5. インラインスクリプトモジュール -->
|
|
115
|
+
<wcs-state>
|
|
116
|
+
<script type="module">
|
|
117
|
+
export default { count: 0 };
|
|
118
|
+
</script>
|
|
119
|
+
</wcs-state>
|
|
120
|
+
|
|
121
|
+
<!-- 6. プログラム API -->
|
|
122
|
+
<script>
|
|
123
|
+
const el = document.createElement('wcs-state');
|
|
124
|
+
el.setInitialState({ count: 0 });
|
|
125
|
+
document.body.appendChild(el);
|
|
126
|
+
</script>
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
解決順序: `state` → `src` (.json / .js) → `json` → 内包 `<script>` → `setInitialState()` 待機。
|
|
130
|
+
|
|
131
|
+
### 名前付き状態
|
|
132
|
+
|
|
133
|
+
複数の状態要素を `name` 属性で共存できます。バインディングでは `@name` で参照します:
|
|
134
|
+
|
|
135
|
+
```html
|
|
136
|
+
<wcs-state name="cart">...</wcs-state>
|
|
137
|
+
<wcs-state name="user">...</wcs-state>
|
|
138
|
+
|
|
139
|
+
<div data-wcs="textContent: total@cart"></div>
|
|
140
|
+
<div data-wcs="textContent: name@user"></div>
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
デフォルト名は `"default"`(`@` 不要)です。
|
|
144
|
+
|
|
145
|
+
## 状態の更新
|
|
146
|
+
|
|
147
|
+
状態の変更は**プロパティへの代入**(Proxy の `set` トラップ)で検知されます。リアクティブな DOM 更新をトリガーするには、状態プロパティに値を**代入**する必要があります。
|
|
148
|
+
|
|
149
|
+
### プリミティブ・オブジェクトプロパティ
|
|
150
|
+
|
|
151
|
+
直接のプロパティ代入は任意の深さで検知されます:
|
|
152
|
+
|
|
153
|
+
```javascript
|
|
154
|
+
this.count = 10; // ✅ 検知される
|
|
155
|
+
this.user.name = "Bob"; // ✅ 検知される(ネストされた代入)
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
### 配列
|
|
159
|
+
|
|
160
|
+
配列の破壊的メソッド(`push`, `splice`, `sort`, `reverse` 等)はその場で配列を変更するだけで**プロパティ代入を発生させない**ため、リアクティブシステムは変更を検知しません。代わりに、新しい配列を返す**非破壊的メソッド**を使用し、結果を代入してください:
|
|
161
|
+
|
|
162
|
+
```javascript
|
|
163
|
+
// ✅ 非破壊的 + 代入 — 変更が検知される
|
|
164
|
+
this.items = this.items.concat({ id: 4, text: "New" });
|
|
165
|
+
this.items = this.items.toSpliced(index, 1);
|
|
166
|
+
this.items = this.items.filter(item => !item.done);
|
|
167
|
+
this.items = this.items.toSorted((a, b) => a.id - b.id);
|
|
168
|
+
this.items = this.items.toReversed();
|
|
169
|
+
this.items = this.items.with(index, newValue);
|
|
170
|
+
|
|
171
|
+
// ❌ 破壊的 — 代入なし、変更は検知されない
|
|
172
|
+
this.items.push({ id: 4, text: "New" });
|
|
173
|
+
this.items.splice(index, 1);
|
|
174
|
+
this.items.sort((a, b) => a.id - b.id);
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
## バインディング構文
|
|
178
|
+
|
|
179
|
+
### `data-wcs` 属性
|
|
180
|
+
|
|
181
|
+
```
|
|
182
|
+
property[#modifier]: path[@state][|filter[|filter(args)...]]
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
複数バインディングは `;` で区切ります:
|
|
186
|
+
|
|
187
|
+
```html
|
|
188
|
+
<div data-wcs="textContent: count; class.over: count|gt(10)"></div>
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
| 要素 | 説明 | 例 |
|
|
192
|
+
|---|---|---|
|
|
193
|
+
| `property` | バインドする DOM プロパティ | `value`, `textContent`, `checked` |
|
|
194
|
+
| `#modifier` | バインディング修飾子 | `#ro`, `#prevent`, `#stop`, `#onchange` |
|
|
195
|
+
| `path` | 状態プロパティパス | `count`, `user.name`, `users.*.name` |
|
|
196
|
+
| `@state` | 名前付き状態の参照 | `@cart`, `@user` |
|
|
197
|
+
| `\|filter` | 変換フィルタチェーン | `\|gt(0)`, `\|round\|locale` |
|
|
198
|
+
|
|
199
|
+
### プロパティ種別
|
|
200
|
+
|
|
201
|
+
| プロパティ | 説明 |
|
|
202
|
+
|---|---|
|
|
203
|
+
| `value` | 要素の値(input では双方向) |
|
|
204
|
+
| `checked` | チェックボックス / ラジオボタンの選択状態(双方向) |
|
|
205
|
+
| `textContent` | テキストコンテンツ |
|
|
206
|
+
| `text` | textContent のエイリアス |
|
|
207
|
+
| `html` | innerHTML |
|
|
208
|
+
| `class.NAME` | CSS クラスの切り替え |
|
|
209
|
+
| `style.PROP` | CSS スタイルプロパティの設定 |
|
|
210
|
+
| `attr.NAME` | 属性の設定(SVG 名前空間対応) |
|
|
211
|
+
| `radio` | ラジオボタングループバインディング(双方向) |
|
|
212
|
+
| `checkbox` | チェックボックスグループの配列バインディング(双方向) |
|
|
213
|
+
| `onclick`, `on*` | イベントハンドラバインディング |
|
|
214
|
+
|
|
215
|
+
### 修飾子
|
|
216
|
+
|
|
217
|
+
| 修飾子 | 説明 |
|
|
218
|
+
|---|---|
|
|
219
|
+
| `#ro` | 読み取り専用 — 双方向バインディングを無効化 |
|
|
220
|
+
| `#prevent` | イベントハンドラで `event.preventDefault()` を呼び出す |
|
|
221
|
+
| `#stop` | イベントハンドラで `event.stopPropagation()` を呼び出す |
|
|
222
|
+
| `#onchange` | 双方向バインディングで `input` の代わりに `change` イベントを使用 |
|
|
223
|
+
|
|
224
|
+
### 双方向バインディング
|
|
225
|
+
|
|
226
|
+
以下の要素で自動的に有効化されます:
|
|
227
|
+
|
|
228
|
+
| 要素 | プロパティ | イベント |
|
|
229
|
+
|---|---|---|
|
|
230
|
+
| `<input type="checkbox/radio">` | `checked` | `input` |
|
|
231
|
+
| `<input>`(その他の type) | `value`, `valueAsNumber`, `valueAsDate` | `input` |
|
|
232
|
+
| `<select>` | `value` | `change` |
|
|
233
|
+
| `<textarea>` | `value` | `input` |
|
|
234
|
+
|
|
235
|
+
`<input type="button">` は除外されます。`#ro` で無効化、`#onchange` でイベントを変更できます。
|
|
236
|
+
|
|
237
|
+
### ラジオボタンバインディング
|
|
238
|
+
|
|
239
|
+
`radio` でラジオボタングループを単一の状態値にバインドします:
|
|
240
|
+
|
|
241
|
+
```html
|
|
242
|
+
<input type="radio" value="red" data-wcs="radio: selectedColor">
|
|
243
|
+
<input type="radio" value="blue" data-wcs="radio: selectedColor">
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
状態値と一致する `value` を持つラジオボタンが自動的にチェックされます。ユーザーが別のラジオボタンを選択すると、状態が更新されます。`#ro` で読み取り専用にできます。
|
|
247
|
+
|
|
248
|
+
`for` ループ内での使用:
|
|
249
|
+
|
|
250
|
+
```html
|
|
251
|
+
<template data-wcs="for: branches">
|
|
252
|
+
<label>
|
|
253
|
+
<input type="radio" data-wcs="value: .; radio: currentBranch">
|
|
254
|
+
{{ . }}
|
|
255
|
+
</label>
|
|
256
|
+
</template>
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
### チェックボックスバインディング
|
|
260
|
+
|
|
261
|
+
`checkbox` でチェックボックスグループを状態配列にバインドします:
|
|
262
|
+
|
|
263
|
+
```html
|
|
264
|
+
<input type="checkbox" value="apple" data-wcs="checkbox: selectedFruits">
|
|
265
|
+
<input type="checkbox" value="banana" data-wcs="checkbox: selectedFruits">
|
|
266
|
+
<input type="checkbox" value="orange" data-wcs="checkbox: selectedFruits">
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
チェックボックスの `value` が状態配列に含まれている場合にチェック状態になります。チェックボックスの切り替えで配列への値の追加・削除が行われます。`|int` で文字列値を数値に変換、`#ro` で読み取り専用にできます。
|
|
270
|
+
|
|
271
|
+
### Mustache 構文
|
|
272
|
+
|
|
273
|
+
`enableMustache` が `true`(デフォルト)の場合、テキストノードで `{{ expression }}` が使用できます:
|
|
274
|
+
|
|
275
|
+
```html
|
|
276
|
+
<p>こんにちは、{{ user.name }}さん!</p>
|
|
277
|
+
<p>カウント: {{ count|locale }}</p>
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
内部的にはコメントベースのバインディング(`<!--@@:expression-->`)に変換されます。
|
|
281
|
+
|
|
282
|
+
## 構造ディレクティブ
|
|
283
|
+
|
|
284
|
+
構造ディレクティブは `<template>` 要素で使用します:
|
|
285
|
+
|
|
286
|
+
### ループ (`for`)
|
|
287
|
+
|
|
288
|
+
```html
|
|
289
|
+
<template data-wcs="for: users">
|
|
290
|
+
<div>
|
|
291
|
+
<!-- フルパス -->
|
|
292
|
+
<span data-wcs="textContent: users.*.name"></span>
|
|
293
|
+
<!-- 省略形(ループコンテキストからの相対パス) -->
|
|
294
|
+
<span data-wcs="textContent: .name"></span>
|
|
295
|
+
</div>
|
|
296
|
+
</template>
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
#### ドット省略記法
|
|
300
|
+
|
|
301
|
+
`for` ループ内では、`.` で始まるパスがループの配列パスを基準に展開されます:
|
|
302
|
+
|
|
303
|
+
| 省略形 | 展開後 | 説明 |
|
|
304
|
+
|---|---|---|
|
|
305
|
+
| `.name` | `users.*.name` | 現在の要素のプロパティ |
|
|
306
|
+
| `.` | `users.*` | 現在の要素そのもの |
|
|
307
|
+
| `.name\|uc` | `users.*.name\|uc` | フィルタは保持される |
|
|
308
|
+
| `.name@state` | `users.*.name@state` | 状態名は保持される |
|
|
309
|
+
|
|
310
|
+
プリミティブ配列では、`.` が要素の値を直接参照します:
|
|
311
|
+
|
|
312
|
+
```html
|
|
313
|
+
<template data-wcs="for: branches">
|
|
314
|
+
<label>
|
|
315
|
+
<input type="radio" data-wcs="value: .; radio: currentBranch">
|
|
316
|
+
{{ . }}
|
|
317
|
+
</label>
|
|
318
|
+
</template>
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
多重ワイルドカードによるネストループに対応しています。ネストされた `for` ディレクティブの `.` 省略記法も親ループのパスを基準に展開されます:
|
|
322
|
+
|
|
323
|
+
```html
|
|
324
|
+
<template data-wcs="for: regions">
|
|
325
|
+
<!-- .states → regions.*.states -->
|
|
326
|
+
<template data-wcs="for: .states">
|
|
327
|
+
<!-- .name → regions.*.states.*.name -->
|
|
328
|
+
<span data-wcs="textContent: .name"></span>
|
|
329
|
+
</template>
|
|
330
|
+
</template>
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
### 条件分岐 (`if` / `elseif` / `else`)
|
|
334
|
+
|
|
335
|
+
```html
|
|
336
|
+
<template data-wcs="if: count|gt(0)">
|
|
337
|
+
<p>正の値</p>
|
|
338
|
+
</template>
|
|
339
|
+
<template data-wcs="elseif: count|lt(0)">
|
|
340
|
+
<p>負の値</p>
|
|
341
|
+
</template>
|
|
342
|
+
<template data-wcs="else:">
|
|
343
|
+
<p>ゼロ</p>
|
|
344
|
+
</template>
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+
条件をチェーンできます。`elseif` は前の条件を自動的に反転します。
|
|
348
|
+
|
|
349
|
+
## パス getter(算出プロパティ)
|
|
350
|
+
|
|
351
|
+
**パス getter** は `@wcstack/state` の中核機能です。JavaScript の getter に**ドットパス文字列キー**とワイルドカード(`*`)を使って定義します。**データツリーの任意の深さに仮想プロパティを追加でき、すべてを1箇所にフラットに定義できます**。データのネストがどれほど深くても、定義側は同じレベルに並び、ループ要素ごとの自動依存追跡が機能します。
|
|
352
|
+
|
|
353
|
+
### 基本的なパス getter
|
|
354
|
+
|
|
355
|
+
```html
|
|
356
|
+
<wcs-state>
|
|
357
|
+
<script type="module">
|
|
358
|
+
export default {
|
|
359
|
+
users: [
|
|
360
|
+
{ id: 1, firstName: "Alice", lastName: "Smith" },
|
|
361
|
+
{ id: 2, firstName: "Bob", lastName: "Jones" }
|
|
362
|
+
],
|
|
363
|
+
// パス getter — ループ内で要素ごとに実行
|
|
364
|
+
get "users.*.fullName"() {
|
|
365
|
+
return this["users.*.firstName"] + " " + this["users.*.lastName"];
|
|
366
|
+
},
|
|
367
|
+
get "users.*.displayName"() {
|
|
368
|
+
return this["users.*.fullName"] + " (ID: " + this["users.*.id"] + ")";
|
|
369
|
+
}
|
|
370
|
+
};
|
|
371
|
+
</script>
|
|
372
|
+
</wcs-state>
|
|
373
|
+
|
|
374
|
+
<template data-wcs="for: users">
|
|
375
|
+
<div data-wcs="textContent: .displayName"></div>
|
|
376
|
+
</template>
|
|
377
|
+
<!-- 出力:
|
|
378
|
+
Alice Smith (ID: 1)
|
|
379
|
+
Bob Jones (ID: 2)
|
|
380
|
+
-->
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
パス getter 内の `this["users.*.firstName"]` は、手動でインデックスを指定することなく、自動的に現在のループ要素に解決されます。
|
|
384
|
+
|
|
385
|
+
### トップレベル算出プロパティ
|
|
386
|
+
|
|
387
|
+
ワイルドカードなしの getter は通常の算出プロパティとして動作します:
|
|
388
|
+
|
|
389
|
+
```javascript
|
|
390
|
+
export default {
|
|
391
|
+
price: 100,
|
|
392
|
+
tax: 0.1,
|
|
393
|
+
get total() {
|
|
394
|
+
return this.price * (1 + this.tax);
|
|
395
|
+
}
|
|
396
|
+
};
|
|
397
|
+
```
|
|
398
|
+
|
|
399
|
+
### getter のチェーン
|
|
400
|
+
|
|
401
|
+
パス getter は他のパス getter を参照でき、依存チェーンを形成します。上流の値が変更されると、キャッシュは自動的に無効化されます:
|
|
402
|
+
|
|
403
|
+
```html
|
|
404
|
+
<wcs-state>
|
|
405
|
+
<script type="module">
|
|
406
|
+
export default {
|
|
407
|
+
taxRate: 0.1,
|
|
408
|
+
cart: {
|
|
409
|
+
items: [
|
|
410
|
+
{ productId: "P001", quantity: 2, unitPrice: 500 },
|
|
411
|
+
{ productId: "P002", quantity: 1, unitPrice: 1200 }
|
|
412
|
+
]
|
|
413
|
+
},
|
|
414
|
+
// アイテムごとの小計
|
|
415
|
+
get "cart.items.*.subtotal"() {
|
|
416
|
+
return this["cart.items.*.unitPrice"] * this["cart.items.*.quantity"];
|
|
417
|
+
},
|
|
418
|
+
// 集計: 全小計の合計
|
|
419
|
+
get "cart.totalPrice"() {
|
|
420
|
+
return this.$getAll("cart.items.*.subtotal", []).reduce((sum, v) => sum + v, 0);
|
|
421
|
+
},
|
|
422
|
+
// チェーン: totalPrice から税を算出
|
|
423
|
+
get "cart.tax"() {
|
|
424
|
+
return this["cart.totalPrice"] * this.taxRate;
|
|
425
|
+
},
|
|
426
|
+
// チェーン: 合計金額
|
|
427
|
+
get "cart.grandTotal"() {
|
|
428
|
+
return this["cart.totalPrice"] + this["cart.tax"];
|
|
429
|
+
}
|
|
430
|
+
};
|
|
431
|
+
</script>
|
|
432
|
+
</wcs-state>
|
|
433
|
+
|
|
434
|
+
<template data-wcs="for: cart.items">
|
|
435
|
+
<div>
|
|
436
|
+
<span data-wcs="textContent: .productId"></span>:
|
|
437
|
+
<span data-wcs="textContent: .subtotal|locale"></span>
|
|
438
|
+
</div>
|
|
439
|
+
</template>
|
|
440
|
+
<p>合計: <span data-wcs="textContent: cart.totalPrice|locale"></span></p>
|
|
441
|
+
<p>税: <span data-wcs="textContent: cart.tax|locale"></span></p>
|
|
442
|
+
<p>総合計: <span data-wcs="textContent: cart.grandTotal|locale"></span></p>
|
|
443
|
+
```
|
|
444
|
+
|
|
445
|
+
依存チェーン: `cart.grandTotal` → `cart.tax` → `cart.totalPrice` → `cart.items.*.subtotal` → `cart.items.*.unitPrice` / `cart.items.*.quantity`。アイテムの `unitPrice` や `quantity` を変更すると、チェーン全体が自動的に再計算されます。
|
|
446
|
+
|
|
447
|
+
### ネストされたワイルドカード getter
|
|
448
|
+
|
|
449
|
+
ネストされた配列構造では複数のワイルドカードが使用できます:
|
|
450
|
+
|
|
451
|
+
```html
|
|
452
|
+
<wcs-state>
|
|
453
|
+
<script type="module">
|
|
454
|
+
export default {
|
|
455
|
+
categories: [
|
|
456
|
+
{
|
|
457
|
+
name: "果物",
|
|
458
|
+
items: [
|
|
459
|
+
{ name: "りんご", price: 150 },
|
|
460
|
+
{ name: "バナナ", price: 100 }
|
|
461
|
+
]
|
|
462
|
+
},
|
|
463
|
+
{
|
|
464
|
+
name: "野菜",
|
|
465
|
+
items: [
|
|
466
|
+
{ name: "にんじん", price: 80 }
|
|
467
|
+
]
|
|
468
|
+
}
|
|
469
|
+
],
|
|
470
|
+
get "categories.*.items.*.label"() {
|
|
471
|
+
return this["categories.*.name"] + " / " + this["categories.*.items.*.name"];
|
|
472
|
+
}
|
|
473
|
+
};
|
|
474
|
+
</script>
|
|
475
|
+
</wcs-state>
|
|
476
|
+
|
|
477
|
+
<template data-wcs="for: categories">
|
|
478
|
+
<h3 data-wcs="textContent: .name"></h3>
|
|
479
|
+
<template data-wcs="for: .items">
|
|
480
|
+
<div data-wcs="textContent: .label"></div>
|
|
481
|
+
</template>
|
|
482
|
+
</template>
|
|
483
|
+
<!-- 出力:
|
|
484
|
+
果物
|
|
485
|
+
果物 / りんご
|
|
486
|
+
果物 / バナナ
|
|
487
|
+
野菜
|
|
488
|
+
野菜 / にんじん
|
|
489
|
+
-->
|
|
490
|
+
```
|
|
491
|
+
|
|
492
|
+
### フラットな仮想プロパティ — ネストの深さに依存しない定義
|
|
493
|
+
|
|
494
|
+
パス getter の重要な利点は、**データのネストがどれほど深くても、すべての仮想プロパティを1箇所にフラットに定義できる**ことです。各ネストレベルに算出プロパティを持たせるためだけにコンポーネントを分割する必要がありません。
|
|
495
|
+
|
|
496
|
+
```javascript
|
|
497
|
+
export default {
|
|
498
|
+
regions: [
|
|
499
|
+
{ name: "関東", prefectures: [
|
|
500
|
+
{ name: "東京", cities: [
|
|
501
|
+
{ name: "渋谷", population: 230000, area: 15.11 },
|
|
502
|
+
{ name: "新宿", population: 346000, area: 18.22 }
|
|
503
|
+
]},
|
|
504
|
+
{ name: "神奈川", cities: [
|
|
505
|
+
{ name: "横浜", population: 3750000, area: 437.56 }
|
|
506
|
+
]}
|
|
507
|
+
]}
|
|
508
|
+
],
|
|
509
|
+
|
|
510
|
+
// --- ネストの深さに関係なく、すべてフラットに定義 ---
|
|
511
|
+
|
|
512
|
+
// 市レベル — 仮想プロパティ
|
|
513
|
+
get "regions.*.prefectures.*.cities.*.density"() {
|
|
514
|
+
return this["regions.*.prefectures.*.cities.*.population"]
|
|
515
|
+
/ this["regions.*.prefectures.*.cities.*.area"];
|
|
516
|
+
},
|
|
517
|
+
get "regions.*.prefectures.*.cities.*.label"() {
|
|
518
|
+
return this["regions.*.prefectures.*.name"] + " "
|
|
519
|
+
+ this["regions.*.prefectures.*.cities.*.name"];
|
|
520
|
+
},
|
|
521
|
+
|
|
522
|
+
// 県レベル — 市からの集約
|
|
523
|
+
get "regions.*.prefectures.*.totalPopulation"() {
|
|
524
|
+
return this.$getAll("regions.*.prefectures.*.cities.*.population", [])
|
|
525
|
+
.reduce((a, b) => a + b, 0);
|
|
526
|
+
},
|
|
527
|
+
|
|
528
|
+
// 地方レベル — 県からの集約
|
|
529
|
+
get "regions.*.totalPopulation"() {
|
|
530
|
+
return this.$getAll("regions.*.prefectures.*.totalPopulation", [])
|
|
531
|
+
.reduce((a, b) => a + b, 0);
|
|
532
|
+
},
|
|
533
|
+
|
|
534
|
+
// トップレベル — 地方からの集約
|
|
535
|
+
get totalPopulation() {
|
|
536
|
+
return this.$getAll("regions.*.totalPopulation", [])
|
|
537
|
+
.reduce((a, b) => a + b, 0);
|
|
538
|
+
}
|
|
539
|
+
};
|
|
540
|
+
```
|
|
541
|
+
|
|
542
|
+
3階層のネスト、5つの仮想プロパティ — すべてが1つのフラットなオブジェクト内に並んで定義されています。各レベルは任意の深さの値を参照でき、`$getAll` による集約は下位から上位へ自然に流れます。コンポーネントベースのフレームワーク(React、Vue)で同じことを実現するには、各ネストレベルに個別のコンポーネントを作成し、算出値をツリーの上位に渡すための props バケツリレーや状態管理が必要になります。
|
|
543
|
+
|
|
544
|
+
### getter の戻り値のサブプロパティへのアクセス
|
|
545
|
+
|
|
546
|
+
パス getter がオブジェクトを返す場合、ドットパスでそのサブプロパティにアクセスできます:
|
|
547
|
+
|
|
548
|
+
```javascript
|
|
549
|
+
export default {
|
|
550
|
+
products: [
|
|
551
|
+
{ id: "P001", name: "ウィジェット", price: 500, stock: 10 },
|
|
552
|
+
{ id: "P002", name: "ガジェット", price: 1200, stock: 3 }
|
|
553
|
+
],
|
|
554
|
+
cart: {
|
|
555
|
+
items: [
|
|
556
|
+
{ productId: "P001", quantity: 2 },
|
|
557
|
+
{ productId: "P002", quantity: 1 }
|
|
558
|
+
]
|
|
559
|
+
},
|
|
560
|
+
get productByProductId() {
|
|
561
|
+
return new Map(this.products.map(p => [p.id, p]));
|
|
562
|
+
},
|
|
563
|
+
// 完全な product オブジェクトを返す
|
|
564
|
+
get "cart.items.*.product"() {
|
|
565
|
+
return this.productByProductId.get(this["cart.items.*.productId"]);
|
|
566
|
+
},
|
|
567
|
+
// 戻り値のサブプロパティにアクセス
|
|
568
|
+
get "cart.items.*.total"() {
|
|
569
|
+
return this["cart.items.*.product.price"] * this["cart.items.*.quantity"];
|
|
570
|
+
}
|
|
571
|
+
};
|
|
572
|
+
```
|
|
573
|
+
|
|
574
|
+
`this["cart.items.*.product.price"]` は `cart.items.*.product` getter が返すオブジェクトを透過的にチェーンします。
|
|
575
|
+
|
|
576
|
+
### パス setter
|
|
577
|
+
|
|
578
|
+
`set "path"()` でカスタム setter ロジックを定義できます:
|
|
579
|
+
|
|
580
|
+
```javascript
|
|
581
|
+
export default {
|
|
582
|
+
users: [
|
|
583
|
+
{ firstName: "Alice", lastName: "Smith" },
|
|
584
|
+
{ firstName: "Bob", lastName: "Jones" }
|
|
585
|
+
],
|
|
586
|
+
get "users.*.fullName"() {
|
|
587
|
+
return this["users.*.firstName"] + " " + this["users.*.lastName"];
|
|
588
|
+
},
|
|
589
|
+
set "users.*.fullName"(value) {
|
|
590
|
+
const [first, ...rest] = value.split(" ");
|
|
591
|
+
this["users.*.firstName"] = first;
|
|
592
|
+
this["users.*.lastName"] = rest.join(" ");
|
|
593
|
+
}
|
|
594
|
+
};
|
|
595
|
+
```
|
|
596
|
+
|
|
597
|
+
```html
|
|
598
|
+
<template data-wcs="for: users">
|
|
599
|
+
<input type="text" data-wcs="value: .fullName">
|
|
600
|
+
</template>
|
|
601
|
+
```
|
|
602
|
+
|
|
603
|
+
パス setter は双方向バインディングと連携します — input を編集すると setter が呼ばれ、`firstName` / `lastName` に分割して書き戻します。
|
|
604
|
+
|
|
605
|
+
### 対応するパス getter パターン
|
|
606
|
+
|
|
607
|
+
| パターン | 説明 | 例 |
|
|
608
|
+
|---|---|---|
|
|
609
|
+
| `get prop()` | トップレベル算出 | `get total()` |
|
|
610
|
+
| `get "a.b"()` | ネスト算出(ワイルドカードなし) | `get "cart.totalPrice"()` |
|
|
611
|
+
| `get "a.*.b"()` | 単一ワイルドカード | `get "users.*.fullName"()` |
|
|
612
|
+
| `get "a.*.b.*.c"()` | 複数ワイルドカード | `get "categories.*.items.*.label"()` |
|
|
613
|
+
| `set "a.*.b"(v)` | ワイルドカード setter | `set "users.*.fullName"(v)` |
|
|
614
|
+
|
|
615
|
+
### 仕組み
|
|
616
|
+
|
|
617
|
+
1. **コンテキスト解決** — `for:` ループのレンダリング時に、各イテレーションが `ListIndex` をアドレススタックにプッシュします。パス getter 内の `this["users.*.name"]` はこのスタックを使って `*` を解決するため、常に現在の要素を参照します。
|
|
618
|
+
|
|
619
|
+
2. **自動依存追跡** — getter が `this["users.*.name"]` にアクセスすると、`users.*.name` から getter のパスへの動的依存が登録されます。`users.*.name` が変更されると、getter のキャッシュが dirty になります。
|
|
620
|
+
|
|
621
|
+
3. **キャッシュ** — getter の結果は具体的なアドレス(パス + ループインデックス)ごとにキャッシュされます。`users.*.fullName` のインデックス 0 とインデックス 1 は別々のキャッシュエントリを持ちます。依存先が変更された場合のみキャッシュが無効化されます。
|
|
622
|
+
|
|
623
|
+
4. **直接インデックスアクセス** — 数値インデックスで特定の要素にアクセスすることもできます:`this["users.0.name"]` はループコンテキストなしで `users[0].name` に解決されます。
|
|
624
|
+
|
|
625
|
+
### ループインデックス変数(`$1`, `$2`, ...)
|
|
626
|
+
|
|
627
|
+
getter やイベントハンドラ内で、`this.$1`、`this.$2` などで現在のループイテレーションのインデックスを取得できます(0始まりの値、1始まりの命名):
|
|
628
|
+
|
|
629
|
+
```javascript
|
|
630
|
+
export default {
|
|
631
|
+
users: ["Alice", "Bob", "Charlie"],
|
|
632
|
+
get "users.*.rowLabel"() {
|
|
633
|
+
return "#" + (this.$1 + 1) + ": " + this["users.*"];
|
|
634
|
+
}
|
|
635
|
+
};
|
|
636
|
+
```
|
|
637
|
+
|
|
638
|
+
```html
|
|
639
|
+
<template data-wcs="for: users">
|
|
640
|
+
<div data-wcs="textContent: .rowLabel"></div>
|
|
641
|
+
</template>
|
|
642
|
+
<!-- 出力:
|
|
643
|
+
#1: Alice
|
|
644
|
+
#2: Bob
|
|
645
|
+
#3: Charlie
|
|
646
|
+
-->
|
|
647
|
+
```
|
|
648
|
+
|
|
649
|
+
ネストループでは、`$1` が外側のインデックス、`$2` が内側のインデックスです。
|
|
650
|
+
|
|
651
|
+
テンプレート内でループインデックスを直接表示することもできます:
|
|
652
|
+
|
|
653
|
+
```html
|
|
654
|
+
<template data-wcs="for: items">
|
|
655
|
+
<td>{{ $1|inc(1) }}</td> <!-- 1始まりの行番号 -->
|
|
656
|
+
</template>
|
|
657
|
+
```
|
|
658
|
+
|
|
659
|
+
### Proxy API
|
|
660
|
+
|
|
661
|
+
状態オブジェクト内(getter / メソッド)で `this` 経由で以下の API が利用できます:
|
|
662
|
+
|
|
663
|
+
| API | 説明 |
|
|
664
|
+
|---|---|
|
|
665
|
+
| `this.$getAll(path, indexes?)` | ワイルドカードパスにマッチする全ての値を取得 |
|
|
666
|
+
| `this.$resolve(path, indexes, value?)` | ワイルドカードパスを特定のインデックスで解決 |
|
|
667
|
+
| `this.$postUpdate(path)` | 指定パスの更新通知を手動で発行 |
|
|
668
|
+
| `this.$trackDependency(path)` | キャッシュ無効化のための依存関係を手動で登録 |
|
|
669
|
+
| `this.$stateElement` | `IStateElement` インスタンスへのアクセス |
|
|
670
|
+
| `this.$1`, `this.$2`, ... | 現在のループインデックス(1始まりの命名、0始まりの値) |
|
|
671
|
+
|
|
672
|
+
#### `$getAll` — 配列要素全体の集計
|
|
673
|
+
|
|
674
|
+
`$getAll` はワイルドカードパスにマッチする全ての値を配列として収集します。集計パターンに不可欠です:
|
|
675
|
+
|
|
676
|
+
```javascript
|
|
677
|
+
export default {
|
|
678
|
+
scores: [85, 92, 78, 95, 88],
|
|
679
|
+
get average() {
|
|
680
|
+
const all = this.$getAll("scores.*", []);
|
|
681
|
+
return all.reduce((sum, v) => sum + v, 0) / all.length;
|
|
682
|
+
},
|
|
683
|
+
get max() {
|
|
684
|
+
return Math.max(...this.$getAll("scores.*", []));
|
|
685
|
+
}
|
|
686
|
+
};
|
|
687
|
+
```
|
|
688
|
+
|
|
689
|
+
#### `$resolve` — 明示的なインデックスでのアクセス
|
|
690
|
+
|
|
691
|
+
`$resolve` は特定のワイルドカードインデックスの値を読み書きします:
|
|
692
|
+
|
|
693
|
+
```javascript
|
|
694
|
+
export default {
|
|
695
|
+
items: ["A", "B", "C"],
|
|
696
|
+
swapFirstTwo() {
|
|
697
|
+
const a = this.$resolve("items.*", [0]);
|
|
698
|
+
const b = this.$resolve("items.*", [1]);
|
|
699
|
+
this.$resolve("items.*", [0], b);
|
|
700
|
+
this.$resolve("items.*", [1], a);
|
|
701
|
+
}
|
|
702
|
+
};
|
|
703
|
+
```
|
|
704
|
+
|
|
705
|
+
## イベントハンドリング
|
|
706
|
+
|
|
707
|
+
`on*` プロパティでイベントハンドラをバインドします:
|
|
708
|
+
|
|
709
|
+
```html
|
|
710
|
+
<button data-wcs="onclick: handleClick">クリック</button>
|
|
711
|
+
<form data-wcs="onsubmit#prevent: handleSubmit">...</form>
|
|
712
|
+
```
|
|
713
|
+
|
|
714
|
+
ハンドラメソッドはイベントとループインデックスを受け取ります:
|
|
715
|
+
|
|
716
|
+
```javascript
|
|
717
|
+
export default {
|
|
718
|
+
items: ["A", "B", "C"],
|
|
719
|
+
handleClick(event) {
|
|
720
|
+
console.log("clicked");
|
|
721
|
+
},
|
|
722
|
+
removeItem(event, index) {
|
|
723
|
+
// index はループコンテキスト ($1)
|
|
724
|
+
this.items = this.items.toSpliced(index, 1);
|
|
725
|
+
}
|
|
726
|
+
};
|
|
727
|
+
```
|
|
728
|
+
|
|
729
|
+
```html
|
|
730
|
+
<template data-wcs="for: items">
|
|
731
|
+
<button data-wcs="onclick: removeItem">削除</button>
|
|
732
|
+
</template>
|
|
733
|
+
```
|
|
734
|
+
|
|
735
|
+
## フィルタ
|
|
736
|
+
|
|
737
|
+
40 種類の組み込みフィルタが入力(DOM → 状態)と出力(状態 → DOM)の両方向で利用できます。
|
|
738
|
+
|
|
739
|
+
### 比較
|
|
740
|
+
|
|
741
|
+
| フィルタ | 説明 | 例 |
|
|
742
|
+
|---|---|---|
|
|
743
|
+
| `eq(value)` | 等しい | `count\|eq(0)` → `true/false` |
|
|
744
|
+
| `ne(value)` | 等しくない | `count\|ne(0)` |
|
|
745
|
+
| `not` | 論理否定 | `isActive\|not` |
|
|
746
|
+
| `lt(n)` | より小さい | `count\|lt(10)` |
|
|
747
|
+
| `le(n)` | 以下 | `count\|le(10)` |
|
|
748
|
+
| `gt(n)` | より大きい | `count\|gt(0)` |
|
|
749
|
+
| `ge(n)` | 以上 | `count\|ge(0)` |
|
|
750
|
+
|
|
751
|
+
### 算術
|
|
752
|
+
|
|
753
|
+
| フィルタ | 説明 | 例 |
|
|
754
|
+
|---|---|---|
|
|
755
|
+
| `inc(n)` | 加算 | `count\|inc(1)` |
|
|
756
|
+
| `dec(n)` | 減算 | `count\|dec(1)` |
|
|
757
|
+
| `mul(n)` | 乗算 | `price\|mul(1.1)` |
|
|
758
|
+
| `div(n)` | 除算 | `total\|div(100)` |
|
|
759
|
+
| `mod(n)` | 剰余 | `index\|mod(2)` |
|
|
760
|
+
|
|
761
|
+
### 数値フォーマット
|
|
762
|
+
|
|
763
|
+
| フィルタ | 説明 | 例 |
|
|
764
|
+
|---|---|---|
|
|
765
|
+
| `fix(n)` | 固定小数点桁数 | `price\|fix(2)` → `"100.00"` |
|
|
766
|
+
| `round(n?)` | 四捨五入 | `value\|round(2)` |
|
|
767
|
+
| `floor(n?)` | 切り捨て | `value\|floor` |
|
|
768
|
+
| `ceil(n?)` | 切り上げ | `value\|ceil` |
|
|
769
|
+
| `locale(loc?)` | ロケール数値フォーマット | `count\|locale` / `count\|locale(ja-JP)` |
|
|
770
|
+
| `percent(n?)` | パーセンテージフォーマット | `ratio\|percent(1)` |
|
|
771
|
+
|
|
772
|
+
### 文字列
|
|
773
|
+
|
|
774
|
+
| フィルタ | 説明 | 例 |
|
|
775
|
+
|---|---|---|
|
|
776
|
+
| `uc` | 大文字変換 | `name\|uc` |
|
|
777
|
+
| `lc` | 小文字変換 | `name\|lc` |
|
|
778
|
+
| `cap` | 先頭大文字 | `name\|cap` |
|
|
779
|
+
| `trim` | 空白除去 | `text\|trim` |
|
|
780
|
+
| `slice(n)` | 文字列スライス | `text\|slice(5)` |
|
|
781
|
+
| `substr(start, length)` | 部分文字列 | `text\|substr(0,10)` |
|
|
782
|
+
| `pad(n, char?)` | 先頭パディング | `id\|pad(5,0)` → `"00001"` |
|
|
783
|
+
| `rep(n)` | 繰り返し | `text\|rep(3)` |
|
|
784
|
+
| `rev` | 反転 | `text\|rev` |
|
|
785
|
+
|
|
786
|
+
### 型変換
|
|
787
|
+
|
|
788
|
+
| フィルタ | 説明 | 例 |
|
|
789
|
+
|---|---|---|
|
|
790
|
+
| `int` | 整数パース | `input\|int` |
|
|
791
|
+
| `float` | 浮動小数点パース | `input\|float` |
|
|
792
|
+
| `boolean` | 真偽値に変換 | `value\|boolean` |
|
|
793
|
+
| `number` | 数値に変換 | `value\|number` |
|
|
794
|
+
| `string` | 文字列に変換 | `value\|string` |
|
|
795
|
+
| `null` | null に変換 | `value\|null` |
|
|
796
|
+
|
|
797
|
+
### 日付 / 時刻
|
|
798
|
+
|
|
799
|
+
| フィルタ | 説明 | 例 |
|
|
800
|
+
|---|---|---|
|
|
801
|
+
| `date(loc?)` | 日付フォーマット | `timestamp\|date` / `timestamp\|date(ja-JP)` |
|
|
802
|
+
| `time(loc?)` | 時刻フォーマット | `timestamp\|time` |
|
|
803
|
+
| `datetime(loc?)` | 日付 + 時刻 | `timestamp\|datetime(en-US)` |
|
|
804
|
+
| `ymd(sep?)` | YYYY-MM-DD | `timestamp\|ymd` / `timestamp\|ymd(/)` |
|
|
805
|
+
|
|
806
|
+
### 真偽値 / デフォルト
|
|
807
|
+
|
|
808
|
+
| フィルタ | 説明 | 例 |
|
|
809
|
+
|---|---|---|
|
|
810
|
+
| `truthy` | truthy チェック | `value\|truthy` |
|
|
811
|
+
| `falsy` | falsy チェック | `value\|falsy` |
|
|
812
|
+
| `defaults(v)` | フォールバック値 | `name\|defaults(Anonymous)` |
|
|
813
|
+
|
|
814
|
+
### フィルタチェーン
|
|
815
|
+
|
|
816
|
+
フィルタは `|` で連結できます:
|
|
817
|
+
|
|
818
|
+
```html
|
|
819
|
+
<div data-wcs="textContent: price|mul(1.1)|round(2)|locale(ja-JP)"></div>
|
|
820
|
+
```
|
|
821
|
+
|
|
822
|
+
## Web Component バインディング
|
|
823
|
+
|
|
824
|
+
`@wcstack/state` は Shadow DOM または Light DOM を使用したカスタム要素との双方向状態バインディングに対応しています。
|
|
825
|
+
|
|
826
|
+
### コンポーネント定義(Shadow DOM)
|
|
827
|
+
|
|
828
|
+
```javascript
|
|
829
|
+
class MyComponent extends HTMLElement {
|
|
830
|
+
state = { message: "" };
|
|
831
|
+
|
|
832
|
+
constructor() {
|
|
833
|
+
super();
|
|
834
|
+
this.attachShadow({ mode: "open" });
|
|
835
|
+
this.shadowRoot.innerHTML = `
|
|
836
|
+
<wcs-state bind-component="state"></wcs-state>
|
|
837
|
+
<div>{{ message }}</div>
|
|
838
|
+
<input type="text" data-wcs="value: message" />
|
|
839
|
+
`;
|
|
840
|
+
}
|
|
841
|
+
}
|
|
842
|
+
customElements.define("my-component", MyComponent);
|
|
843
|
+
```
|
|
844
|
+
|
|
845
|
+
### コンポーネント定義(Light DOM)
|
|
846
|
+
|
|
847
|
+
Light DOM コンポーネントは Shadow DOM を使用しません。CSS と同様に state の名前空間も上位スコープと共有されるため、`name` 属性が必須です。
|
|
848
|
+
|
|
849
|
+
```javascript
|
|
850
|
+
class MyLightComponent extends HTMLElement {
|
|
851
|
+
state = { message: "" };
|
|
852
|
+
|
|
853
|
+
connectedCallback() {
|
|
854
|
+
this.innerHTML = `
|
|
855
|
+
<wcs-state bind-component="state" name="my-light"></wcs-state>
|
|
856
|
+
<div data-wcs="text: message@my-light"></div>
|
|
857
|
+
<input type="text" data-wcs="value: message@my-light" />
|
|
858
|
+
`;
|
|
859
|
+
}
|
|
860
|
+
}
|
|
861
|
+
customElements.define("my-light-component", MyLightComponent);
|
|
862
|
+
```
|
|
863
|
+
|
|
864
|
+
- Light DOM コンポーネントでは `name` 属性が**必須**です(名前空間が上位スコープと共有されるため)
|
|
865
|
+
- バインディングでは `@my-light` のように状態名を明示的に参照する必要があります
|
|
866
|
+
- `<wcs-state>` はコンポーネント要素の直下に配置する必要があります
|
|
867
|
+
|
|
868
|
+
### ホスト側の使用方法
|
|
869
|
+
|
|
870
|
+
```html
|
|
871
|
+
<wcs-state>
|
|
872
|
+
<script type="module">
|
|
873
|
+
export default {
|
|
874
|
+
user: { name: "Alice" }
|
|
875
|
+
};
|
|
876
|
+
</script>
|
|
877
|
+
</wcs-state>
|
|
878
|
+
|
|
879
|
+
<!-- コンポーネントの state.message を外側の user.name にバインド -->
|
|
880
|
+
<my-component data-wcs="state.message: user.name"></my-component>
|
|
881
|
+
```
|
|
882
|
+
|
|
883
|
+
- `bind-component="state"` でコンポーネントの `state` プロパティを `<wcs-state>` にマッピング
|
|
884
|
+
- `data-wcs="state.message: user.name"` でホスト要素上の外部状態パスを内部コンポーネント状態プロパティにバインド
|
|
885
|
+
- 変更はコンポーネントと外部状態間で双方向に伝播
|
|
886
|
+
|
|
887
|
+
### 独立した Web Component への状態注入(`__e2e__/single-component`)
|
|
888
|
+
|
|
889
|
+
ホストの外部状態に依存しないコンポーネントでも、`bind-component` で `state` を注入してリアクティブにできます。
|
|
890
|
+
|
|
891
|
+
```javascript
|
|
892
|
+
class MyComponent extends HTMLElement {
|
|
893
|
+
state = Object.freeze({
|
|
894
|
+
message: "Hello, World!"
|
|
895
|
+
});
|
|
896
|
+
|
|
897
|
+
constructor() {
|
|
898
|
+
super();
|
|
899
|
+
this.attachShadow({ mode: "open" });
|
|
900
|
+
}
|
|
901
|
+
|
|
902
|
+
connectedCallback() {
|
|
903
|
+
this.shadowRoot.innerHTML = `
|
|
904
|
+
<wcs-state bind-component="state"></wcs-state>
|
|
905
|
+
<div>{{ message }}</div>
|
|
906
|
+
`;
|
|
907
|
+
}
|
|
908
|
+
|
|
909
|
+
async $stateReadyCallback(stateProp) {
|
|
910
|
+
console.log("state ready:", stateProp); // "state"
|
|
911
|
+
}
|
|
912
|
+
}
|
|
913
|
+
customElements.define("my-component", MyComponent);
|
|
914
|
+
```
|
|
915
|
+
|
|
916
|
+
- 初期 `state` は `Object.freeze(...)` で定義できます(注入後は書き換え可能なリアクティブ状態に置き換え)
|
|
917
|
+
- `bind-component="state"` により `this.state` が `@wcstack/state` の状態プロキシとして利用可能になります
|
|
918
|
+
- `this.state.message = "..."` のような代入で、Shadow DOM 内の `{{ message }}` が即時に更新されます
|
|
919
|
+
- `async $stateReadyCallback(stateProp)` は、Web Component 側で状態が利用可能になった直後に呼ばれます(`stateProp` は `bind-component` のプロパティ名)
|
|
920
|
+
|
|
921
|
+
### 制約事項
|
|
922
|
+
|
|
923
|
+
- `bind-component` 付きの `<wcs-state>` はコンポーネント要素の**直下**(トップレベル)に配置すること
|
|
924
|
+
- 親要素は**カスタム要素**(ハイフンを含むタグ名)であること
|
|
925
|
+
- Light DOM コンポーネントでは `name` 属性が**必須**(上位スコープとの名前空間衝突を回避するため)
|
|
926
|
+
- Light DOM のバインディングでは状態名を明示的に参照すること(例: `@my-light`)
|
|
927
|
+
|
|
928
|
+
### ループ内でのコンポーネント使用
|
|
929
|
+
|
|
930
|
+
```html
|
|
931
|
+
<template data-wcs="for: users">
|
|
932
|
+
<my-component data-wcs="state.message: .name"></my-component>
|
|
933
|
+
</template>
|
|
934
|
+
```
|
|
935
|
+
|
|
936
|
+
## SVG サポート
|
|
937
|
+
|
|
938
|
+
全てのバインディングが `<svg>` 要素内で動作します。SVG 属性には `attr.*` を使用します:
|
|
939
|
+
|
|
940
|
+
```html
|
|
941
|
+
<svg width="200" height="100">
|
|
942
|
+
<template data-wcs="for: points">
|
|
943
|
+
<circle data-wcs="attr.cx: .x; attr.cy: .y; attr.fill: .color" r="5" />
|
|
944
|
+
</template>
|
|
945
|
+
</svg>
|
|
946
|
+
```
|
|
947
|
+
|
|
948
|
+
## ライフサイクルフック
|
|
949
|
+
|
|
950
|
+
状態オブジェクトに `$connectedCallback` / `$disconnectedCallback` / `$updatedCallback` を定義すると、初期化・クリーンアップ・更新時のフックとして利用できます。
|
|
951
|
+
|
|
952
|
+
```html
|
|
953
|
+
<wcs-state>
|
|
954
|
+
<script type="module">
|
|
955
|
+
export default {
|
|
956
|
+
timer: null,
|
|
957
|
+
count: 0,
|
|
958
|
+
|
|
959
|
+
// <wcs-state> が DOM に接続された時に呼ばれる(async 対応)
|
|
960
|
+
async $connectedCallback() {
|
|
961
|
+
const res = await fetch("/api/initial-count");
|
|
962
|
+
this.count = await res.json();
|
|
963
|
+
this.timer = setInterval(() => { this.count++; }, 1000);
|
|
964
|
+
},
|
|
965
|
+
|
|
966
|
+
// <wcs-state> が DOM から切断された時に呼ばれる(同期のみ)
|
|
967
|
+
$disconnectedCallback() {
|
|
968
|
+
clearInterval(this.timer);
|
|
969
|
+
}
|
|
970
|
+
};
|
|
971
|
+
</script>
|
|
972
|
+
</wcs-state>
|
|
973
|
+
```
|
|
974
|
+
|
|
975
|
+
| フック | タイミング | 非同期 |
|
|
976
|
+
|---|---|---|
|
|
977
|
+
| `$connectedCallback` | 初回接続時は状態初期化後、再接続時は毎回呼び出し | 可(`async` 対応) |
|
|
978
|
+
| `$disconnectedCallback` | 要素が DOM から削除された時 | 不可(同期のみ) |
|
|
979
|
+
| `$updatedCallback(paths, indexesListByPath)` | 状態変更が適用された後に呼び出し | 戻り値は未使用(待機されない) |
|
|
980
|
+
|
|
981
|
+
- フック内の `this` は読み書き可能な状態プロキシです
|
|
982
|
+
- `$connectedCallback` は要素が接続される**たびに**呼ばれます(削除後の再接続を含む)。再確立が必要なセットアップ処理に適しています
|
|
983
|
+
- `$disconnectedCallback` は同期的に呼び出されます — タイマーのクリア、イベントリスナーの削除、リソースの解放などのクリーンアップに使用します
|
|
984
|
+
- `$updatedCallback(paths, indexesListByPath)` は更新された状態パスの一覧を受け取ります。ワイルドカードパス更新時は `indexesListByPath` で更新対象インデックスも受け取れます
|
|
985
|
+
- Web Component では `async $stateReadyCallback(stateProp)` を定義すると、`bind-component` でバインドされた状態が利用可能になったタイミングで呼び出されます
|
|
986
|
+
|
|
987
|
+
## 設定
|
|
988
|
+
|
|
989
|
+
`bootstrapState()` に部分的な設定オブジェクトを渡します:
|
|
990
|
+
|
|
991
|
+
```javascript
|
|
992
|
+
import { bootstrapState } from '@wcstack/state';
|
|
993
|
+
|
|
994
|
+
bootstrapState({
|
|
995
|
+
locale: 'ja-JP',
|
|
996
|
+
debug: true,
|
|
997
|
+
enableMustache: false,
|
|
998
|
+
tagNames: { state: 'my-state' },
|
|
999
|
+
});
|
|
1000
|
+
```
|
|
1001
|
+
|
|
1002
|
+
全オプションとデフォルト値:
|
|
1003
|
+
|
|
1004
|
+
| オプション | デフォルト | 説明 |
|
|
1005
|
+
|---|---|---|
|
|
1006
|
+
| `bindAttributeName` | `'data-wcs'` | バインディング属性名 |
|
|
1007
|
+
| `tagNames.state` | `'wcs-state'` | 状態要素のタグ名 |
|
|
1008
|
+
| `locale` | `'en'` | フィルタのデフォルトロケール |
|
|
1009
|
+
| `debug` | `false` | デバッグモード |
|
|
1010
|
+
| `enableMustache` | `true` | `{{ }}` 構文の有効化 |
|
|
1011
|
+
|
|
1012
|
+
## API リファレンス
|
|
1013
|
+
|
|
1014
|
+
### `bootstrapState()`
|
|
1015
|
+
|
|
1016
|
+
状態システムを初期化します。`<wcs-state>` カスタム要素を登録し、DOM コンテンツ読み込みハンドラを設定します。
|
|
1017
|
+
|
|
1018
|
+
```javascript
|
|
1019
|
+
import { bootstrapState } from '@wcstack/state';
|
|
1020
|
+
bootstrapState();
|
|
1021
|
+
```
|
|
1022
|
+
|
|
1023
|
+
### `<wcs-state>` 要素
|
|
1024
|
+
|
|
1025
|
+
| 属性 | 説明 |
|
|
1026
|
+
|---|---|
|
|
1027
|
+
| `name` | 状態名(デフォルト: `"default"`) |
|
|
1028
|
+
| `state` | `<script type="application/json">` 要素の ID |
|
|
1029
|
+
| `src` | `.json` または `.js` ファイルの URL |
|
|
1030
|
+
| `json` | インライン JSON 文字列 |
|
|
1031
|
+
| `bind-component` | Web Component バインディングのプロパティ名 |
|
|
1032
|
+
|
|
1033
|
+
### IStateElement
|
|
1034
|
+
|
|
1035
|
+
| プロパティ / メソッド | 説明 |
|
|
1036
|
+
|---|---|
|
|
1037
|
+
| `name` | 状態名 |
|
|
1038
|
+
| `initializePromise` | 状態の完全な初期化時に解決される Promise |
|
|
1039
|
+
| `listPaths` | `for` ループで使用されるパスの Set |
|
|
1040
|
+
| `getterPaths` | getter として定義されたパスの Set |
|
|
1041
|
+
| `setterPaths` | setter として定義されたパスの Set |
|
|
1042
|
+
| `createState(mutability, callback)` | 状態プロキシを作成(`"readonly"` または `"writable"`) |
|
|
1043
|
+
| `createStateAsync(mutability, callback)` | `createState` の非同期版 |
|
|
1044
|
+
| `setInitialState(state)` | プログラムから状態を設定(初期化前) |
|
|
1045
|
+
| `bindProperty(prop, descriptor)` | 生の状態オブジェクトにプロパティを定義 |
|
|
1046
|
+
| `nextVersion()` | バージョン番号をインクリメントして返す |
|
|
1047
|
+
|
|
1048
|
+
## アーキテクチャ
|
|
1049
|
+
|
|
1050
|
+
```
|
|
1051
|
+
bootstrapState()
|
|
1052
|
+
├── registerComponents() // <wcs-state> カスタム要素を登録
|
|
1053
|
+
└── registerHandler() // DOMContentLoaded ハンドラ
|
|
1054
|
+
├── waitForStateInitialize() // 全 <wcs-state> の読み込み待機
|
|
1055
|
+
├── convertMustacheToComments() // {{ }} → コメントノードに変換
|
|
1056
|
+
├── collectStructuralFragments() // for/if テンプレートを収集
|
|
1057
|
+
└── initializeBindings() // DOM 走査、data-wcs 解析、バインディング設定
|
|
1058
|
+
```
|
|
1059
|
+
|
|
1060
|
+
### リアクティビティフロー
|
|
1061
|
+
|
|
1062
|
+
1. Proxy の `set` トラップによる状態変更 → `setByAddress()`
|
|
1063
|
+
2. アドレス解決 → updater が絶対アドレスをキューに登録
|
|
1064
|
+
3. 依存関係ウォーカーが下流のキャッシュを無効化(dirty)
|
|
1065
|
+
4. updater が `applyChangeFromBindings()` によりバインド済み DOM ノードに変更を適用
|
|
1066
|
+
|
|
1067
|
+
### 状態アドレスシステム
|
|
1068
|
+
|
|
1069
|
+
`users.*.name` のようなパスは以下に分解されます:
|
|
1070
|
+
|
|
1071
|
+
- **PathInfo** — 静的パスメタデータ(セグメント、ワイルドカード数、親パス)
|
|
1072
|
+
- **ListIndex** — ランタイムループインデックスチェーン
|
|
1073
|
+
- **StateAddress** — PathInfo + ListIndex の組み合わせ
|
|
1074
|
+
- **AbsoluteStateAddress** — 状態名 + StateAddress(クロス状態参照用)
|
|
1075
|
+
|
|
1076
|
+
## ライセンス
|
|
1077
|
+
|
|
1078
|
+
MIT
|