@getodk/xforms-engine 0.4.0 → 0.6.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 (392) hide show
  1. package/README.md +1 -1
  2. package/dist/client/BaseNode.d.ts +18 -3
  3. package/dist/client/BaseValueNode.d.ts +32 -0
  4. package/dist/client/EngineConfig.d.ts +49 -48
  5. package/dist/client/GroupNode.d.ts +1 -0
  6. package/dist/client/InputNode.d.ts +82 -0
  7. package/dist/client/ModelValueNode.d.ts +13 -7
  8. package/dist/client/NoteNode.d.ts +26 -9
  9. package/dist/client/RangeNode.d.ts +36 -0
  10. package/dist/client/RankNode.d.ts +46 -0
  11. package/dist/client/RootNode.d.ts +37 -7
  12. package/dist/client/SelectNode.d.ts +47 -25
  13. package/dist/client/SubtreeNode.d.ts +1 -0
  14. package/dist/client/TriggerNode.d.ts +10 -6
  15. package/dist/client/ValueType.d.ts +3 -0
  16. package/dist/client/constants.d.ts +50 -0
  17. package/dist/client/hierarchy.d.ts +8 -8
  18. package/dist/client/identity.d.ts +14 -0
  19. package/dist/client/node-types.d.ts +3 -2
  20. package/dist/client/resources.d.ts +93 -0
  21. package/dist/client/submission/SubmissionData.d.ts +7 -0
  22. package/dist/client/submission/SubmissionDefinition.d.ts +14 -0
  23. package/dist/client/submission/SubmissionInstanceFile.d.ts +6 -0
  24. package/dist/client/submission/SubmissionOptions.d.ts +23 -0
  25. package/dist/client/submission/SubmissionResult.d.ts +91 -0
  26. package/dist/client/submission/SubmissionState.d.ts +12 -0
  27. package/dist/client/unsupported/UnsupportedControlNode.d.ts +1 -3
  28. package/dist/client/validation.d.ts +2 -2
  29. package/dist/error/ErrorProductionDesignPendingError.d.ts +7 -0
  30. package/dist/error/RankMissingValueError.d.ts +3 -0
  31. package/dist/error/RankValueTypeError.d.ts +6 -0
  32. package/dist/error/SelectValueTypeError.d.ts +15 -0
  33. package/dist/error/ValueTypeInvariantError.d.ts +17 -0
  34. package/dist/error/XFormsSpecViolationError.d.ts +2 -0
  35. package/dist/error/XPathFunctionalityError.d.ts +14 -0
  36. package/dist/error/XPathFunctionalityNotSupportedError.d.ts +7 -0
  37. package/dist/error/XPathFunctionalityPendingError.d.ts +7 -0
  38. package/dist/index.d.ts +12 -4
  39. package/dist/index.js +17864 -14655
  40. package/dist/index.js.map +1 -1
  41. package/dist/instance/Group.d.ts +10 -4
  42. package/dist/instance/InputControl.d.ts +38 -0
  43. package/dist/instance/ModelValue.d.ts +17 -25
  44. package/dist/instance/Note.d.ts +16 -21
  45. package/dist/instance/PrimaryInstance.d.ts +85 -0
  46. package/dist/instance/RangeControl.d.ts +34 -0
  47. package/dist/instance/RankControl.d.ts +40 -0
  48. package/dist/instance/Root.d.ts +30 -25
  49. package/dist/instance/SelectControl.d.ts +66 -0
  50. package/dist/instance/Subtree.d.ts +11 -5
  51. package/dist/instance/TriggerControl.d.ts +13 -19
  52. package/dist/instance/abstract/DescendantNode.d.ts +32 -25
  53. package/dist/instance/abstract/InstanceNode.d.ts +52 -30
  54. package/dist/instance/abstract/UnsupportedControl.d.ts +11 -3
  55. package/dist/instance/abstract/ValueNode.d.ts +47 -0
  56. package/dist/instance/hierarchy.d.ts +13 -12
  57. package/dist/instance/identity.d.ts +2 -7
  58. package/dist/instance/internal-api/EvaluationContext.d.ts +53 -12
  59. package/dist/instance/internal-api/InstanceConfig.d.ts +8 -2
  60. package/dist/instance/internal-api/InstanceValueContext.d.ts +22 -0
  61. package/dist/instance/internal-api/PrimaryInstanceDocument.d.ts +36 -0
  62. package/dist/instance/internal-api/TranslationContext.d.ts +3 -2
  63. package/dist/instance/internal-api/ValidationContext.d.ts +3 -4
  64. package/dist/instance/internal-api/ValueContext.d.ts +2 -1
  65. package/dist/instance/internal-api/submission/ClientReactiveSubmittableInstance.d.ts +14 -0
  66. package/dist/instance/internal-api/submission/ClientReactiveSubmittableLeafNode.d.ts +32 -0
  67. package/dist/instance/internal-api/submission/ClientReactiveSubmittableParentNode.d.ts +19 -0
  68. package/dist/instance/internal-api/submission/ClientReactiveSubmittableValueNode.d.ts +18 -0
  69. package/dist/instance/repeat/BaseRepeatRange.d.ts +40 -83
  70. package/dist/instance/repeat/RepeatInstance.d.ts +12 -29
  71. package/dist/instance/repeat/RepeatRangeControlled.d.ts +2 -2
  72. package/dist/instance/repeat/RepeatRangeUncontrolled.d.ts +2 -2
  73. package/dist/instance/resource.d.ts +1 -1
  74. package/dist/instance/text/TextRange.d.ts +1 -1
  75. package/dist/instance/unsupported/UploadControl.d.ts +3 -1
  76. package/dist/integration/xpath/EngineXPathEvaluator.d.ts +14 -0
  77. package/dist/integration/xpath/adapter/XFormsXPathNode.d.ts +71 -0
  78. package/dist/integration/xpath/adapter/engineDOMAdapter.d.ts +5 -0
  79. package/dist/integration/xpath/adapter/kind.d.ts +32 -0
  80. package/dist/integration/xpath/adapter/names.d.ts +6 -0
  81. package/dist/integration/xpath/adapter/traversal.d.ts +26 -0
  82. package/dist/integration/xpath/adapter/values.d.ts +2 -0
  83. package/dist/integration/xpath/static-dom/StaticAttribute.d.ts +26 -0
  84. package/dist/integration/xpath/static-dom/StaticDocument.d.ts +15 -0
  85. package/dist/integration/xpath/static-dom/StaticElement.d.ts +48 -0
  86. package/dist/integration/xpath/static-dom/StaticNode.d.ts +33 -0
  87. package/dist/integration/xpath/static-dom/StaticText.d.ts +16 -0
  88. package/dist/lib/client-reactivity/submission/createInstanceSubmissionState.d.ts +3 -0
  89. package/dist/lib/client-reactivity/submission/createLeafNodeSubmissionState.d.ts +3 -0
  90. package/dist/lib/client-reactivity/submission/createNodeRangeSubmissionState.d.ts +4 -0
  91. package/dist/lib/client-reactivity/submission/createParentNodeSubmissionState.d.ts +4 -0
  92. package/dist/lib/client-reactivity/submission/createRootSubmissionState.d.ts +3 -0
  93. package/dist/lib/client-reactivity/submission/createValueNodeSubmissionState.d.ts +3 -0
  94. package/dist/lib/client-reactivity/submission/prepareSubmission.d.ts +8 -0
  95. package/dist/lib/codecs/DecimalValueCodec.d.ts +6 -0
  96. package/dist/lib/codecs/Geopoint/Geopoint.d.ts +48 -0
  97. package/dist/lib/codecs/Geopoint/GeopointValueCodec.d.ts +5 -0
  98. package/dist/lib/codecs/IntValueCodec.d.ts +6 -0
  99. package/dist/lib/codecs/NoteCodec.d.ts +8 -0
  100. package/dist/lib/codecs/RangeCodec.d.ts +8 -0
  101. package/dist/lib/codecs/StringValueCodec.d.ts +4 -0
  102. package/dist/lib/codecs/TriggerCodec.d.ts +7 -0
  103. package/dist/lib/codecs/ValueArrayCodec.d.ts +11 -0
  104. package/dist/lib/codecs/ValueCodec.d.ts +30 -0
  105. package/dist/lib/codecs/ValueTypePlaceholderCodec.d.ts +12 -0
  106. package/dist/lib/codecs/getNoteCodec.d.ts +3 -0
  107. package/dist/lib/codecs/getSelectCodec.d.ts +5 -0
  108. package/dist/lib/codecs/getSharedValueCodec.d.ts +48 -0
  109. package/dist/lib/codecs/items/BaseItemCodec.d.ts +9 -0
  110. package/dist/lib/codecs/items/MultipleValueItemCodec.d.ts +14 -0
  111. package/dist/lib/codecs/items/SingleValueItemCodec.d.ts +24 -0
  112. package/dist/lib/dom/query.d.ts +4 -2
  113. package/dist/lib/names/NamespaceDeclaration.d.ts +45 -0
  114. package/dist/lib/names/NamespaceDeclarationMap.d.ts +137 -0
  115. package/dist/lib/names/NamespaceURL.d.ts +30 -0
  116. package/dist/lib/names/QualifiedName.d.ts +113 -0
  117. package/dist/lib/number-parsers.d.ts +2 -0
  118. package/dist/lib/reactivity/createChildrenState.d.ts +7 -5
  119. package/dist/lib/reactivity/createComputedExpression.d.ts +18 -5
  120. package/dist/lib/reactivity/createInstanceValueState.d.ts +40 -0
  121. package/dist/lib/reactivity/createItemCollection.d.ts +21 -0
  122. package/dist/lib/reactivity/createNoteReadonlyThunk.d.ts +2 -2
  123. package/dist/lib/reactivity/createTranslationState.d.ts +19 -0
  124. package/dist/lib/reactivity/createValueState.d.ts +6 -10
  125. package/dist/lib/reactivity/materializeCurrentStateChildren.d.ts +4 -4
  126. package/dist/lib/xml-serialization.d.ts +50 -0
  127. package/dist/parse/XFormDOM.d.ts +18 -7
  128. package/dist/parse/XFormDefinition.d.ts +1 -2
  129. package/dist/parse/attachments/FormAttachmentResource.d.ts +27 -0
  130. package/dist/parse/body/BodyDefinition.d.ts +4 -4
  131. package/dist/parse/body/RepeatElementDefinition.d.ts +1 -1
  132. package/dist/parse/body/appearance/inputAppearanceParser.d.ts +1 -1
  133. package/dist/parse/body/appearance/rangeAppearanceParser.d.ts +3 -0
  134. package/dist/parse/body/control/{InputDefinition.d.ts → InputControlDefinition.d.ts} +4 -1
  135. package/dist/parse/body/control/ItemDefinition.d.ts +14 -0
  136. package/dist/parse/body/control/ItemsetDefinition.d.ts +18 -0
  137. package/dist/parse/body/control/RangeControlDefinition.d.ts +31 -2
  138. package/dist/parse/body/control/RankControlDefinition.d.ts +7 -3
  139. package/dist/parse/body/control/{select/SelectDefinition.d.ts → SelectControlDefinition.d.ts} +9 -9
  140. package/dist/parse/expression/ItemsetNodesetExpression.d.ts +1 -1
  141. package/dist/parse/expression/ItemsetValueExpression.d.ts +1 -1
  142. package/dist/parse/expression/abstract/DependencyContext.d.ts +0 -5
  143. package/dist/parse/expression/abstract/DependentExpression.d.ts +2 -3
  144. package/dist/parse/model/BindDefinition.d.ts +6 -5
  145. package/dist/parse/model/BindPreloadDefinition.d.ts +42 -0
  146. package/dist/parse/model/BindTypeDefinition.d.ts +20 -0
  147. package/dist/parse/model/DescendentNodeDefinition.d.ts +4 -14
  148. package/dist/parse/model/FormSubmissionDefinition.d.ts +8 -0
  149. package/dist/parse/model/ItextTranslation/ItextTranslationDefinition.d.ts +4 -0
  150. package/dist/parse/model/ItextTranslation/ItextTranslationRootDefinition.d.ts +9 -0
  151. package/dist/parse/model/ItextTranslation/ItextTranslationsDefinition.d.ts +8 -0
  152. package/dist/parse/model/LeafNodeDefinition.d.ts +9 -4
  153. package/dist/parse/model/ModelBindMap.d.ts +1 -1
  154. package/dist/parse/model/ModelDefinition.d.ts +2 -0
  155. package/dist/parse/model/NodeDefinition.d.ts +16 -20
  156. package/dist/parse/model/NoteNodeDefinition.d.ts +9 -8
  157. package/dist/parse/model/RangeNodeDefinition.d.ts +41 -0
  158. package/dist/parse/model/RepeatInstanceDefinition.d.ts +7 -4
  159. package/dist/parse/model/RepeatRangeDefinition.d.ts +7 -4
  160. package/dist/parse/model/RepeatTemplateDefinition.d.ts +7 -4
  161. package/dist/parse/model/RootAttributeDefinition.d.ts +24 -0
  162. package/dist/parse/model/RootAttributeMap.d.ts +23 -0
  163. package/dist/parse/model/RootDefinition.d.ts +12 -9
  164. package/dist/parse/model/SecondaryInstance/SecondaryInstanceDefinition.d.ts +4 -0
  165. package/dist/parse/model/SecondaryInstance/SecondaryInstanceRootDefinition.d.ts +7 -0
  166. package/dist/parse/model/SecondaryInstance/SecondaryInstancesDefinition.d.ts +13 -0
  167. package/dist/parse/model/SecondaryInstance/sources/BlankSecondaryInstanceSource.d.ts +14 -0
  168. package/dist/parse/model/SecondaryInstance/sources/CSVExternalSecondaryInstance.d.ts +22 -0
  169. package/dist/parse/model/SecondaryInstance/sources/ExternalSecondaryInstanceResource.d.ts +23 -0
  170. package/dist/parse/model/SecondaryInstance/sources/ExternalSecondaryInstanceSource.d.ts +9 -0
  171. package/dist/parse/model/SecondaryInstance/sources/GeoJSONExternalSecondaryInstance.d.ts +5 -0
  172. package/dist/parse/model/SecondaryInstance/sources/InternalSecondaryInstanceSource.d.ts +7 -0
  173. package/dist/parse/model/SecondaryInstance/sources/SecondaryInstanceSource.d.ts +13 -0
  174. package/dist/parse/model/SecondaryInstance/sources/XMLExternalSecondaryInstanceSource.d.ts +12 -0
  175. package/dist/parse/model/SubtreeDefinition.d.ts +7 -4
  176. package/dist/parse/shared/parseStaticDocumentFromDOMSubtree.d.ts +23 -0
  177. package/dist/parse/text/ItemLabelDefinition.d.ts +1 -1
  178. package/dist/parse/text/ItemsetLabelDefinition.d.ts +2 -2
  179. package/dist/parse/text/abstract/TextElementDefinition.d.ts +1 -1
  180. package/dist/parse/text/abstract/TextRangeDefinition.d.ts +0 -2
  181. package/dist/parse/xpath/semantic-analysis.d.ts +6 -3
  182. package/dist/solid.js +15437 -12246
  183. package/dist/solid.js.map +1 -1
  184. package/package.json +18 -13
  185. package/src/client/BaseNode.ts +21 -6
  186. package/src/client/BaseValueNode.ts +35 -0
  187. package/src/client/EngineConfig.ts +52 -51
  188. package/src/client/GroupNode.ts +1 -0
  189. package/src/client/InputNode.ts +113 -0
  190. package/src/client/ModelValueNode.ts +31 -7
  191. package/src/client/NoteNode.ts +45 -9
  192. package/src/client/RangeNode.ts +51 -0
  193. package/src/client/RankNode.ts +54 -0
  194. package/src/client/RootNode.ts +43 -7
  195. package/src/client/SelectNode.ts +53 -26
  196. package/src/client/SubtreeNode.ts +1 -0
  197. package/src/client/TriggerNode.ts +12 -6
  198. package/src/client/ValueType.ts +4 -0
  199. package/src/client/constants.ts +67 -0
  200. package/src/client/hierarchy.ts +12 -13
  201. package/src/client/identity.ts +16 -0
  202. package/src/client/node-types.ts +13 -7
  203. package/src/client/resources.ts +118 -0
  204. package/src/client/submission/SubmissionData.ts +12 -0
  205. package/src/client/submission/SubmissionDefinition.ts +16 -0
  206. package/src/client/submission/SubmissionInstanceFile.ts +9 -0
  207. package/src/client/submission/SubmissionOptions.ts +28 -0
  208. package/src/client/submission/SubmissionResult.ts +124 -0
  209. package/src/client/submission/SubmissionState.ts +14 -0
  210. package/src/client/unsupported/UnsupportedControlNode.ts +2 -6
  211. package/src/client/validation.ts +2 -2
  212. package/src/error/ErrorProductionDesignPendingError.ts +6 -0
  213. package/src/error/RankMissingValueError.ts +5 -0
  214. package/src/error/RankValueTypeError.ts +13 -0
  215. package/src/error/SelectValueTypeError.ts +22 -0
  216. package/src/error/ValueTypeInvariantError.ts +22 -0
  217. package/src/error/XFormsSpecViolationError.ts +1 -0
  218. package/src/error/XPathFunctionalityError.ts +26 -0
  219. package/src/error/XPathFunctionalityNotSupportedError.ts +18 -0
  220. package/src/error/XPathFunctionalityPendingError.ts +18 -0
  221. package/src/index.ts +12 -13
  222. package/src/instance/Group.ts +18 -5
  223. package/src/instance/InputControl.ts +159 -0
  224. package/src/instance/ModelValue.ts +48 -53
  225. package/src/instance/Note.ts +40 -49
  226. package/src/instance/PrimaryInstance.ts +245 -0
  227. package/src/instance/RangeControl.ts +113 -0
  228. package/src/instance/RankControl.ts +199 -0
  229. package/src/instance/Root.ts +63 -134
  230. package/src/instance/SelectControl.ts +219 -0
  231. package/src/instance/Subtree.ts +20 -7
  232. package/src/instance/TriggerControl.ts +44 -66
  233. package/src/instance/abstract/DescendantNode.ts +91 -51
  234. package/src/instance/abstract/InstanceNode.ts +113 -107
  235. package/src/instance/abstract/UnsupportedControl.ts +29 -5
  236. package/src/instance/abstract/ValueNode.ts +128 -0
  237. package/src/instance/children.ts +80 -40
  238. package/src/instance/hierarchy.ts +39 -30
  239. package/src/instance/identity.ts +3 -9
  240. package/src/instance/index.ts +25 -7
  241. package/src/instance/internal-api/EvaluationContext.ts +60 -13
  242. package/src/instance/internal-api/InstanceConfig.ts +9 -2
  243. package/src/instance/internal-api/InstanceValueContext.ts +26 -0
  244. package/src/instance/internal-api/PrimaryInstanceDocument.ts +53 -0
  245. package/src/instance/internal-api/TranslationContext.ts +3 -2
  246. package/src/instance/internal-api/ValidationContext.ts +3 -4
  247. package/src/instance/internal-api/ValueContext.ts +2 -1
  248. package/src/instance/internal-api/submission/ClientReactiveSubmittableInstance.ts +20 -0
  249. package/src/instance/internal-api/submission/ClientReactiveSubmittableLeafNode.ts +43 -0
  250. package/src/instance/internal-api/submission/ClientReactiveSubmittableParentNode.ts +26 -0
  251. package/src/instance/internal-api/submission/ClientReactiveSubmittableValueNode.ts +24 -0
  252. package/src/instance/repeat/BaseRepeatRange.ts +52 -131
  253. package/src/instance/repeat/RepeatInstance.ts +21 -46
  254. package/src/instance/repeat/RepeatRangeControlled.ts +5 -5
  255. package/src/instance/repeat/RepeatRangeUncontrolled.ts +2 -4
  256. package/src/instance/resource.ts +5 -2
  257. package/src/instance/text/TextChunk.ts +1 -1
  258. package/src/instance/unsupported/UploadControl.ts +5 -1
  259. package/src/integration/xpath/EngineXPathEvaluator.ts +22 -0
  260. package/src/integration/xpath/adapter/XFormsXPathNode.ts +126 -0
  261. package/src/integration/xpath/adapter/engineDOMAdapter.ts +57 -0
  262. package/src/integration/xpath/adapter/kind.ts +114 -0
  263. package/src/integration/xpath/adapter/names.ts +148 -0
  264. package/src/integration/xpath/adapter/traversal.ts +229 -0
  265. package/src/integration/xpath/adapter/values.ts +5 -0
  266. package/src/integration/xpath/static-dom/StaticAttribute.ts +41 -0
  267. package/src/integration/xpath/static-dom/StaticDocument.ts +36 -0
  268. package/src/integration/xpath/static-dom/StaticElement.ts +119 -0
  269. package/src/integration/xpath/static-dom/StaticNode.ts +68 -0
  270. package/src/integration/xpath/static-dom/StaticText.ts +28 -0
  271. package/src/lib/client-reactivity/README.md +0 -0
  272. package/src/lib/client-reactivity/submission/createInstanceSubmissionState.ts +12 -0
  273. package/src/lib/client-reactivity/submission/createLeafNodeSubmissionState.ts +20 -0
  274. package/src/lib/client-reactivity/submission/createNodeRangeSubmissionState.ts +17 -0
  275. package/src/lib/client-reactivity/submission/createParentNodeSubmissionState.ts +22 -0
  276. package/src/lib/client-reactivity/submission/createRootSubmissionState.ts +19 -0
  277. package/src/lib/client-reactivity/submission/createValueNodeSubmissionState.ts +21 -0
  278. package/src/lib/client-reactivity/submission/prepareSubmission.ts +172 -0
  279. package/src/lib/codecs/DecimalValueCodec.ts +46 -0
  280. package/src/lib/codecs/Geopoint/Geopoint.ts +150 -0
  281. package/src/lib/codecs/Geopoint/GeopointValueCodec.ts +20 -0
  282. package/src/lib/codecs/IntValueCodec.ts +100 -0
  283. package/src/lib/codecs/NoteCodec.ts +32 -0
  284. package/src/lib/codecs/RangeCodec.ts +65 -0
  285. package/src/lib/codecs/StringValueCodec.ts +11 -0
  286. package/src/lib/codecs/TriggerCodec.ts +64 -0
  287. package/src/lib/codecs/ValueArrayCodec.ts +42 -0
  288. package/src/lib/codecs/ValueCodec.ts +106 -0
  289. package/src/lib/codecs/ValueTypePlaceholderCodec.ts +19 -0
  290. package/src/lib/codecs/getNoteCodec.ts +27 -0
  291. package/src/lib/codecs/getSelectCodec.ts +27 -0
  292. package/src/lib/codecs/getSharedValueCodec.ts +79 -0
  293. package/src/lib/codecs/items/BaseItemCodec.ts +20 -0
  294. package/src/lib/codecs/items/MultipleValueItemCodec.ts +28 -0
  295. package/src/lib/codecs/items/SingleValueItemCodec.ts +67 -0
  296. package/src/lib/dom/query.ts +8 -2
  297. package/src/lib/names/NamespaceDeclaration.ts +106 -0
  298. package/src/lib/names/NamespaceDeclarationMap.ts +228 -0
  299. package/src/lib/names/NamespaceURL.ts +44 -0
  300. package/src/lib/names/QualifiedName.ts +170 -0
  301. package/src/lib/number-parsers.ts +25 -0
  302. package/src/lib/reactivity/createChildrenState.ts +8 -6
  303. package/src/lib/reactivity/createComputedExpression.ts +57 -34
  304. package/src/lib/reactivity/createInstanceValueState.ts +216 -0
  305. package/src/lib/reactivity/createItemCollection.ts +173 -0
  306. package/src/lib/reactivity/createNoteReadonlyThunk.ts +12 -7
  307. package/src/lib/reactivity/createTranslationState.ts +61 -0
  308. package/src/lib/reactivity/createValueState.ts +62 -120
  309. package/src/lib/reactivity/materializeCurrentStateChildren.ts +7 -7
  310. package/src/lib/reactivity/text/createTextRange.ts +4 -3
  311. package/src/lib/reactivity/validation/createAggregatedViolations.ts +1 -1
  312. package/src/lib/reactivity/validation/createValidation.ts +2 -3
  313. package/src/lib/xml-serialization.ts +163 -0
  314. package/src/parse/XFormDOM.ts +231 -76
  315. package/src/parse/XFormDefinition.ts +2 -10
  316. package/src/parse/attachments/FormAttachmentResource.ts +40 -0
  317. package/src/parse/body/BodyDefinition.ts +7 -7
  318. package/src/parse/body/appearance/inputAppearanceParser.ts +1 -1
  319. package/src/parse/body/appearance/rangeAppearanceParser.ts +11 -0
  320. package/src/parse/body/control/InputControlDefinition.ts +29 -0
  321. package/src/parse/body/control/{select/ItemDefinition.ts → ItemDefinition.ts} +8 -6
  322. package/src/parse/body/control/{select/ItemsetDefinition.ts → ItemsetDefinition.ts} +11 -9
  323. package/src/parse/body/control/RangeControlDefinition.ts +91 -6
  324. package/src/parse/body/control/RankControlDefinition.ts +25 -7
  325. package/src/parse/body/control/{select/SelectDefinition.ts → SelectControlDefinition.ts} +9 -9
  326. package/src/parse/expression/ItemsetNodesetExpression.ts +1 -1
  327. package/src/parse/expression/ItemsetValueExpression.ts +1 -1
  328. package/src/parse/expression/abstract/DependencyContext.ts +0 -26
  329. package/src/parse/expression/abstract/DependentExpression.ts +2 -13
  330. package/src/parse/model/BindDefinition.ts +9 -8
  331. package/src/parse/model/BindPreloadDefinition.ts +100 -0
  332. package/src/parse/model/BindTypeDefinition.ts +175 -0
  333. package/src/parse/model/DescendentNodeDefinition.ts +7 -31
  334. package/src/parse/model/FormSubmissionDefinition.ts +44 -0
  335. package/src/parse/model/ItextTranslation/ItextTranslationDefinition.ts +4 -0
  336. package/src/parse/model/ItextTranslation/ItextTranslationRootDefinition.ts +42 -0
  337. package/src/parse/model/ItextTranslation/ItextTranslationsDefinition.ts +31 -0
  338. package/src/parse/model/LeafNodeDefinition.ts +15 -5
  339. package/src/parse/model/ModelBindMap.ts +6 -8
  340. package/src/parse/model/ModelDefinition.ts +6 -1
  341. package/src/parse/model/NodeDefinition.ts +24 -48
  342. package/src/parse/model/NoteNodeDefinition.ts +11 -10
  343. package/src/parse/model/RangeNodeDefinition.ts +118 -0
  344. package/src/parse/model/RepeatInstanceDefinition.ts +11 -7
  345. package/src/parse/model/RepeatRangeDefinition.ts +11 -7
  346. package/src/parse/model/RepeatTemplateDefinition.ts +11 -7
  347. package/src/parse/model/RootAttributeDefinition.ts +45 -0
  348. package/src/parse/model/RootAttributeMap.ts +44 -0
  349. package/src/parse/model/RootDefinition.ts +31 -29
  350. package/src/parse/model/SecondaryInstance/SecondaryInstanceDefinition.ts +4 -0
  351. package/src/parse/model/SecondaryInstance/SecondaryInstanceRootDefinition.ts +12 -0
  352. package/src/parse/model/SecondaryInstance/SecondaryInstancesDefinition.ts +102 -0
  353. package/src/parse/model/SecondaryInstance/sources/BlankSecondaryInstanceSource.ts +40 -0
  354. package/src/parse/model/SecondaryInstance/sources/CSVExternalSecondaryInstance.ts +288 -0
  355. package/src/parse/model/SecondaryInstance/sources/ExternalSecondaryInstanceResource.ts +222 -0
  356. package/src/parse/model/SecondaryInstance/sources/ExternalSecondaryInstanceSource.ts +22 -0
  357. package/src/parse/model/SecondaryInstance/sources/GeoJSONExternalSecondaryInstance.ts +415 -0
  358. package/src/parse/model/SecondaryInstance/sources/InternalSecondaryInstanceSource.ts +19 -0
  359. package/src/parse/model/SecondaryInstance/sources/SecondaryInstanceSource.ts +29 -0
  360. package/src/parse/model/SecondaryInstance/sources/XMLExternalSecondaryInstanceSource.ts +32 -0
  361. package/src/parse/model/SubtreeDefinition.ts +12 -12
  362. package/src/parse/shared/parseStaticDocumentFromDOMSubtree.ts +149 -0
  363. package/src/parse/text/ItemLabelDefinition.ts +1 -1
  364. package/src/parse/text/ItemsetLabelDefinition.ts +2 -2
  365. package/src/parse/text/abstract/TextElementDefinition.ts +1 -1
  366. package/src/parse/text/abstract/TextRangeDefinition.ts +0 -6
  367. package/src/parse/xpath/semantic-analysis.ts +33 -3
  368. package/dist/client/StringNode.d.ts +0 -46
  369. package/dist/client/unsupported/RangeNode.d.ts +0 -9
  370. package/dist/client/unsupported/RankNode.d.ts +0 -9
  371. package/dist/instance/SelectField.d.ts +0 -50
  372. package/dist/instance/StringField.d.ts +0 -44
  373. package/dist/instance/internal-api/SubscribableDependency.d.ts +0 -59
  374. package/dist/instance/unsupported/RangeControl.d.ts +0 -4
  375. package/dist/instance/unsupported/RankControl.d.ts +0 -4
  376. package/dist/lib/reactivity/createSelectItems.d.ts +0 -16
  377. package/dist/parse/XFormDataType.d.ts +0 -25
  378. package/dist/parse/body/control/select/ItemDefinition.d.ts +0 -13
  379. package/dist/parse/body/control/select/ItemsetDefinition.d.ts +0 -17
  380. package/dist/parse/body/control/select/ItemsetNodesetContext.d.ts +0 -11
  381. package/src/client/StringNode.ts +0 -52
  382. package/src/client/unsupported/RangeNode.ts +0 -14
  383. package/src/client/unsupported/RankNode.ts +0 -14
  384. package/src/instance/SelectField.ts +0 -226
  385. package/src/instance/StringField.ts +0 -120
  386. package/src/instance/internal-api/SubscribableDependency.ts +0 -61
  387. package/src/instance/unsupported/RangeControl.ts +0 -5
  388. package/src/instance/unsupported/RankControl.ts +0 -5
  389. package/src/lib/reactivity/createSelectItems.ts +0 -168
  390. package/src/parse/XFormDataType.ts +0 -62
  391. package/src/parse/body/control/InputDefinition.ts +0 -22
  392. package/src/parse/body/control/select/ItemsetNodesetContext.ts +0 -26
@@ -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,24 @@ 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
+ }
36
+
37
+ // prettier-ignore
38
+ export type InstanceNodeValueOptionsStateSpec =
39
+ | Accessor<null>
40
+ | Accessor<readonly unknown[]>
41
+ | null
23
42
 
24
43
  export interface InstanceNodeStateSpec<Value = never> {
25
44
  readonly reference: Accessor<string> | string;
@@ -28,8 +47,8 @@ export interface InstanceNodeStateSpec<Value = never> {
28
47
  readonly required: Accessor<boolean> | boolean;
29
48
  readonly label: Accessor<TextRange<'label'> | null> | null;
30
49
  readonly hint: Accessor<TextRange<'hint'> | null> | null;
31
- readonly children: Accessor<readonly NodeID[]> | null;
32
- readonly valueOptions: Accessor<null> | Accessor<readonly unknown[]> | null;
50
+ readonly children: Accessor<readonly FormNodeID[]> | null;
51
+ readonly valueOptions: InstanceNodeValueOptionsStateSpec;
33
52
  readonly value: Signal<Value> | SimpleAtomicState<Value> | null;
34
53
  }
35
54
 
@@ -71,19 +90,26 @@ type ComputeInstanceNodeReference = <This extends ComputableReferenceNode>(
71
90
 
72
91
  export interface InstanceNodeOptions {
73
92
  readonly computeReference?: () => string;
93
+ readonly scope?: ReactiveScope;
74
94
  }
75
95
 
76
96
  export abstract class InstanceNode<
77
97
  Definition extends AnyNodeDefinition,
78
98
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
79
99
  Spec extends InstanceNodeStateSpec<any>,
100
+ Parent extends AnyParentNode | null,
80
101
  Child extends AnyChildNode | null = null,
81
102
  >
82
- implements BaseNode, EvaluationContext, SubscribableDependency
103
+ implements BaseEngineNode, XFormsXPathPrimaryInstanceNode, EvaluationContext
83
104
  {
84
105
  protected abstract readonly state: SharedNodeState<Spec>;
85
106
  protected abstract readonly engineState: EngineState<Spec>;
86
107
 
108
+ // XFormsXPathPrimaryInstanceNode
109
+ abstract readonly [XPathNodeKindKey]: XFormsXPathPrimaryInstanceNodeKind;
110
+ readonly rootDocument: PrimaryInstance;
111
+ abstract readonly root: Root;
112
+
87
113
  /**
88
114
  * @package Exposed on every node type to facilitate inheritance, as well as
89
115
  * conditional behavior for value nodes.
@@ -109,26 +135,28 @@ export abstract class InstanceNode<
109
135
  abstract readonly isRelevant: Accessor<boolean>;
110
136
 
111
137
  // BaseNode: identity
112
- readonly nodeId: NodeID;
138
+ readonly nodeId: FormNodeID;
113
139
 
114
140
  // BaseNode: node types and variants (e.g. for narrowing)
115
- abstract readonly nodeType: InstanceNodeType;
141
+ abstract readonly nodeType: EngineInstanceNodeType;
116
142
 
117
143
  abstract readonly appearances: NodeAppearances<Definition>;
118
144
 
145
+ abstract readonly nodeOptions: object | null;
146
+
119
147
  abstract readonly currentState: InstanceNodeCurrentState<Spec, Child>;
120
148
 
121
149
  abstract readonly validationState: NodeValidationState;
122
150
 
123
- // BaseNode: structural
124
- abstract readonly root: Root;
151
+ abstract readonly submissionState: SubmissionState;
125
152
 
126
153
  // EvaluationContext: instance-global/shared
127
- abstract readonly evaluator: XFormsXPathEvaluator;
154
+ abstract readonly evaluator: EngineXPathEvaluator;
155
+ abstract readonly getActiveLanguage: Accessor<ActiveLanguage>;
128
156
 
129
- // EvaluationContext *and* Subscribable: node-specific
157
+ // EvaluationContext: node-specific
158
+ abstract readonly isAttached: Accessor<boolean>;
130
159
  readonly scope: ReactiveScope;
131
-
132
160
  readonly computeReference: ComputeInstanceNodeReference;
133
161
 
134
162
  protected readonly computeChildStepReference: ComputeInstanceNodeReference = (
@@ -141,7 +169,7 @@ export abstract class InstanceNode<
141
169
  );
142
170
  }
143
171
 
144
- return `${parent.contextReference()}/${definition.nodeName}`;
172
+ return `${parent.contextReference()}/${definition.qualifiedName.getPrefixedName()}`;
145
173
  };
146
174
 
147
175
  // EvaluationContext: node-specific
@@ -149,114 +177,92 @@ export abstract class InstanceNode<
149
177
  return this.computeReference(this.parent, this.definition);
150
178
  };
151
179
 
152
- abstract readonly contextNode: Element;
180
+ /**
181
+ * Note: it is expected that at least some node subclasses will override this
182
+ * to reflect (or in the case of intermediate abstract base classes, to
183
+ * constrain) their more specific `this` type.
184
+ */
185
+ readonly contextNode: PrimaryInstanceXPathNode =
186
+ this as AnyInstanceNode as PrimaryInstanceXPathNode;
153
187
 
154
188
  constructor(
155
189
  readonly engineConfig: InstanceConfig,
156
- readonly parent: AnyParentNode | null,
190
+ readonly parent: Parent,
157
191
  readonly definition: Definition,
158
192
  options?: InstanceNodeOptions
159
193
  ) {
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
- }
194
+ const self = this as AnyInstanceNode as AnyNode;
167
195
 
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[];
179
-
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];
196
+ if (parent == null) {
197
+ if (!self.isPrimaryInstance()) {
198
+ throw new Error(
199
+ 'Failed to construct node: not a primary instance, no parent node specified'
200
+ );
196
201
  }
197
202
 
198
- return [this];
203
+ this.rootDocument = self;
204
+ } else {
205
+ this.rootDocument = parent.rootDocument;
199
206
  }
200
207
 
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
- }
208
+ this.computeReference = options?.computeReference ?? this.computeChildStepReference;
209
209
 
210
- return this.parent?.getNodesByReference(visited, dependencyReference) ?? [];
210
+ this.scope = options?.scope ?? createReactiveScope();
211
+ this.engineConfig = engineConfig;
212
+ this.nodeId = nodeID(engineConfig.createUniqueId());
213
+ this.definition = definition;
211
214
  }
212
215
 
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
- }
216
+ /** @package */
217
+ isPrimaryInstance(): this is PrimaryInstance {
218
+ return this.parent == null;
219
+ }
223
220
 
224
- return this.root.getSubscribableDependenciesByReference(reference);
221
+ /** @package */
222
+ isRoot(): this is Root {
223
+ return this.parent?.nodeType === 'primary-instance';
225
224
  }
226
225
 
227
- // SubscribableDependency
228
226
  /**
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.
227
+ * @package This presently serves a growing variety of internal use cases,
228
+ * where certain behaviors depend on arbitrary traversal from any point in the
229
+ * instance tree, without particular regard for the visited node type. It
230
+ * isn't intended for external traversal or any other means of consuming
231
+ * children by a client. This return type intentionally deviates from one
232
+ * structural expectation, requiring even leaf nodes to return an array
233
+ * (though for those nodes it will always be empty). This affords consistency
234
+ * and efficiency of interface for those internal uses.
235
+ */
236
+ abstract getChildren(this: AnyInstanceNode): readonly AnyChildNode[];
237
+
238
+ // XFormsXPathNode
239
+ /**
240
+ * @todo Values as text nodes(?)
232
241
  */
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;
242
+ getXPathChildNodes(): readonly AnyChildNode[] {
243
+ return (this as AnyInstanceNode).getChildren().flatMap((child) => {
244
+ switch (child.nodeType) {
245
+ case 'repeat-range:controlled':
246
+ case 'repeat-range:uncontrolled': {
247
+ const repeatInstances = child.getXPathChildNodes();
248
+
249
+ if (repeatInstances.length > 0) {
250
+ return repeatInstances;
251
+ }
252
+
253
+ return child;
254
+ }
255
+
256
+ default:
257
+ return child;
258
+ }
259
+ });
260
+ }
261
+
262
+ getXPathValue(): string {
263
+ return (this as AnyInstanceNode as AnyNode)
264
+ .getXPathChildNodes()
265
+ .map((child) => child.getXPathValue())
266
+ .join('');
261
267
  }
262
268
  }
@@ -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
 
@@ -79,13 +92,18 @@ export abstract class UnsupportedControl<Type extends UnsupportedControlNodeType
79
92
  abstract override readonly nodeType: Type;
80
93
 
81
94
  readonly appearances: UnknownAppearanceDefinition;
95
+ readonly nodeOptions = null;
82
96
  readonly currentState: CurrentState<UnsupportedControlStateSpec>;
83
97
 
84
98
  get validationState(): LeafNodeValidationState {
85
99
  return this.validation.currentState;
86
100
  }
87
101
 
102
+ readonly submissionState: SubmissionState;
103
+
88
104
  // ValueContext
105
+ abstract override readonly contextNode: AnyUnsupportedControl & this;
106
+
89
107
  readonly encodeValue = (instanceValue: unknown): string => {
90
108
  const encoded = instanceValue;
91
109
 
@@ -128,6 +146,12 @@ export abstract class UnsupportedControl<Type extends UnsupportedControlNodeType
128
146
  this.engineState = state.engineState;
129
147
  this.currentState = state.currentState;
130
148
  this.validation = createValidationState(this, sharedStateOptions);
149
+ this.submissionState = createLeafNodeSubmissionState(this);
150
+ }
151
+
152
+ // XFormsXPathElement
153
+ override getXPathValue(): string {
154
+ return this.encodeValue(this.engineState.value);
131
155
  }
132
156
 
133
157
  // ValidationContext
@@ -0,0 +1,128 @@
1
+ import { XPathNodeKindKey } from '@getodk/xpath';
2
+ import type { Accessor } from 'solid-js';
3
+ import type { BaseValueNode } from '../../client/BaseValueNode.ts';
4
+ import type { LeafNodeType as ValueNodeType } from '../../client/node-types.ts';
5
+ import type { SubmissionState } from '../../client/submission/SubmissionState.ts';
6
+ import type { AnyViolation, LeafNodeValidationState } from '../../client/validation.ts';
7
+ import type { ValueType } from '../../client/ValueType.ts';
8
+ import type { XFormsXPathElement } from '../../integration/xpath/adapter/XFormsXPathNode.ts';
9
+ import { createValueNodeSubmissionState } from '../../lib/client-reactivity/submission/createValueNodeSubmissionState.ts';
10
+ import type {
11
+ RuntimeValueSetter,
12
+ RuntimeValueState,
13
+ ValueCodec,
14
+ } from '../../lib/codecs/ValueCodec.ts';
15
+ import { createInstanceValueState } from '../../lib/reactivity/createInstanceValueState.ts';
16
+ import type { CurrentState } from '../../lib/reactivity/node-state/createCurrentState.ts';
17
+ import type { EngineState } from '../../lib/reactivity/node-state/createEngineState.ts';
18
+ import type { SharedNodeState } from '../../lib/reactivity/node-state/createSharedNodeState.ts';
19
+ import type { SimpleAtomicState } from '../../lib/reactivity/types.ts';
20
+ import type { SharedValidationState } from '../../lib/reactivity/validation/createValidation.ts';
21
+ import { createValidationState } from '../../lib/reactivity/validation/createValidation.ts';
22
+ import { LeafNodeDefinition } from '../../parse/model/LeafNodeDefinition.ts';
23
+ import type { GeneralParentNode } from '../hierarchy.ts';
24
+ import type { EvaluationContext } from '../internal-api/EvaluationContext.ts';
25
+ import type {
26
+ DecodeInstanceValue,
27
+ InstanceValueContext,
28
+ } from '../internal-api/InstanceValueContext.ts';
29
+ import type { ClientReactiveSubmittableValueNode } from '../internal-api/submission/ClientReactiveSubmittableValueNode.ts';
30
+ import type { ValidationContext } from '../internal-api/ValidationContext.ts';
31
+ import type { DescendantNodeStateSpec } from './DescendantNode.ts';
32
+ import { DescendantNode } from './DescendantNode.ts';
33
+
34
+ export type ValueNodeDefinition<V extends ValueType> = LeafNodeDefinition<V>;
35
+
36
+ export interface ValueNodeStateSpec<RuntimeValue> extends DescendantNodeStateSpec<RuntimeValue> {
37
+ readonly children: null;
38
+ readonly value: SimpleAtomicState<RuntimeValue>;
39
+ readonly instanceValue: Accessor<string>;
40
+ }
41
+
42
+ export abstract class ValueNode<
43
+ V extends ValueType,
44
+ Definition extends ValueNodeDefinition<V>,
45
+ RuntimeValue extends RuntimeInputValue,
46
+ RuntimeInputValue = RuntimeValue,
47
+ >
48
+ extends DescendantNode<Definition, ValueNodeStateSpec<RuntimeValue>, GeneralParentNode, null>
49
+ implements
50
+ BaseValueNode<V, RuntimeValue>,
51
+ XFormsXPathElement,
52
+ EvaluationContext,
53
+ InstanceValueContext,
54
+ ValidationContext,
55
+ ClientReactiveSubmittableValueNode
56
+ {
57
+ protected readonly validation: SharedValidationState;
58
+ protected readonly getInstanceValue: Accessor<string>;
59
+ protected readonly valueState: RuntimeValueState<RuntimeValue>;
60
+ protected readonly setValueState: RuntimeValueSetter<RuntimeInputValue>;
61
+
62
+ // XFormsXPathElement
63
+ override readonly [XPathNodeKindKey] = 'element';
64
+ override readonly getXPathValue: () => string;
65
+
66
+ // InstanceNode
67
+ protected abstract override readonly state: SharedNodeState<ValueNodeStateSpec<RuntimeValue>>;
68
+ protected abstract override readonly engineState: EngineState<ValueNodeStateSpec<RuntimeValue>>;
69
+
70
+ // InstanceValueContext
71
+ readonly decodeInstanceValue: DecodeInstanceValue;
72
+
73
+ // BaseValueNode
74
+ abstract override readonly nodeType: ValueNodeType;
75
+ readonly valueType: V;
76
+
77
+ abstract override readonly currentState: CurrentState<ValueNodeStateSpec<RuntimeValue>>;
78
+
79
+ get validationState(): LeafNodeValidationState {
80
+ return this.validation.currentState;
81
+ }
82
+
83
+ readonly submissionState: SubmissionState;
84
+
85
+ constructor(
86
+ parent: GeneralParentNode,
87
+ definition: Definition,
88
+ codec: ValueCodec<V, RuntimeValue, RuntimeInputValue>
89
+ ) {
90
+ super(parent, definition);
91
+
92
+ this.valueType = definition.valueType;
93
+ this.decodeInstanceValue = codec.decodeInstanceValue;
94
+
95
+ const instanceValueState = createInstanceValueState(this, {
96
+ initialValueSource: 'FORM_DEFAULT',
97
+ });
98
+ const valueState = codec.createRuntimeValueState(instanceValueState);
99
+
100
+ const [getInstanceValue] = instanceValueState;
101
+ const [, setValueState] = valueState;
102
+
103
+ this.getInstanceValue = getInstanceValue;
104
+ this.setValueState = setValueState;
105
+ this.getXPathValue = () => {
106
+ return this.getInstanceValue();
107
+ };
108
+ this.valueState = valueState;
109
+ this.validation = createValidationState(this, {
110
+ clientStateFactory: this.engineConfig.stateFactory,
111
+ });
112
+ this.submissionState = createValueNodeSubmissionState(this);
113
+ }
114
+
115
+ // ValidationContext
116
+ getViolation(): AnyViolation | null {
117
+ return this.validation.engineState.violation;
118
+ }
119
+
120
+ isBlank(): boolean {
121
+ return this.getInstanceValue() === '';
122
+ }
123
+
124
+ // InstanceNode
125
+ getChildren(): readonly [] {
126
+ return [];
127
+ }
128
+ }