@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
@@ -0,0 +1,124 @@
1
+ import type { AnyViolation, DescendantNodeViolationReference } from '../validation.ts';
2
+ import type { SubmissionData } from './SubmissionData.ts';
3
+ import type { SubmissionDefinition } from './SubmissionDefinition.ts';
4
+ import type { SubmissionChunkedType, SubmissionOptions } from './SubmissionOptions.ts';
5
+
6
+ // prettier-ignore
7
+ export type SubmissionResultStatus =
8
+ // eslint-disable-next-line @typescript-eslint/sort-type-constituents
9
+ | 'pending'
10
+ | 'max-size-exceeded'
11
+ | 'ready';
12
+
13
+ // prettier-ignore
14
+ type SubmissionResultData<ChunkedType extends SubmissionChunkedType> = {
15
+ chunked: readonly [SubmissionData, ...SubmissionData[]];
16
+ monolithic: SubmissionData;
17
+ }[ChunkedType];
18
+
19
+ /**
20
+ * Provides detail about an individual submission attachment {@link File}s which
21
+ * exceeds the client-specified {@link maxSize} for a
22
+ * {@link SubmissionResult<'chunked'> | chunked submission result}. Clients may
23
+ * use this value to provide guidance to users.
24
+ *
25
+ * @todo We may want to consider (a) making {@link maxSize} a configuration the
26
+ * client can provide when initializing a form instance, rather than only on
27
+ * submission; and then (b) treating a maximum size violation as another kind of
28
+ * node-level violation. This would go beyond the kinds of validation specified
29
+ * by ODK XForms, but it would make a lot of _conceptual sense_.
30
+ *
31
+ * It would almost certainly be helpful to alert users to violations as the
32
+ * occur, rather than only at submission time (where they have likely already
33
+ * moved on). This is something clients can do without engine support, but it
34
+ * would likely promote good usability patterns if the engine makes it an
35
+ * obvious and uniform option at the main engine/client entrypoint.
36
+ *
37
+ * @todo If we consider the above, we'd want to reframe _this interface_ to
38
+ * match the shape of other {@link AnyViolation | violations} (adding it as a
39
+ * member of that union). We'd also likely eliminate
40
+ * {@link MaxSizeExceededResult} in the process, since
41
+ * {@link PendingSubmissionResult} would then cover the case.
42
+ */
43
+ interface MaxSizeViolation {
44
+ /**
45
+ * Specifies the index of
46
+ * {@link SubmissionResultData<'chunked'> | chunked submission data} where a
47
+ * submission attachment {@link File} exceeds the client-specified
48
+ * {@link maxSize}.
49
+ */
50
+ readonly dataIndex: number;
51
+
52
+ /**
53
+ * Specifies the name of the file which exceeds the client-specified
54
+ * {@link maxSize}. This name can also be used as a key to access the
55
+ * violating {@link File}/submission attachment, in the {@link SubmissionData}
56
+ * at the specified {@link dataIndex}.
57
+ */
58
+ readonly fileName: string;
59
+
60
+ /**
61
+ * Reflects the client-specified maximum size for each chunk of a
62
+ * {@link SubmissionResult<'chunked'> | chunked submission result}.
63
+ */
64
+ readonly maxSize: number;
65
+
66
+ /**
67
+ * Details the actual size of the violating {@link File}/submission
68
+ * attachment. Along with {@link maxSize}. Clients may use the delta between
69
+ * this value and {@link maxSize} to provide detailed guidance to users.
70
+ */
71
+ readonly actualSize: number;
72
+ }
73
+
74
+ // prettier-ignore
75
+ type SubmissionResultViolation =
76
+ | DescendantNodeViolationReference
77
+ | MaxSizeViolation;
78
+
79
+ interface BaseSubmissionResult<ChunkedType extends SubmissionChunkedType> {
80
+ readonly status: SubmissionResultStatus;
81
+ readonly definition: SubmissionDefinition;
82
+ get violations(): readonly SubmissionResultViolation[] | null;
83
+
84
+ /**
85
+ * Submission data may be chunked according to the
86
+ * {@link SubmissionOptions.maxSize | maxSize submission option}
87
+ */
88
+ readonly data: SubmissionResultData<ChunkedType>;
89
+ }
90
+
91
+ interface PendingSubmissionResult<ChunkedType extends SubmissionChunkedType>
92
+ extends BaseSubmissionResult<ChunkedType> {
93
+ readonly status: 'pending';
94
+ get violations(): readonly DescendantNodeViolationReference[];
95
+ }
96
+
97
+ interface MaxSizeExceededResult extends BaseSubmissionResult<'chunked'> {
98
+ readonly status: 'max-size-exceeded';
99
+ get violations(): readonly MaxSizeViolation[];
100
+ }
101
+
102
+ interface ReadySubmissionResult<ChunkedType extends SubmissionChunkedType>
103
+ extends BaseSubmissionResult<ChunkedType> {
104
+ readonly status: 'ready';
105
+ get violations(): null;
106
+ }
107
+
108
+ // prettier-ignore
109
+ type CommonSubmissionResult<ChunkedType extends SubmissionChunkedType> =
110
+ | PendingSubmissionResult<ChunkedType>
111
+ | ReadySubmissionResult<ChunkedType>;
112
+
113
+ // prettier-ignore
114
+ export type ChunkedSubmissionResult =
115
+ | CommonSubmissionResult<'chunked'>
116
+ | MaxSizeExceededResult;
117
+
118
+ export type MonolithicSubmissionResult = CommonSubmissionResult<'monolithic'>;
119
+
120
+ // prettier-ignore
121
+ export type SubmissionResult<ChunkedType extends SubmissionChunkedType> = {
122
+ chunked: ChunkedSubmissionResult;
123
+ monolithic: MonolithicSubmissionResult;
124
+ }[ChunkedType];
@@ -0,0 +1,14 @@
1
+ import type { RootNode } from '../RootNode.ts';
2
+
3
+ export interface SubmissionState {
4
+ /**
5
+ * Represents the serialized XML state of a given node, as it will be prepared
6
+ * for submission. The value produced in {@link RootNode.submissionState} is
7
+ * the same serialization which will be produced for the complete submission.
8
+ *
9
+ * @todo Note that this particular aspect of the design doesn't yet address
10
+ * production of unique file names. As such, this may change as we introduce
11
+ * affected data types (and their supporting nodes).
12
+ */
13
+ get submissionXML(): string;
14
+ }
@@ -1,6 +1,4 @@
1
1
  import type { UnknownAppearanceDefinition } from '../../parse/body/appearance/unknownAppearanceParser.ts';
2
- import type { RangeControlDefinition } from '../../parse/body/control/RangeControlDefinition.ts';
3
- import type { RankControlDefinition } from '../../parse/body/control/RankControlDefinition.ts';
4
2
  import type { UploadControlDefinition } from '../../parse/body/control/UploadControlDefinition.ts';
5
3
  import type { LeafNodeDefinition } from '../../parse/model/LeafNodeDefinition.ts';
6
4
  import type { BaseNode, BaseNodeState } from '../BaseNode.ts';
@@ -15,10 +13,8 @@ export interface UnsupportedControlNodeState extends BaseNodeState {
15
13
  get value(): unknown;
16
14
  }
17
15
 
18
- export type UnsupportedControlElementDefinition =
19
- | RangeControlDefinition
20
- | RankControlDefinition
21
- | UploadControlDefinition;
16
+ // prettier-ignore
17
+ export type UnsupportedControlElementDefinition = UploadControlDefinition;
22
18
 
23
19
  export interface UnsupportedControlDefinition extends LeafNodeDefinition {
24
20
  readonly bodyElement: UnsupportedControlElementDefinition;
@@ -1,5 +1,5 @@
1
- import type { NodeID } from '../instance/identity.ts';
2
1
  import type { BaseNode, BaseNodeState } from './BaseNode.ts';
2
+ import type { FormNodeID } from './identity.ts';
3
3
  import type { OpaqueReactiveObjectFactory } from './OpaqueReactiveObjectFactory.ts';
4
4
  import type { RootNode } from './RootNode.ts';
5
5
  import type { TextRange } from './TextRange.ts';
@@ -176,7 +176,7 @@ export interface LeafNodeValidationState {
176
176
  * each property will be directly computed from the affected node.
177
177
  */
178
178
  export interface DescendantNodeViolationReference {
179
- readonly nodeId: NodeID;
179
+ readonly nodeId: FormNodeID;
180
180
 
181
181
  get reference(): string;
182
182
  get violation(): AnyViolation;
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Temporary representation of newly introduced error conditions which we may
3
+ * produce to clients (and beyond). Intentionally a stub pending a more concrete
4
+ * design and implementation of our approach to producing Result types.
5
+ */
6
+ export class ErrorProductionDesignPendingError extends Error {}
@@ -0,0 +1,5 @@
1
+ export class RankMissingValueError extends Error {
2
+ constructor(message: string) {
3
+ super(message);
4
+ }
5
+ }
@@ -0,0 +1,13 @@
1
+ import { XFormsSpecViolationError } from './XFormsSpecViolationError.ts';
2
+ import type { RankDefinition } from '../client/RankNode.ts';
3
+ import type { UnsupportedBaseItemValueType } from '../lib/codecs/items/BaseItemCodec.ts';
4
+
5
+ export class RankValueTypeError extends XFormsSpecViolationError {
6
+ constructor(definition: RankDefinition<UnsupportedBaseItemValueType>) {
7
+ const { valueType } = definition;
8
+
9
+ super(
10
+ `Ranks of type ${valueType} are not currently supported. If this functionality would be useful for your form, your feedback is welcome!`
11
+ );
12
+ }
13
+ }
@@ -0,0 +1,22 @@
1
+ import type { SelectDefinition } from '../client/SelectNode.ts';
2
+ import type { UnsupportedBaseItemValueType } from '../lib/codecs/items/BaseItemCodec.ts';
3
+ import { XFormsSpecViolationError } from './XFormsSpecViolationError.ts';
4
+
5
+ /**
6
+ * @todo It would be good to have a standardized way to use specific types of
7
+ * errors as a prompt for feedback. There is currently a feedback link presented
8
+ * by `@getodk/web-forms`, which is conditionally displayed (condition is
9
+ * evidently controlled by a
10
+ * {@link https://vuejs.org/api/sfc-script-setup#defineoptions | Vue component option}).
11
+ *
12
+ * @see {@link https://github.com/getodk/web-forms/issues/276}
13
+ */
14
+ export class SelectValueTypeError extends XFormsSpecViolationError {
15
+ constructor(definition: SelectDefinition<UnsupportedBaseItemValueType>) {
16
+ const { valueType } = definition;
17
+
18
+ super(
19
+ `Selects of type ${valueType} are not currently supported. If this functionality would be useful for your form, your feedback is welcome!`
20
+ );
21
+ }
22
+ }
@@ -0,0 +1,22 @@
1
+ import type { ValueType } from '../client/ValueType.ts';
2
+ import { ErrorProductionDesignPendingError } from './ErrorProductionDesignPendingError.ts';
3
+
4
+ /**
5
+ * Temporary(?) representation of error conditions arising from violation of
6
+ * invariants specific to {@link valueType}.
7
+ *
8
+ * @todo The intent of this distinct subclass of
9
+ * {@link ErrorProductionDesignPendingError} is to call out cases where we may
10
+ * want to represent such errors to clients as **validation errors** in the
11
+ * future. We identified this as probably desirable in the initial work on `int`
12
+ * and `decimal` value types, but held off on that aspect of implementation to
13
+ * tame scope.
14
+ */
15
+ export class ValueTypeInvariantError extends ErrorProductionDesignPendingError {
16
+ constructor(
17
+ readonly valueType: ValueType,
18
+ message: string
19
+ ) {
20
+ super(`(${valueType}) ${message}`);
21
+ }
22
+ }
@@ -0,0 +1 @@
1
+ export abstract class XFormsSpecViolationError extends Error {}
@@ -0,0 +1,26 @@
1
+ import type { AnyFunction, ExpandUnion } from '@getodk/common/types/helpers.js';
2
+ import type { XPathDOMAdapter, XPathNode } from '@getodk/xpath';
3
+
4
+ /**
5
+ * @todo this is general enough to go in `@getodk/common`. Holding off until
6
+ * it's clear we actually benefit from this particular type gymnastic.
7
+ */
8
+ // prettier-ignore
9
+ type MethodNameOf<T> = {
10
+ [K in keyof T]:
11
+ T[K] extends AnyFunction
12
+ ? K
13
+ : never;
14
+ }[keyof T];
15
+
16
+ // prettier-ignore
17
+ export type XPathFunctionalityErrorCategory = ExpandUnion<
18
+ | MethodNameOf<XPathDOMAdapter<XPathNode>>
19
+ | 'processing-instruction'
20
+ >;
21
+
22
+ export abstract class XPathFunctionalityError extends Error {
23
+ constructor(functionalityMessagePrefix: string, category: XPathFunctionalityErrorCategory) {
24
+ super(`${functionalityMessagePrefix}${category}`);
25
+ }
26
+ }
@@ -0,0 +1,18 @@
1
+ import type { XPathFunctionalityErrorCategory } from './XPathFunctionalityError.ts';
2
+ import { XPathFunctionalityError } from './XPathFunctionalityError.ts';
3
+
4
+ type XPathFunctionalityNotSupportedStub = () => never;
5
+
6
+ export class XPathFunctionalityNotSupportedError extends XPathFunctionalityError {
7
+ static createStubImplementation(
8
+ category: XPathFunctionalityErrorCategory
9
+ ): XPathFunctionalityNotSupportedStub {
10
+ return () => {
11
+ throw new this(category);
12
+ };
13
+ }
14
+
15
+ private constructor(category: XPathFunctionalityErrorCategory) {
16
+ super('XPath functionality not supported: ', category);
17
+ }
18
+ }
@@ -0,0 +1,18 @@
1
+ import type { XPathFunctionalityErrorCategory } from './XPathFunctionalityError.ts';
2
+ import { XPathFunctionalityError } from './XPathFunctionalityError.ts';
3
+
4
+ type XPathFunctionalityPendingStub = () => never;
5
+
6
+ export class XPathFunctionalityPendingError extends XPathFunctionalityError {
7
+ static createStubImplementation(
8
+ category: XPathFunctionalityErrorCategory
9
+ ): XPathFunctionalityPendingStub {
10
+ return () => {
11
+ throw new this(category);
12
+ };
13
+ }
14
+
15
+ private constructor(category: XPathFunctionalityErrorCategory) {
16
+ super('XPath functionality pending: ', category);
17
+ }
18
+ }
package/src/index.ts CHANGED
@@ -3,6 +3,7 @@ import { initializeForm as engine__initializeForm } from './instance/index.ts';
3
3
 
4
4
  export const initializeForm: InitializeForm = engine__initializeForm;
5
5
 
6
+ export type * from './client/constants.ts';
6
7
  export * as constants from './client/constants.ts';
7
8
  export type * from './client/EngineConfig.ts';
8
9
  export type * from './client/FormLanguage.ts';
@@ -19,29 +20,27 @@ export type {
19
20
  RepeatRangeNode,
20
21
  } from './client/hierarchy.ts';
21
22
  export type * from './client/index.ts';
23
+ export type * from './client/InputNode.ts';
22
24
  export type * from './client/ModelValueNode.ts';
23
25
  export type * from './client/NoteNode.ts';
24
26
  export type * from './client/OpaqueReactiveObjectFactory.ts';
27
+ export type * from './client/RangeNode.ts';
25
28
  export type * from './client/repeat/RepeatInstanceNode.ts';
26
29
  export type * from './client/repeat/RepeatRangeControlledNode.ts';
27
30
  export type * from './client/repeat/RepeatRangeUncontrolledNode.ts';
31
+ export type * from './client/resources.ts';
28
32
  export type * from './client/RootNode.ts';
29
33
  export type * from './client/SelectNode.ts';
30
- export type * from './client/StringNode.ts';
34
+ export type * from './client/submission/SubmissionData.ts';
35
+ export type * from './client/submission/SubmissionDefinition.ts';
36
+ export type * from './client/submission/SubmissionInstanceFile.ts';
37
+ export type * from './client/submission/SubmissionOptions.ts';
38
+ export type * from './client/submission/SubmissionResult.ts';
39
+ export type * from './client/submission/SubmissionState.ts';
31
40
  export type * from './client/SubtreeNode.ts';
32
41
  export type * from './client/TextRange.ts';
33
42
  export type * from './client/TriggerNode.ts';
34
- export type * from './client/unsupported/RangeNode.ts';
35
- export type * from './client/unsupported/RankNode.ts';
43
+ export type * from './client/RankNode.ts';
36
44
  export type * from './client/unsupported/UploadNode.ts';
37
45
  export type * from './client/validation.ts';
38
-
39
- // TODO: notwithstanding potential conflicts with parallel work on `web-forms`
40
- // (former `ui-vue`), these are the last remaining references **outside of
41
- // `xforms-engine`** to anything besides /client/* and the `initializeForm`
42
- // entrypoint implementation. We'll refine the various `definition` types in due
43
- // time.
44
- export type {
45
- AnySelectDefinition,
46
- SelectDefinition,
47
- } from './parse/body/control/select/SelectDefinition.ts';
46
+ export type * from './client/ValueType.ts';
@@ -1,7 +1,12 @@
1
+ import { XPathNodeKindKey } from '@getodk/xpath';
1
2
  import type { Accessor } from 'solid-js';
2
3
  import type { GroupDefinition, GroupNode, GroupNodeAppearances } from '../client/GroupNode.ts';
4
+ import type { FormNodeID } from '../client/identity.ts';
5
+ import type { SubmissionState } from '../client/submission/SubmissionState.ts';
3
6
  import type { TextRange } from '../client/TextRange.ts';
4
7
  import type { AncestorNodeValidationState } from '../client/validation.ts';
8
+ import type { XFormsXPathElement } from '../integration/xpath/adapter/XFormsXPathNode.ts';
9
+ import { createParentNodeSubmissionState } from '../lib/client-reactivity/submission/createParentNodeSubmissionState.ts';
5
10
  import type { ChildrenState } from '../lib/reactivity/createChildrenState.ts';
6
11
  import { createChildrenState } from '../lib/reactivity/createChildrenState.ts';
7
12
  import type { MaterializedChildren } from '../lib/reactivity/materializeCurrentStateChildren.ts';
@@ -16,25 +21,30 @@ import type { DescendantNodeSharedStateSpec } from './abstract/DescendantNode.ts
16
21
  import { DescendantNode } from './abstract/DescendantNode.ts';
17
22
  import { buildChildren } from './children.ts';
18
23
  import type { GeneralChildNode, GeneralParentNode } from './hierarchy.ts';
19
- import type { NodeID } from './identity.ts';
20
24
  import type { EvaluationContext } from './internal-api/EvaluationContext.ts';
21
- import type { SubscribableDependency } from './internal-api/SubscribableDependency.ts';
25
+ import type { ClientReactiveSubmittableParentNode } from './internal-api/submission/ClientReactiveSubmittableParentNode.ts';
22
26
 
23
27
  // prettier-ignore
24
28
  interface GroupStateSpec extends DescendantNodeSharedStateSpec {
25
29
  readonly label: Accessor<TextRange<'label'> | null>;
26
30
  readonly hint: null;
27
- readonly children: Accessor<readonly NodeID[]>;
31
+ readonly children: Accessor<readonly FormNodeID[]>;
28
32
  readonly valueOptions: null;
29
33
  readonly value: null;
30
34
  }
31
35
 
32
36
  export class Group
33
- extends DescendantNode<GroupDefinition, GroupStateSpec, GeneralChildNode>
34
- implements GroupNode, EvaluationContext, SubscribableDependency
37
+ extends DescendantNode<GroupDefinition, GroupStateSpec, GeneralParentNode, GeneralChildNode>
38
+ implements
39
+ GroupNode,
40
+ XFormsXPathElement,
41
+ EvaluationContext,
42
+ ClientReactiveSubmittableParentNode<GeneralChildNode>
35
43
  {
36
44
  private readonly childrenState: ChildrenState<GeneralChildNode>;
37
45
 
46
+ override readonly [XPathNodeKindKey] = 'element';
47
+
38
48
  // InstanceNode
39
49
  protected readonly state: SharedNodeState<GroupStateSpec>;
40
50
  protected override engineState: EngineState<GroupStateSpec>;
@@ -42,8 +52,10 @@ export class Group
42
52
  // GroupNode
43
53
  readonly nodeType = 'group';
44
54
  readonly appearances: GroupNodeAppearances;
55
+ readonly nodeOptions = null;
45
56
  readonly currentState: MaterializedChildren<CurrentState<GroupStateSpec>, GeneralChildNode>;
46
57
  readonly validationState: AncestorNodeValidationState;
58
+ readonly submissionState: SubmissionState;
47
59
 
48
60
  constructor(parent: GeneralParentNode, definition: GroupDefinition) {
49
61
  super(parent, definition);
@@ -85,6 +97,7 @@ export class Group
85
97
 
86
98
  childrenState.setChildren(buildChildren(this));
87
99
  this.validationState = createAggregatedViolations(this, sharedStateOptions);
100
+ this.submissionState = createParentNodeSubmissionState(this);
88
101
  }
89
102
 
90
103
  getChildren(): readonly GeneralChildNode[] {
@@ -0,0 +1,159 @@
1
+ import { XPathNodeKindKey } from '@getodk/xpath';
2
+ import type { Accessor } from 'solid-js';
3
+ import type {
4
+ InputDefinition,
5
+ InputNode,
6
+ InputNodeAppearances,
7
+ InputNodeInputValue,
8
+ InputNodeOptions,
9
+ } from '../client/InputNode.ts';
10
+ import type { TextRange } from '../client/TextRange.ts';
11
+ import type { ValueType } from '../client/ValueType.ts';
12
+ import type { XFormsXPathElement } from '../integration/xpath/adapter/XFormsXPathNode.ts';
13
+ import type { RuntimeInputValue, RuntimeValue } from '../lib/codecs/getSharedValueCodec.ts';
14
+ import { getSharedValueCodec } from '../lib/codecs/getSharedValueCodec.ts';
15
+ import type { CurrentState } from '../lib/reactivity/node-state/createCurrentState.ts';
16
+ import type { EngineState } from '../lib/reactivity/node-state/createEngineState.ts';
17
+ import type { SharedNodeState } from '../lib/reactivity/node-state/createSharedNodeState.ts';
18
+ import { createSharedNodeState } from '../lib/reactivity/node-state/createSharedNodeState.ts';
19
+ import { createFieldHint } from '../lib/reactivity/text/createFieldHint.ts';
20
+ import { createNodeLabel } from '../lib/reactivity/text/createNodeLabel.ts';
21
+ import type { InputControlDefinition } from '../parse/body/control/InputControlDefinition.ts';
22
+ import { ValueNode, type ValueNodeStateSpec } from './abstract/ValueNode.ts';
23
+ import type { GeneralParentNode } from './hierarchy.ts';
24
+ import type { EvaluationContext } from './internal-api/EvaluationContext.ts';
25
+ import type { ClientReactiveSubmittableValueNode } from './internal-api/submission/ClientReactiveSubmittableValueNode.ts';
26
+ import type { ValidationContext } from './internal-api/ValidationContext.ts';
27
+ import type { Root } from './Root.ts';
28
+
29
+ export type AnyInputDefinition = {
30
+ [V in ValueType]: InputDefinition<V>;
31
+ }[ValueType];
32
+
33
+ const stringInputNodeOptions = (control: InputControlDefinition): InputNodeOptions<'string'> => ({
34
+ rows: control.rows,
35
+ });
36
+
37
+ const geoInputNodeOptions = (
38
+ control: InputControlDefinition
39
+ ): InputNodeOptions<'geopoint' | 'geoshape' | 'geotrace'> => ({
40
+ accuracyThreshold: control.accuracyThreshold,
41
+ unacceptableAccuracyThreshold: control.unacceptableAccuracyThreshold,
42
+ });
43
+
44
+ type NodeOptionsFactory<V extends ValueType> = (
45
+ controlDefinition: InputControlDefinition
46
+ ) => InputNodeOptions<V>;
47
+
48
+ type NodeOptionsFactoryByType = {
49
+ [V in ValueType]: NodeOptionsFactory<V>;
50
+ };
51
+
52
+ const nodeOptionsFactoryByType: NodeOptionsFactoryByType = {
53
+ string: stringInputNodeOptions,
54
+ int: () => null,
55
+ boolean: () => null,
56
+ decimal: () => null,
57
+ date: () => null,
58
+ time: () => null,
59
+ dateTime: () => null,
60
+ geopoint: geoInputNodeOptions,
61
+ geotrace: geoInputNodeOptions,
62
+ geoshape: geoInputNodeOptions,
63
+ binary: () => null,
64
+ barcode: () => null,
65
+ intent: () => null,
66
+ };
67
+
68
+ interface InputControlStateSpec<V extends ValueType> extends ValueNodeStateSpec<RuntimeValue<V>> {
69
+ readonly label: Accessor<TextRange<'label'> | null>;
70
+ readonly hint: Accessor<TextRange<'hint'> | null>;
71
+ readonly valueOptions: null;
72
+ }
73
+
74
+ export class InputControl<V extends ValueType = ValueType>
75
+ extends ValueNode<V, InputDefinition<V>, RuntimeValue<V>, RuntimeInputValue<V>>
76
+ implements
77
+ InputNode<V>,
78
+ XFormsXPathElement,
79
+ EvaluationContext,
80
+ ValidationContext,
81
+ ClientReactiveSubmittableValueNode
82
+ {
83
+ static from(parent: GeneralParentNode, definition: InputDefinition): AnyInputControl;
84
+ static from<V extends ValueType>(
85
+ parent: GeneralParentNode,
86
+ definition: InputDefinition<V>
87
+ ): InputControl<V> {
88
+ return new this(parent, definition);
89
+ }
90
+
91
+ // XFormsXPathElement
92
+ override readonly [XPathNodeKindKey] = 'element';
93
+
94
+ // InstanceNode
95
+ protected readonly state: SharedNodeState<InputControlStateSpec<V>>;
96
+ protected readonly engineState: EngineState<InputControlStateSpec<V>>;
97
+
98
+ // InputNode
99
+ readonly nodeType = 'input';
100
+ readonly appearances: InputNodeAppearances;
101
+ readonly nodeOptions: InputNodeOptions<V>;
102
+ readonly currentState: CurrentState<InputControlStateSpec<V>>;
103
+
104
+ constructor(parent: GeneralParentNode, definition: InputDefinition<V>) {
105
+ const codec = getSharedValueCodec(definition.valueType);
106
+
107
+ super(parent, definition, codec);
108
+
109
+ this.appearances = definition.bodyElement.appearances;
110
+ this.nodeOptions = nodeOptionsFactoryByType[definition.valueType](definition.bodyElement);
111
+
112
+ const sharedStateOptions = {
113
+ clientStateFactory: this.engineConfig.stateFactory,
114
+ };
115
+
116
+ const state = createSharedNodeState(
117
+ this.scope,
118
+ {
119
+ reference: this.contextReference,
120
+ readonly: this.isReadonly,
121
+ relevant: this.isRelevant,
122
+ required: this.isRequired,
123
+
124
+ label: createNodeLabel(this, definition),
125
+ hint: createFieldHint(this, definition),
126
+ children: null,
127
+ valueOptions: null,
128
+ value: this.valueState,
129
+ instanceValue: this.getInstanceValue,
130
+ },
131
+ sharedStateOptions
132
+ );
133
+
134
+ this.state = state;
135
+ this.engineState = state.engineState;
136
+ this.currentState = state.currentState;
137
+ }
138
+
139
+ setValue(value: InputNodeInputValue<V>): Root {
140
+ this.setValueState(value);
141
+
142
+ return this.root;
143
+ }
144
+ }
145
+
146
+ export type AnyInputControl =
147
+ | InputControl<'barcode'>
148
+ | InputControl<'binary'>
149
+ | InputControl<'boolean'>
150
+ | InputControl<'date'>
151
+ | InputControl<'dateTime'>
152
+ | InputControl<'decimal'>
153
+ | InputControl<'geopoint'>
154
+ | InputControl<'geoshape'>
155
+ | InputControl<'geotrace'>
156
+ | InputControl<'int'>
157
+ | InputControl<'intent'>
158
+ | InputControl<'string'>
159
+ | InputControl<'time'>;