@getodk/xforms-engine 0.4.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (285) hide show
  1. package/dist/client/BaseNode.d.ts +14 -3
  2. package/dist/client/BaseValueNode.d.ts +32 -0
  3. package/dist/client/EngineConfig.d.ts +49 -48
  4. package/dist/client/InputNode.d.ts +53 -0
  5. package/dist/client/ModelValueNode.d.ts +12 -7
  6. package/dist/client/NoteNode.d.ts +2 -2
  7. package/dist/client/RootNode.d.ts +34 -7
  8. package/dist/client/SelectNode.d.ts +2 -2
  9. package/dist/client/ValueType.d.ts +3 -0
  10. package/dist/client/constants.d.ts +50 -0
  11. package/dist/client/hierarchy.d.ts +4 -4
  12. package/dist/client/identity.d.ts +14 -0
  13. package/dist/client/node-types.d.ts +2 -1
  14. package/dist/client/resources.d.ts +93 -0
  15. package/dist/client/submission/SubmissionData.d.ts +7 -0
  16. package/dist/client/submission/SubmissionDefinition.d.ts +14 -0
  17. package/dist/client/submission/SubmissionInstanceFile.d.ts +6 -0
  18. package/dist/client/submission/SubmissionOptions.d.ts +23 -0
  19. package/dist/client/submission/SubmissionResult.d.ts +91 -0
  20. package/dist/client/submission/SubmissionState.d.ts +12 -0
  21. package/dist/client/validation.d.ts +2 -2
  22. package/dist/error/ErrorProductionDesignPendingError.d.ts +7 -0
  23. package/dist/error/ValueTypeInvariantError.d.ts +17 -0
  24. package/dist/error/XPathFunctionalityError.d.ts +14 -0
  25. package/dist/error/XPathFunctionalityNotSupportedError.d.ts +7 -0
  26. package/dist/error/XPathFunctionalityPendingError.d.ts +7 -0
  27. package/dist/index.d.ts +10 -1
  28. package/dist/index.js +10856 -8585
  29. package/dist/index.js.map +1 -1
  30. package/dist/instance/Group.d.ts +9 -4
  31. package/dist/instance/InputControl.d.ts +36 -0
  32. package/dist/instance/ModelValue.d.ts +16 -26
  33. package/dist/instance/Note.d.ts +10 -3
  34. package/dist/instance/PrimaryInstance.d.ts +84 -0
  35. package/dist/instance/Root.d.ts +29 -25
  36. package/dist/instance/SelectField.d.ts +10 -2
  37. package/dist/instance/Subtree.d.ts +10 -5
  38. package/dist/instance/TriggerControl.d.ts +10 -3
  39. package/dist/instance/abstract/DescendantNode.d.ts +31 -23
  40. package/dist/instance/abstract/InstanceNode.d.ts +49 -29
  41. package/dist/instance/abstract/UnsupportedControl.d.ts +10 -3
  42. package/dist/instance/abstract/ValueNode.d.ts +48 -0
  43. package/dist/instance/hierarchy.d.ts +9 -8
  44. package/dist/instance/identity.d.ts +2 -7
  45. package/dist/instance/internal-api/EvaluationContext.d.ts +53 -12
  46. package/dist/instance/internal-api/InstanceConfig.d.ts +8 -2
  47. package/dist/instance/internal-api/InstanceValueContext.d.ts +20 -0
  48. package/dist/instance/internal-api/PrimaryInstanceDocument.d.ts +36 -0
  49. package/dist/instance/internal-api/TranslationContext.d.ts +3 -2
  50. package/dist/instance/internal-api/ValidationContext.d.ts +3 -4
  51. package/dist/instance/internal-api/ValueContext.d.ts +2 -1
  52. package/dist/instance/internal-api/submission/ClientReactiveSubmittableInstance.d.ts +14 -0
  53. package/dist/instance/internal-api/submission/ClientReactiveSubmittableLeafNode.d.ts +31 -0
  54. package/dist/instance/internal-api/submission/ClientReactiveSubmittableParentNode.d.ts +18 -0
  55. package/dist/instance/internal-api/submission/ClientReactiveSubmittableValueNode.d.ts +17 -0
  56. package/dist/instance/repeat/BaseRepeatRange.d.ts +39 -83
  57. package/dist/instance/repeat/RepeatInstance.d.ts +11 -29
  58. package/dist/instance/repeat/RepeatRangeControlled.d.ts +2 -2
  59. package/dist/instance/repeat/RepeatRangeUncontrolled.d.ts +2 -2
  60. package/dist/instance/resource.d.ts +1 -1
  61. package/dist/instance/text/TextRange.d.ts +1 -1
  62. package/dist/instance/unsupported/RangeControl.d.ts +3 -1
  63. package/dist/instance/unsupported/RankControl.d.ts +3 -1
  64. package/dist/instance/unsupported/UploadControl.d.ts +3 -1
  65. package/dist/integration/xpath/EngineXPathEvaluator.d.ts +14 -0
  66. package/dist/integration/xpath/adapter/XFormsXPathNode.d.ts +71 -0
  67. package/dist/integration/xpath/adapter/engineDOMAdapter.d.ts +5 -0
  68. package/dist/integration/xpath/adapter/kind.d.ts +32 -0
  69. package/dist/integration/xpath/adapter/names.d.ts +16 -0
  70. package/dist/integration/xpath/adapter/traversal.d.ts +25 -0
  71. package/dist/integration/xpath/adapter/values.d.ts +2 -0
  72. package/dist/integration/xpath/static-dom/StaticAttribute.d.ts +19 -0
  73. package/dist/integration/xpath/static-dom/StaticDocument.d.ts +16 -0
  74. package/dist/integration/xpath/static-dom/StaticElement.d.ts +40 -0
  75. package/dist/integration/xpath/static-dom/StaticNamedNode.d.ts +17 -0
  76. package/dist/integration/xpath/static-dom/StaticNode.d.ts +33 -0
  77. package/dist/integration/xpath/static-dom/StaticText.d.ts +16 -0
  78. package/dist/lib/client-reactivity/submission/createInstanceSubmissionState.d.ts +3 -0
  79. package/dist/lib/client-reactivity/submission/createLeafNodeSubmissionState.d.ts +3 -0
  80. package/dist/lib/client-reactivity/submission/createNodeRangeSubmissionState.d.ts +4 -0
  81. package/dist/lib/client-reactivity/submission/createParentNodeSubmissionState.d.ts +4 -0
  82. package/dist/lib/client-reactivity/submission/createValueNodeSubmissionState.d.ts +3 -0
  83. package/dist/lib/client-reactivity/submission/prepareSubmission.d.ts +8 -0
  84. package/dist/lib/codecs/DecimalValueCodec.d.ts +6 -0
  85. package/dist/lib/codecs/IntValueCodec.d.ts +6 -0
  86. package/dist/lib/codecs/StringValueCodec.d.ts +4 -0
  87. package/dist/lib/codecs/ValueCodec.d.ts +30 -0
  88. package/dist/lib/codecs/ValueTypePlaceholderCodec.d.ts +12 -0
  89. package/dist/lib/codecs/getSharedValueCodec.d.ts +47 -0
  90. package/dist/lib/dom/query.d.ts +3 -0
  91. package/dist/lib/reactivity/createChildrenState.d.ts +7 -5
  92. package/dist/lib/reactivity/createComputedExpression.d.ts +18 -5
  93. package/dist/lib/reactivity/createInstanceValueState.d.ts +40 -0
  94. package/dist/lib/reactivity/createNoteReadonlyThunk.d.ts +2 -2
  95. package/dist/lib/reactivity/createTranslationState.d.ts +19 -0
  96. package/dist/lib/reactivity/createValueState.d.ts +6 -10
  97. package/dist/lib/reactivity/materializeCurrentStateChildren.d.ts +4 -4
  98. package/dist/lib/xml-serialization.d.ts +41 -0
  99. package/dist/parse/XFormDOM.d.ts +18 -7
  100. package/dist/parse/XFormDefinition.d.ts +1 -2
  101. package/dist/parse/attachments/FormAttachmentResource.d.ts +27 -0
  102. package/dist/parse/body/BodyDefinition.d.ts +3 -3
  103. package/dist/parse/body/RepeatElementDefinition.d.ts +1 -1
  104. package/dist/parse/body/appearance/inputAppearanceParser.d.ts +1 -1
  105. package/dist/parse/body/control/{InputDefinition.d.ts → InputControlDefinition.d.ts} +1 -1
  106. package/dist/parse/body/control/select/ItemsetNodesetContext.d.ts +0 -2
  107. package/dist/parse/expression/abstract/DependencyContext.d.ts +0 -5
  108. package/dist/parse/expression/abstract/DependentExpression.d.ts +2 -3
  109. package/dist/parse/model/BindDefinition.d.ts +4 -5
  110. package/dist/parse/model/BindTypeDefinition.d.ts +20 -0
  111. package/dist/parse/model/DescendentNodeDefinition.d.ts +0 -1
  112. package/dist/parse/model/FormSubmissionDefinition.d.ts +8 -0
  113. package/dist/parse/model/ItextTranslation/ItextTranslationDefinition.d.ts +4 -0
  114. package/dist/parse/model/ItextTranslation/ItextTranslationRootDefinition.d.ts +8 -0
  115. package/dist/parse/model/ItextTranslation/ItextTranslationsDefinition.d.ts +8 -0
  116. package/dist/parse/model/LeafNodeDefinition.d.ts +3 -1
  117. package/dist/parse/model/ModelBindMap.d.ts +1 -1
  118. package/dist/parse/model/ModelDefinition.d.ts +2 -0
  119. package/dist/parse/model/NodeDefinition.d.ts +0 -1
  120. package/dist/parse/model/NoteNodeDefinition.d.ts +4 -4
  121. package/dist/parse/model/RootDefinition.d.ts +3 -2
  122. package/dist/parse/model/SecondaryInstance/SecondaryInstanceDefinition.d.ts +4 -0
  123. package/dist/parse/model/SecondaryInstance/SecondaryInstanceRootDefinition.d.ts +7 -0
  124. package/dist/parse/model/SecondaryInstance/SecondaryInstancesDefinition.d.ts +13 -0
  125. package/dist/parse/model/SecondaryInstance/sources/BlankSecondaryInstanceSource.d.ts +14 -0
  126. package/dist/parse/model/SecondaryInstance/sources/CSVExternalSecondaryInstance.d.ts +22 -0
  127. package/dist/parse/model/SecondaryInstance/sources/ExternalSecondaryInstanceResource.d.ts +23 -0
  128. package/dist/parse/model/SecondaryInstance/sources/ExternalSecondaryInstanceSource.d.ts +9 -0
  129. package/dist/parse/model/SecondaryInstance/sources/GeoJSONExternalSecondaryInstance.d.ts +5 -0
  130. package/dist/parse/model/SecondaryInstance/sources/InternalSecondaryInstanceSource.d.ts +7 -0
  131. package/dist/parse/model/SecondaryInstance/sources/SecondaryInstanceSource.d.ts +13 -0
  132. package/dist/parse/model/SecondaryInstance/sources/XMLExternalSecondaryInstanceSource.d.ts +12 -0
  133. package/dist/parse/shared/parseStaticDocumentFromDOMSubtree.d.ts +24 -0
  134. package/dist/parse/text/abstract/TextRangeDefinition.d.ts +0 -2
  135. package/dist/parse/xpath/semantic-analysis.d.ts +5 -0
  136. package/dist/solid.js +8174 -5921
  137. package/dist/solid.js.map +1 -1
  138. package/package.json +13 -11
  139. package/src/client/BaseNode.ts +16 -6
  140. package/src/client/BaseValueNode.ts +35 -0
  141. package/src/client/EngineConfig.ts +52 -51
  142. package/src/client/InputNode.ts +77 -0
  143. package/src/client/ModelValueNode.ts +30 -7
  144. package/src/client/NoteNode.ts +2 -2
  145. package/src/client/RootNode.ts +37 -7
  146. package/src/client/SelectNode.ts +3 -3
  147. package/src/client/ValueType.ts +4 -0
  148. package/src/client/constants.ts +67 -0
  149. package/src/client/hierarchy.ts +5 -5
  150. package/src/client/identity.ts +16 -0
  151. package/src/client/node-types.ts +12 -6
  152. package/src/client/resources.ts +118 -0
  153. package/src/client/submission/SubmissionData.ts +12 -0
  154. package/src/client/submission/SubmissionDefinition.ts +16 -0
  155. package/src/client/submission/SubmissionInstanceFile.ts +9 -0
  156. package/src/client/submission/SubmissionOptions.ts +28 -0
  157. package/src/client/submission/SubmissionResult.ts +124 -0
  158. package/src/client/submission/SubmissionState.ts +14 -0
  159. package/src/client/validation.ts +2 -2
  160. package/src/error/ErrorProductionDesignPendingError.ts +6 -0
  161. package/src/error/ValueTypeInvariantError.ts +22 -0
  162. package/src/error/XPathFunctionalityError.ts +26 -0
  163. package/src/error/XPathFunctionalityNotSupportedError.ts +18 -0
  164. package/src/error/XPathFunctionalityPendingError.ts +18 -0
  165. package/src/index.ts +10 -1
  166. package/src/instance/Group.ts +17 -5
  167. package/src/instance/InputControl.ts +119 -0
  168. package/src/instance/ModelValue.ts +47 -54
  169. package/src/instance/Note.ts +24 -8
  170. package/src/instance/PrimaryInstance.ts +244 -0
  171. package/src/instance/Root.ts +62 -134
  172. package/src/instance/SelectField.ts +56 -19
  173. package/src/instance/Subtree.ts +19 -7
  174. package/src/instance/TriggerControl.ts +23 -6
  175. package/src/instance/abstract/DescendantNode.ts +90 -45
  176. package/src/instance/abstract/InstanceNode.ts +103 -105
  177. package/src/instance/abstract/UnsupportedControl.ts +28 -5
  178. package/src/instance/abstract/ValueNode.ts +127 -0
  179. package/src/instance/children.ts +9 -10
  180. package/src/instance/hierarchy.ts +19 -15
  181. package/src/instance/identity.ts +3 -9
  182. package/src/instance/index.ts +25 -7
  183. package/src/instance/internal-api/EvaluationContext.ts +60 -13
  184. package/src/instance/internal-api/InstanceConfig.ts +9 -2
  185. package/src/instance/internal-api/InstanceValueContext.ts +24 -0
  186. package/src/instance/internal-api/PrimaryInstanceDocument.ts +53 -0
  187. package/src/instance/internal-api/TranslationContext.ts +3 -2
  188. package/src/instance/internal-api/ValidationContext.ts +3 -4
  189. package/src/instance/internal-api/ValueContext.ts +2 -1
  190. package/src/instance/internal-api/submission/ClientReactiveSubmittableInstance.ts +20 -0
  191. package/src/instance/internal-api/submission/ClientReactiveSubmittableLeafNode.ts +42 -0
  192. package/src/instance/internal-api/submission/ClientReactiveSubmittableParentNode.ts +25 -0
  193. package/src/instance/internal-api/submission/ClientReactiveSubmittableValueNode.ts +23 -0
  194. package/src/instance/repeat/BaseRepeatRange.ts +50 -131
  195. package/src/instance/repeat/RepeatInstance.ts +20 -46
  196. package/src/instance/repeat/RepeatRangeControlled.ts +5 -5
  197. package/src/instance/repeat/RepeatRangeUncontrolled.ts +2 -4
  198. package/src/instance/resource.ts +1 -1
  199. package/src/instance/text/TextChunk.ts +1 -1
  200. package/src/instance/unsupported/RangeControl.ts +5 -1
  201. package/src/instance/unsupported/RankControl.ts +5 -1
  202. package/src/instance/unsupported/UploadControl.ts +5 -1
  203. package/src/integration/xpath/EngineXPathEvaluator.ts +22 -0
  204. package/src/integration/xpath/adapter/XFormsXPathNode.ts +126 -0
  205. package/src/integration/xpath/adapter/engineDOMAdapter.ts +57 -0
  206. package/src/integration/xpath/adapter/kind.ts +114 -0
  207. package/src/integration/xpath/adapter/names.ts +99 -0
  208. package/src/integration/xpath/adapter/traversal.ts +228 -0
  209. package/src/integration/xpath/adapter/values.ts +5 -0
  210. package/src/integration/xpath/static-dom/StaticAttribute.ts +33 -0
  211. package/src/integration/xpath/static-dom/StaticDocument.ts +38 -0
  212. package/src/integration/xpath/static-dom/StaticElement.ts +106 -0
  213. package/src/integration/xpath/static-dom/StaticNamedNode.ts +45 -0
  214. package/src/integration/xpath/static-dom/StaticNode.ts +68 -0
  215. package/src/integration/xpath/static-dom/StaticText.ts +28 -0
  216. package/src/lib/client-reactivity/README.md +0 -0
  217. package/src/lib/client-reactivity/submission/createInstanceSubmissionState.ts +12 -0
  218. package/src/lib/client-reactivity/submission/createLeafNodeSubmissionState.ts +20 -0
  219. package/src/lib/client-reactivity/submission/createNodeRangeSubmissionState.ts +17 -0
  220. package/src/lib/client-reactivity/submission/createParentNodeSubmissionState.ts +22 -0
  221. package/src/lib/client-reactivity/submission/createValueNodeSubmissionState.ts +21 -0
  222. package/src/lib/client-reactivity/submission/prepareSubmission.ts +172 -0
  223. package/src/lib/codecs/DecimalValueCodec.ts +46 -0
  224. package/src/lib/codecs/IntValueCodec.ts +100 -0
  225. package/src/lib/codecs/StringValueCodec.ts +11 -0
  226. package/src/lib/codecs/ValueCodec.ts +106 -0
  227. package/src/lib/codecs/ValueTypePlaceholderCodec.ts +19 -0
  228. package/src/lib/codecs/getSharedValueCodec.ts +77 -0
  229. package/src/lib/dom/query.ts +7 -0
  230. package/src/lib/reactivity/createChildrenState.ts +8 -6
  231. package/src/lib/reactivity/createComputedExpression.ts +57 -34
  232. package/src/lib/reactivity/createInstanceValueState.ts +166 -0
  233. package/src/lib/reactivity/createNoteReadonlyThunk.ts +12 -7
  234. package/src/lib/reactivity/createSelectItems.ts +21 -21
  235. package/src/lib/reactivity/createTranslationState.ts +61 -0
  236. package/src/lib/reactivity/createValueState.ts +62 -120
  237. package/src/lib/reactivity/materializeCurrentStateChildren.ts +7 -7
  238. package/src/lib/reactivity/text/createTextRange.ts +4 -3
  239. package/src/lib/reactivity/validation/createAggregatedViolations.ts +1 -1
  240. package/src/lib/reactivity/validation/createValidation.ts +2 -3
  241. package/src/lib/xml-serialization.ts +96 -0
  242. package/src/parse/XFormDOM.ts +110 -75
  243. package/src/parse/XFormDefinition.ts +1 -6
  244. package/src/parse/attachments/FormAttachmentResource.ts +40 -0
  245. package/src/parse/body/BodyDefinition.ts +3 -3
  246. package/src/parse/body/appearance/inputAppearanceParser.ts +1 -1
  247. package/src/parse/body/control/{InputDefinition.ts → InputControlDefinition.ts} +3 -5
  248. package/src/parse/body/control/select/ItemsetNodesetContext.ts +0 -5
  249. package/src/parse/expression/abstract/DependencyContext.ts +0 -26
  250. package/src/parse/expression/abstract/DependentExpression.ts +2 -13
  251. package/src/parse/model/BindDefinition.ts +5 -8
  252. package/src/parse/model/BindTypeDefinition.ts +175 -0
  253. package/src/parse/model/DescendentNodeDefinition.ts +0 -6
  254. package/src/parse/model/FormSubmissionDefinition.ts +44 -0
  255. package/src/parse/model/ItextTranslation/ItextTranslationDefinition.ts +4 -0
  256. package/src/parse/model/ItextTranslation/ItextTranslationRootDefinition.ts +41 -0
  257. package/src/parse/model/ItextTranslation/ItextTranslationsDefinition.ts +31 -0
  258. package/src/parse/model/LeafNodeDefinition.ts +4 -1
  259. package/src/parse/model/ModelBindMap.ts +6 -8
  260. package/src/parse/model/ModelDefinition.ts +6 -1
  261. package/src/parse/model/NodeDefinition.ts +0 -3
  262. package/src/parse/model/NoteNodeDefinition.ts +3 -3
  263. package/src/parse/model/RootDefinition.ts +2 -1
  264. package/src/parse/model/SecondaryInstance/SecondaryInstanceDefinition.ts +4 -0
  265. package/src/parse/model/SecondaryInstance/SecondaryInstanceRootDefinition.ts +12 -0
  266. package/src/parse/model/SecondaryInstance/SecondaryInstancesDefinition.ts +102 -0
  267. package/src/parse/model/SecondaryInstance/sources/BlankSecondaryInstanceSource.ts +40 -0
  268. package/src/parse/model/SecondaryInstance/sources/CSVExternalSecondaryInstance.ts +288 -0
  269. package/src/parse/model/SecondaryInstance/sources/ExternalSecondaryInstanceResource.ts +222 -0
  270. package/src/parse/model/SecondaryInstance/sources/ExternalSecondaryInstanceSource.ts +22 -0
  271. package/src/parse/model/SecondaryInstance/sources/GeoJSONExternalSecondaryInstance.ts +414 -0
  272. package/src/parse/model/SecondaryInstance/sources/InternalSecondaryInstanceSource.ts +19 -0
  273. package/src/parse/model/SecondaryInstance/sources/SecondaryInstanceSource.ts +29 -0
  274. package/src/parse/model/SecondaryInstance/sources/XMLExternalSecondaryInstanceSource.ts +32 -0
  275. package/src/parse/shared/parseStaticDocumentFromDOMSubtree.ts +149 -0
  276. package/src/parse/text/abstract/TextRangeDefinition.ts +0 -6
  277. package/src/parse/xpath/semantic-analysis.ts +29 -0
  278. package/dist/client/StringNode.d.ts +0 -46
  279. package/dist/instance/StringField.d.ts +0 -44
  280. package/dist/instance/internal-api/SubscribableDependency.d.ts +0 -59
  281. package/dist/parse/XFormDataType.d.ts +0 -25
  282. package/src/client/StringNode.ts +0 -52
  283. package/src/instance/StringField.ts +0 -120
  284. package/src/instance/internal-api/SubscribableDependency.ts +0 -61
  285. package/src/parse/XFormDataType.ts +0 -62
@@ -1,15 +1,22 @@
1
- import type { XFormsXPathEvaluator } from '@getodk/xpath';
1
+ import { XPathNodeKindKey } from '@getodk/xpath';
2
2
  import type { Accessor } from 'solid-js';
3
+ import { createMemo } from 'solid-js';
3
4
  import type { BaseNode } from '../../client/BaseNode.ts';
5
+ import type { ActiveLanguage } from '../../client/FormLanguage.ts';
6
+ import type { InstanceNodeType } from '../../client/node-types.ts';
7
+ import type { PrimaryInstanceXPathChildNode } from '../../integration/xpath/adapter/kind.ts';
8
+ import type {
9
+ XFormsXPathPrimaryInstanceDescendantNode,
10
+ XFormsXPathPrimaryInstanceDescendantNodeKind,
11
+ } from '../../integration/xpath/adapter/XFormsXPathNode.ts';
12
+ import { XFORMS_XPATH_NODE_RANGE_KIND } from '../../integration/xpath/adapter/XFormsXPathNode.ts';
13
+ import type { EngineXPathEvaluator } from '../../integration/xpath/EngineXPathEvaluator.ts';
4
14
  import { createComputedExpression } from '../../lib/reactivity/createComputedExpression.ts';
5
15
  import type { ReactiveScope } from '../../lib/reactivity/scope.ts';
6
16
  import type { AnyDescendantNodeDefinition } from '../../parse/model/DescendentNodeDefinition.ts';
7
- import type { LeafNodeDefinition } from '../../parse/model/LeafNodeDefinition.ts';
8
17
  import type { AnyNodeDefinition } from '../../parse/model/NodeDefinition.ts';
9
- import type { RepeatInstanceDefinition } from '../../parse/model/RepeatInstanceDefinition.ts';
10
- import type { AnyChildNode, GeneralParentNode, RepeatRange } from '../hierarchy.ts';
18
+ import type { AnyChildNode, AnyParentNode, RepeatRange } from '../hierarchy.ts';
11
19
  import type { EvaluationContext } from '../internal-api/EvaluationContext.ts';
12
- import type { SubscribableDependency } from '../internal-api/SubscribableDependency.ts';
13
20
  import type { RepeatInstance } from '../repeat/RepeatInstance.ts';
14
21
  import type { Root } from '../Root.ts';
15
22
  import type { InstanceNodeStateSpec } from './InstanceNode.ts';
@@ -34,19 +41,13 @@ export type DescendantNodeDefinition = Extract<
34
41
  AnyDescendantNodeDefinition
35
42
  >;
36
43
 
37
- // prettier-ignore
38
- export type DescendantNodeParent<Definition extends DescendantNodeDefinition> =
39
- Definition extends LeafNodeDefinition
40
- ? GeneralParentNode
41
- : Definition extends RepeatInstanceDefinition
42
- ? RepeatRange
43
- : GeneralParentNode;
44
-
45
44
  export type AnyDescendantNode = DescendantNode<
46
45
  DescendantNodeDefinition,
47
46
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
48
47
  DescendantNodeStateSpec<any>,
49
48
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
49
+ any,
50
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
50
51
  any
51
52
  >;
52
53
 
@@ -58,11 +59,18 @@ export abstract class DescendantNode<
58
59
  Definition extends DescendantNodeDefinition,
59
60
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
60
61
  Spec extends DescendantNodeStateSpec<any>,
62
+ Parent extends AnyParentNode,
61
63
  Child extends AnyChildNode | null = null,
62
64
  >
63
- extends InstanceNode<Definition, Spec, Child>
64
- implements BaseNode, EvaluationContext, SubscribableDependency
65
+ extends InstanceNode<Definition, Spec, Parent, Child>
66
+ implements BaseNode, XFormsXPathPrimaryInstanceDescendantNode, EvaluationContext
65
67
  {
68
+ /**
69
+ * Partial implementation of {@link isAttached}, used to check whether `this`
70
+ * is present in {@link parent}'s children state.
71
+ */
72
+ protected readonly isAttachedDescendant: Accessor<boolean>;
73
+
66
74
  readonly hasReadonlyAncestor: Accessor<boolean> = () => {
67
75
  const { parent } = this;
68
76
 
@@ -97,51 +105,88 @@ export abstract class DescendantNode<
97
105
 
98
106
  readonly isRequired: Accessor<boolean>;
99
107
 
108
+ // XFormsXPathPrimaryInstanceDescendantNode
109
+
110
+ /**
111
+ * WARNING! Ideally, this would be an abstract property, defined by each
112
+ * concrete subclass (or other intermediate abstract classes, where
113
+ * appropriate). Unfortunately it must be assigned here, so it will be present
114
+ * for certain XPath DOM adapter functionality **during** each concrete node's
115
+ * construction.
116
+ *
117
+ * Those subclasses nevertheless override this same property, assigning the
118
+ * same value, for the purposes of narrowing the XPath node kind semantics
119
+ * appropriate for each node type.
120
+ */
121
+ override readonly [XPathNodeKindKey]: XFormsXPathPrimaryInstanceDescendantNodeKind;
100
122
  readonly root: Root;
101
- readonly evaluator: XFormsXPathEvaluator;
102
- readonly contextNode: Element;
123
+
124
+ // BaseNode
125
+ abstract override readonly nodeType: InstanceNodeType;
126
+
127
+ // EvaluationContext
128
+ readonly isAttached: Accessor<boolean>;
129
+ readonly evaluator: EngineXPathEvaluator;
130
+ override readonly contextNode: PrimaryInstanceXPathChildNode =
131
+ this as AnyDescendantNode as PrimaryInstanceXPathChildNode;
132
+ readonly getActiveLanguage: Accessor<ActiveLanguage>;
103
133
 
104
134
  constructor(
105
- override readonly parent: DescendantNodeParent<Definition>,
135
+ override readonly parent: Parent,
106
136
  override readonly definition: Definition,
107
137
  options?: DescendantNodeOptions
108
138
  ) {
109
139
  super(parent.engineConfig, parent, definition, options);
110
140
 
111
- const { evaluator, root } = parent;
141
+ if (this.isRoot()) {
142
+ this.root = this;
143
+ } else {
144
+ this.root = parent.root;
145
+ }
112
146
 
113
- this.root = root;
114
- this.evaluator = evaluator;
115
- this.contextNode = this.initializeContextNode(parent.contextNode, definition.nodeName);
147
+ const { evaluator } = parent;
116
148
 
117
- const { readonly, relevant, required } = definition.bind;
149
+ // See notes on property declaration
150
+ if (definition.type === 'repeat-range') {
151
+ this[XPathNodeKindKey] = XFORMS_XPATH_NODE_RANGE_KIND;
152
+ } else {
153
+ this[XPathNodeKindKey] = 'element';
154
+ }
118
155
 
119
- this.isSelfReadonly = createComputedExpression(this, readonly);
120
- this.isSelfRelevant = createComputedExpression(this, relevant);
121
- this.isRequired = createComputedExpression(this, required);
122
- }
156
+ const self = this as AnyDescendantNode as AnyChildNode;
123
157
 
124
- protected createContextNode(parentContextNode: Element, nodeName: string): Element {
125
- return parentContextNode.ownerDocument.createElement(nodeName);
126
- }
158
+ this.isAttachedDescendant = this.scope.runTask(() => {
159
+ return createMemo(() => {
160
+ for (const child of parent.getChildren()) {
161
+ if (child === self) {
162
+ return true;
163
+ }
164
+ }
127
165
 
128
- /**
129
- * Currently expected to be overridden by...
130
- *
131
- * - Repeat range: returns its parent's context node, because it doesn't have
132
- * a node in the primary instance tree.
133
- *
134
- * - Repeat instance: returns its created context node, but overrides handles
135
- * appending behavior separately (for inserting at the end of its parent
136
- * range, or even at an arbitrary index within the range, after instance
137
- * creation is has completed).
138
- */
139
- protected initializeContextNode(parentContextNode: Element, nodeName: string): Element {
140
- const element = this.createContextNode(parentContextNode, nodeName);
166
+ return false;
167
+ });
168
+ });
169
+
170
+ this.isAttached = this.scope.runTask(() => {
171
+ return createMemo(() => {
172
+ return this.parent.isAttached() && this.isAttachedDescendant();
173
+ });
174
+ });
175
+
176
+ this.evaluator = evaluator;
177
+ this.getActiveLanguage = parent.getActiveLanguage;
141
178
 
142
- parentContextNode.append(element);
179
+ const { readonly, relevant, required } = definition.bind;
143
180
 
144
- return element;
181
+ this.isSelfReadonly = createComputedExpression(this, readonly, {
182
+ defaultValue: true,
183
+ });
184
+ this.isSelfRelevant = createComputedExpression(this, relevant, {
185
+ defaultValue: false,
186
+ });
187
+ this.isRequired = createComputedExpression(this, required, {
188
+ defaultValue: false,
189
+ });
145
190
  }
146
191
 
147
192
  /**
@@ -1,10 +1,18 @@
1
- import type { XFormsXPathEvaluator } from '@getodk/xpath';
1
+ import type { XPathNodeKindKey } from '@getodk/xpath';
2
2
  import type { Accessor, Signal } from 'solid-js';
3
3
  import type { BaseNode } from '../../client/BaseNode.ts';
4
4
  import type { NodeAppearances } from '../../client/NodeAppearances.ts';
5
- import type { InstanceNodeType } from '../../client/node-types.ts';
5
+ import type { FormNodeID } from '../../client/identity.ts';
6
+ import type { InstanceNodeType as ClientInstanceNodeType } from '../../client/node-types.ts';
7
+ import type { SubmissionState } from '../../client/submission/SubmissionState.ts';
6
8
  import type { NodeValidationState } from '../../client/validation.ts';
7
- import type { TextRange } from '../../index.ts';
9
+ import type { ActiveLanguage, TextRange } from '../../index.ts';
10
+ import type { EngineXPathEvaluator } from '../../integration/xpath/EngineXPathEvaluator.ts';
11
+ import type {
12
+ XFormsXPathPrimaryInstanceNode,
13
+ XFormsXPathPrimaryInstanceNodeKind,
14
+ } from '../../integration/xpath/adapter/XFormsXPathNode.ts';
15
+ import type { PrimaryInstanceXPathNode } from '../../integration/xpath/adapter/kind.ts';
8
16
  import type { MaterializedChildren } from '../../lib/reactivity/materializeCurrentStateChildren.ts';
9
17
  import type { CurrentState } from '../../lib/reactivity/node-state/createCurrentState.ts';
10
18
  import type { EngineState } from '../../lib/reactivity/node-state/createEngineState.ts';
@@ -13,13 +21,18 @@ import type { ReactiveScope } from '../../lib/reactivity/scope.ts';
13
21
  import { createReactiveScope } from '../../lib/reactivity/scope.ts';
14
22
  import type { SimpleAtomicState } from '../../lib/reactivity/types.ts';
15
23
  import type { AnyNodeDefinition } from '../../parse/model/NodeDefinition.ts';
24
+ import type { PrimaryInstance } from '../PrimaryInstance.ts';
16
25
  import type { Root } from '../Root.ts';
17
26
  import type { AnyChildNode, AnyNode, AnyParentNode } from '../hierarchy.ts';
18
- import type { NodeID } from '../identity.ts';
19
- import { declareNodeID } from '../identity.ts';
27
+ import { nodeID } from '../identity.ts';
20
28
  import type { EvaluationContext } from '../internal-api/EvaluationContext.ts';
21
29
  import type { InstanceConfig } from '../internal-api/InstanceConfig.ts';
22
- import type { SubscribableDependency } from '../internal-api/SubscribableDependency.ts';
30
+
31
+ export type EngineInstanceNodeType = ClientInstanceNodeType | 'primary-instance';
32
+
33
+ export interface BaseEngineNode extends Omit<BaseNode, 'nodeType'> {
34
+ readonly nodeType: EngineInstanceNodeType;
35
+ }
23
36
 
24
37
  export interface InstanceNodeStateSpec<Value = never> {
25
38
  readonly reference: Accessor<string> | string;
@@ -28,7 +41,7 @@ export interface InstanceNodeStateSpec<Value = never> {
28
41
  readonly required: Accessor<boolean> | boolean;
29
42
  readonly label: Accessor<TextRange<'label'> | null> | null;
30
43
  readonly hint: Accessor<TextRange<'hint'> | null> | null;
31
- readonly children: Accessor<readonly NodeID[]> | null;
44
+ readonly children: Accessor<readonly FormNodeID[]> | null;
32
45
  readonly valueOptions: Accessor<null> | Accessor<readonly unknown[]> | null;
33
46
  readonly value: Signal<Value> | SimpleAtomicState<Value> | null;
34
47
  }
@@ -71,19 +84,26 @@ type ComputeInstanceNodeReference = <This extends ComputableReferenceNode>(
71
84
 
72
85
  export interface InstanceNodeOptions {
73
86
  readonly computeReference?: () => string;
87
+ readonly scope?: ReactiveScope;
74
88
  }
75
89
 
76
90
  export abstract class InstanceNode<
77
91
  Definition extends AnyNodeDefinition,
78
92
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
79
93
  Spec extends InstanceNodeStateSpec<any>,
94
+ Parent extends AnyParentNode | null,
80
95
  Child extends AnyChildNode | null = null,
81
96
  >
82
- implements BaseNode, EvaluationContext, SubscribableDependency
97
+ implements BaseEngineNode, XFormsXPathPrimaryInstanceNode, EvaluationContext
83
98
  {
84
99
  protected abstract readonly state: SharedNodeState<Spec>;
85
100
  protected abstract readonly engineState: EngineState<Spec>;
86
101
 
102
+ // XFormsXPathPrimaryInstanceNode
103
+ abstract readonly [XPathNodeKindKey]: XFormsXPathPrimaryInstanceNodeKind;
104
+ readonly rootDocument: PrimaryInstance;
105
+ abstract readonly root: Root;
106
+
87
107
  /**
88
108
  * @package Exposed on every node type to facilitate inheritance, as well as
89
109
  * conditional behavior for value nodes.
@@ -109,10 +129,10 @@ export abstract class InstanceNode<
109
129
  abstract readonly isRelevant: Accessor<boolean>;
110
130
 
111
131
  // BaseNode: identity
112
- readonly nodeId: NodeID;
132
+ readonly nodeId: FormNodeID;
113
133
 
114
134
  // BaseNode: node types and variants (e.g. for narrowing)
115
- abstract readonly nodeType: InstanceNodeType;
135
+ abstract readonly nodeType: EngineInstanceNodeType;
116
136
 
117
137
  abstract readonly appearances: NodeAppearances<Definition>;
118
138
 
@@ -120,15 +140,15 @@ export abstract class InstanceNode<
120
140
 
121
141
  abstract readonly validationState: NodeValidationState;
122
142
 
123
- // BaseNode: structural
124
- abstract readonly root: Root;
143
+ abstract readonly submissionState: SubmissionState;
125
144
 
126
145
  // EvaluationContext: instance-global/shared
127
- abstract readonly evaluator: XFormsXPathEvaluator;
146
+ abstract readonly evaluator: EngineXPathEvaluator;
147
+ abstract readonly getActiveLanguage: Accessor<ActiveLanguage>;
128
148
 
129
- // EvaluationContext *and* Subscribable: node-specific
149
+ // EvaluationContext: node-specific
150
+ abstract readonly isAttached: Accessor<boolean>;
130
151
  readonly scope: ReactiveScope;
131
-
132
152
  readonly computeReference: ComputeInstanceNodeReference;
133
153
 
134
154
  protected readonly computeChildStepReference: ComputeInstanceNodeReference = (
@@ -149,114 +169,92 @@ export abstract class InstanceNode<
149
169
  return this.computeReference(this.parent, this.definition);
150
170
  };
151
171
 
152
- abstract readonly contextNode: Element;
172
+ /**
173
+ * Note: it is expected that at least some node subclasses will override this
174
+ * to reflect (or in the case of intermediate abstract base classes, to
175
+ * constrain) their more specific `this` type.
176
+ */
177
+ readonly contextNode: PrimaryInstanceXPathNode =
178
+ this as AnyInstanceNode as PrimaryInstanceXPathNode;
153
179
 
154
180
  constructor(
155
181
  readonly engineConfig: InstanceConfig,
156
- readonly parent: AnyParentNode | null,
182
+ readonly parent: Parent,
157
183
  readonly definition: Definition,
158
184
  options?: InstanceNodeOptions
159
185
  ) {
160
- this.computeReference = options?.computeReference ?? this.computeChildStepReference;
161
-
162
- this.scope = createReactiveScope();
163
- this.engineConfig = engineConfig;
164
- this.nodeId = declareNodeID(engineConfig.createUniqueId());
165
- this.definition = definition;
166
- }
167
-
168
- /**
169
- * @package This presently serves a few internal use cases, where certain
170
- * behaviors depend on arbitrary traversal from any point in the instance
171
- * tree, without particular regard for the visited node type. It isn't
172
- * intended for external traversal or any other means of consuming children by
173
- * a client. This return type intentionally deviates from one structural
174
- * expectation, requiring even leaf nodes to return an array (though for those
175
- * nodes it will always be empty). This affords consistency and efficiency of
176
- * interface for those internal uses.
177
- */
178
- abstract getChildren(this: AnyInstanceNode): readonly AnyChildNode[];
186
+ const self = this as AnyInstanceNode as AnyNode;
179
187
 
180
- getNodesByReference(
181
- this: AnyNode,
182
- visited: WeakSet<AnyNode>,
183
- dependencyReference: string
184
- ): readonly SubscribableDependency[] {
185
- if (visited.has(this)) {
186
- return [];
187
- }
188
-
189
- visited.add(this);
190
-
191
- const { nodeset } = this.definition;
192
-
193
- if (dependencyReference === nodeset) {
194
- if (this.nodeType === 'repeat-instance') {
195
- return [this.parent];
188
+ if (parent == null) {
189
+ if (!self.isPrimaryInstance()) {
190
+ throw new Error(
191
+ 'Failed to construct node: not a primary instance, no parent node specified'
192
+ );
196
193
  }
197
194
 
198
- return [this];
195
+ this.rootDocument = self;
196
+ } else {
197
+ this.rootDocument = parent.rootDocument;
199
198
  }
200
199
 
201
- if (
202
- dependencyReference.startsWith(`${nodeset}/`) ||
203
- dependencyReference.startsWith(`${nodeset}[`)
204
- ) {
205
- return this.getChildren().flatMap((child) => {
206
- return child.getNodesByReference(visited, dependencyReference);
207
- });
208
- }
200
+ this.computeReference = options?.computeReference ?? this.computeChildStepReference;
209
201
 
210
- return this.parent?.getNodesByReference(visited, dependencyReference) ?? [];
202
+ this.scope = options?.scope ?? createReactiveScope();
203
+ this.engineConfig = engineConfig;
204
+ this.nodeId = nodeID(engineConfig.createUniqueId());
205
+ this.definition = definition;
211
206
  }
212
207
 
213
- // EvaluationContext: node-relative
214
- getSubscribableDependenciesByReference(
215
- this: AnyNode,
216
- reference: string
217
- ): readonly SubscribableDependency[] {
218
- if (this.nodeType === 'root') {
219
- const visited = new WeakSet<AnyNode>();
220
-
221
- return this.getNodesByReference(visited, reference);
222
- }
208
+ /** @package */
209
+ isPrimaryInstance(): this is PrimaryInstance {
210
+ return this.parent == null;
211
+ }
223
212
 
224
- return this.root.getSubscribableDependenciesByReference(reference);
213
+ /** @package */
214
+ isRoot(): this is Root {
215
+ return this.parent?.nodeType === 'primary-instance';
225
216
  }
226
217
 
227
- // SubscribableDependency
228
218
  /**
229
- * This is a default implementation suitable for most node types. The rest
230
- * (currently: `Root`, `RepeatRange`, `RepeatInstance`) should likely extend
231
- * this behavior, rather than simply overriding it.
219
+ * @package This presently serves a growing variety of internal use cases,
220
+ * where certain behaviors depend on arbitrary traversal from any point in the
221
+ * instance tree, without particular regard for the visited node type. It
222
+ * isn't intended for external traversal or any other means of consuming
223
+ * children by a client. This return type intentionally deviates from one
224
+ * structural expectation, requiring even leaf nodes to return an array
225
+ * (though for those nodes it will always be empty). This affords consistency
226
+ * and efficiency of interface for those internal uses.
232
227
  */
233
- subscribe(): void {
234
- const { engineState } = this;
235
-
236
- // Note: a previous iteration of this default implementation guarded these
237
- // reactive reads behind a relevance check. This caused timing issues for
238
- // downstream computations referencing a node whose relevance changes.
239
- //
240
- // That original guard was intended to reduce excessive redundant
241
- // computations, and so removing it is intended as a naive compromise of
242
- // performance for obvious correctness improvements.
243
- //
244
- // This compromise, like many others, will be moot if/when we decide to
245
- // decouple XPath evaluation from the browser/XML DOM: reactive
246
- // subscriptions would be established by evaluation of the expressions
247
- // themselves (as they traverse instance state and access values), rather
248
- // than this safer/less focused approach.
249
-
250
- // TODO: typescript-eslint is right to object to these! We should _at least_
251
- // make internal reactive reads obvious, i.e. function calls.
252
-
253
- // eslint-disable-next-line @typescript-eslint/no-unused-expressions
254
- engineState.reference;
255
- // eslint-disable-next-line @typescript-eslint/no-unused-expressions
256
- engineState.relevant;
257
- // eslint-disable-next-line @typescript-eslint/no-unused-expressions
258
- engineState.children;
259
- // eslint-disable-next-line @typescript-eslint/no-unused-expressions
260
- engineState.value;
228
+ abstract getChildren(this: AnyInstanceNode): readonly AnyChildNode[];
229
+
230
+ // XFormsXPathNode
231
+ /**
232
+ * @todo Values as text nodes(?)
233
+ */
234
+ getXPathChildNodes(): readonly AnyChildNode[] {
235
+ return (this as AnyInstanceNode).getChildren().flatMap((child) => {
236
+ switch (child.nodeType) {
237
+ case 'repeat-range:controlled':
238
+ case 'repeat-range:uncontrolled': {
239
+ const repeatInstances = child.getXPathChildNodes();
240
+
241
+ if (repeatInstances.length > 0) {
242
+ return repeatInstances;
243
+ }
244
+
245
+ return child;
246
+ }
247
+
248
+ default:
249
+ return child;
250
+ }
251
+ });
252
+ }
253
+
254
+ getXPathValue(): string {
255
+ return (this as AnyInstanceNode as AnyNode)
256
+ .getXPathChildNodes()
257
+ .map((child) => child.getXPathValue())
258
+ .join('');
261
259
  }
262
260
  }
@@ -1,6 +1,8 @@
1
1
  import { identity } from '@getodk/common/lib/identity.ts';
2
+ import { XPathNodeKindKey } from '@getodk/xpath';
2
3
  import type { Accessor } from 'solid-js';
3
4
  import type { UnsupportedControlNodeType } from '../../client/node-types.ts';
5
+ import type { SubmissionState } from '../../client/submission/SubmissionState.ts';
4
6
  import type { TextRange } from '../../client/TextRange.ts';
5
7
  import type {
6
8
  UnsupportedControlDefinition,
@@ -8,6 +10,8 @@ import type {
8
10
  UnsupportedControlNode,
9
11
  } from '../../client/unsupported/UnsupportedControlNode.ts';
10
12
  import type { AnyViolation, LeafNodeValidationState } from '../../client/validation.ts';
13
+ import type { XFormsXPathElement } from '../../integration/xpath/adapter/XFormsXPathNode.ts';
14
+ import { createLeafNodeSubmissionState } from '../../lib/client-reactivity/submission/createLeafNodeSubmissionState.ts';
11
15
  import { createValueState } from '../../lib/reactivity/createValueState.ts';
12
16
  import type { CurrentState } from '../../lib/reactivity/node-state/createCurrentState.ts';
13
17
  import type { EngineState } from '../../lib/reactivity/node-state/createEngineState.ts';
@@ -23,9 +27,9 @@ import {
23
27
  type SharedValidationState,
24
28
  } from '../../lib/reactivity/validation/createValidation.ts';
25
29
  import type { UnknownAppearanceDefinition } from '../../parse/body/appearance/unknownAppearanceParser.ts';
26
- import type { GeneralParentNode } from '../hierarchy.ts';
30
+ import type { AnyUnsupportedControl, GeneralParentNode } from '../hierarchy.ts';
27
31
  import type { EvaluationContext } from '../internal-api/EvaluationContext.ts';
28
- import type { SubscribableDependency } from '../internal-api/SubscribableDependency.ts';
32
+ import type { ClientReactiveSubmittableLeafNode } from '../internal-api/submission/ClientReactiveSubmittableLeafNode.ts';
29
33
  import type { ValidationContext } from '../internal-api/ValidationContext.ts';
30
34
  import type { ValueContext } from '../internal-api/ValueContext.ts';
31
35
  import { DescendantNode, type DescendantNodeStateSpec } from './DescendantNode.ts';
@@ -61,17 +65,26 @@ class UnsupportedControlWriteError extends Error {
61
65
  }
62
66
 
63
67
  export abstract class UnsupportedControl<Type extends UnsupportedControlNodeType>
64
- extends DescendantNode<TypedUnsupportedControlDefinition<Type>, UnsupportedControlStateSpec, null>
68
+ extends DescendantNode<
69
+ TypedUnsupportedControlDefinition<Type>,
70
+ UnsupportedControlStateSpec,
71
+ GeneralParentNode,
72
+ null
73
+ >
65
74
  implements
66
75
  UnsupportedControlNode,
76
+ XFormsXPathElement,
67
77
  EvaluationContext,
68
- SubscribableDependency,
69
78
  ValidationContext,
70
- ValueContext<unknown>
79
+ ValueContext<unknown>,
80
+ ClientReactiveSubmittableLeafNode<unknown>
71
81
  {
72
82
  private readonly validation: SharedValidationState;
73
83
  protected readonly state: SharedNodeState<UnsupportedControlStateSpec>;
74
84
 
85
+ // XFormsXPathElement
86
+ override readonly [XPathNodeKindKey] = 'element';
87
+
75
88
  // InstanceNode
76
89
  protected readonly engineState: EngineState<UnsupportedControlStateSpec>;
77
90
 
@@ -85,7 +98,11 @@ export abstract class UnsupportedControl<Type extends UnsupportedControlNodeType
85
98
  return this.validation.currentState;
86
99
  }
87
100
 
101
+ readonly submissionState: SubmissionState;
102
+
88
103
  // ValueContext
104
+ abstract override readonly contextNode: AnyUnsupportedControl & this;
105
+
89
106
  readonly encodeValue = (instanceValue: unknown): string => {
90
107
  const encoded = instanceValue;
91
108
 
@@ -128,6 +145,12 @@ export abstract class UnsupportedControl<Type extends UnsupportedControlNodeType
128
145
  this.engineState = state.engineState;
129
146
  this.currentState = state.currentState;
130
147
  this.validation = createValidationState(this, sharedStateOptions);
148
+ this.submissionState = createLeafNodeSubmissionState(this);
149
+ }
150
+
151
+ // XFormsXPathElement
152
+ override getXPathValue(): string {
153
+ return this.encodeValue(this.engineState.value);
131
154
  }
132
155
 
133
156
  // ValidationContext