@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,20 +1,19 @@
1
- import { AnySelectDefinition } from '../parse/body/control/select/SelectDefinition.ts';
1
+ import { AnySelectControlDefinition, SelectType } from '../parse/body/control/SelectControlDefinition.ts';
2
2
  import { LeafNodeDefinition } from '../parse/model/LeafNodeDefinition.ts';
3
- import { BaseNode, BaseNodeState } from './BaseNode.ts';
3
+ import { BaseValueNode, BaseValueNodeState } from './BaseValueNode.ts';
4
4
  import { NodeAppearances } from './NodeAppearances.ts';
5
5
  import { RootNode } from './RootNode.ts';
6
6
  import { TextRange } from './TextRange.ts';
7
+ import { ValueType } from './ValueType.ts';
7
8
  import { GeneralParentNode } from './hierarchy.ts';
8
9
  import { LeafNodeValidationState } from './validation.ts';
9
10
  export interface SelectItem {
11
+ get label(): TextRange<'item-label'>;
10
12
  get value(): string;
11
- get label(): TextRange<'item-label'> | null;
12
13
  }
13
- export interface SelectNodeState extends BaseNodeState {
14
+ export type SelectValueOptions = readonly SelectItem[];
15
+ export interface SelectNodeState extends BaseValueNodeState<readonly string[]> {
14
16
  get children(): null;
15
- /**
16
- * @todo should {@link BaseNodeState} include this??
17
- */
18
17
  get valueOptions(): readonly SelectItem[];
19
18
  /**
20
19
  * This value is treated as set-like by the engine, where each
@@ -28,38 +27,61 @@ export interface SelectNodeState extends BaseNodeState {
28
27
  * Should a `SelectNodeState` have this `value` type, whereas a hypothetical
29
28
  * `Select1NodeState` would have `get value(): SelectItem | null`?
30
29
  */
31
- get value(): readonly SelectItem[];
30
+ get value(): readonly string[];
32
31
  }
33
- export interface SelectDefinition extends LeafNodeDefinition {
34
- readonly bodyElement: AnySelectDefinition;
32
+ export interface SelectDefinition<V extends ValueType = ValueType> extends LeafNodeDefinition<V> {
33
+ readonly bodyElement: AnySelectControlDefinition;
35
34
  }
36
35
  export type SelectNodeAppearances = NodeAppearances<SelectDefinition>;
37
- export interface SelectNode extends BaseNode {
36
+ export interface SelectNode extends BaseValueNode<'string', readonly string[]> {
38
37
  readonly nodeType: 'select';
38
+ readonly valueType: 'string';
39
+ readonly selectType: SelectType;
39
40
  readonly appearances: SelectNodeAppearances;
40
- readonly definition: SelectDefinition;
41
+ readonly nodeOptions: null;
42
+ readonly definition: SelectDefinition<'string'>;
41
43
  readonly root: RootNode;
42
44
  readonly parent: GeneralParentNode;
43
45
  readonly currentState: SelectNodeState;
44
46
  readonly validationState: LeafNodeValidationState;
45
47
  /**
46
- * For use by a client to update the selection of a select node where:
48
+ * Convenience API to get the {@link SelectItem} which is associated with
49
+ * {@link value}, if one is currently available—i.e. if it is present in
50
+ * {@link SelectNodeState.valueOptions}.
51
+ */
52
+ getValueOption(value: string): SelectItem | null;
53
+ /**
54
+ * Convenience API to determine if {@link value} is currently selected—i.e. if
55
+ * it is one of the selected values in {@link SelectNodeState.value}.
56
+ */
57
+ isSelected(value: string): boolean;
58
+ /**
59
+ * Selects a single {@link value}, as provided by a {@link SelectItem.value}.
60
+ * Calling this setter replaces the currently selected value(s, if any),
61
+ * where:
47
62
  *
48
- * - For fields defined with an XForms `<select>`, calling this method is
49
- * additive, i.e. it will include the item in its
50
- * {@link SelectNodeState.value}.
51
- * - For fields defined with an XForms `<select1>`, calling this method will
52
- * replace the selection (if any).
63
+ * - if the provided value is `null`, the current selection is cleared; ELSE
64
+ * - the provided value is selected in place of any currently selected values.
53
65
  *
54
- * @todo @see {@link StringNode.setValue} re: write restrictions
55
- * @todo @see {@link SelectNodeState.value} re: breaking up the types
66
+ * This setter is most useful for {@link SelectNode}s associated with an
67
+ * XForms
68
+ * {@link https://getodk.github.io/xforms-spec/#body-elements | `<select1>`}
69
+ * control.
56
70
  */
57
- select(item: SelectItem): RootNode;
71
+ selectValue(value: string | null): RootNode;
58
72
  /**
59
- * For use by a client to remove an item from the node's
60
- * {@link SelectNodeState.value}.
73
+ * Selects any number of {@link values}, as provided by any number of
74
+ * {@link SelectItem.value}s. Calling this setter replaces the currently
75
+ * selected value(s, if any). If called with an empty array, the current
76
+ * selection is cleared.
77
+ *
78
+ * This setter is most useful for {@link SelectNode}s associated with an
79
+ * XForms
80
+ * {@link https://getodk.github.io/xforms-spec/#body-elements | `<select>`}
81
+ * control.
61
82
  *
62
- * @todo @see {@link StringNode.setValue} re: write restrictions
83
+ * This setter _may_ be used with a `<select1>` control, in which case the
84
+ * provided {@link values} should produce at most one value.
63
85
  */
64
- deselect(item: SelectItem): RootNode;
86
+ selectValues(values: readonly string[]): RootNode;
65
87
  }
@@ -47,6 +47,7 @@ export interface SubtreeDefinition extends BaseSubtreeDefinition {
47
47
  export interface SubtreeNode extends BaseNode {
48
48
  readonly nodeType: 'subtree';
49
49
  readonly appearances: null;
50
+ readonly nodeOptions: null;
50
51
  readonly definition: SubtreeDefinition;
51
52
  readonly root: RootNode;
52
53
  readonly parent: GeneralParentNode;
@@ -1,22 +1,26 @@
1
+ import { TriggerRuntimeValue, TriggerValueType } from '../lib/codecs/TriggerCodec.ts';
1
2
  import { UnknownAppearanceDefinition } from '../parse/body/appearance/unknownAppearanceParser.ts';
2
3
  import { TriggerControlDefinition } from '../parse/body/control/TriggerControlDefinition.ts';
3
4
  import { LeafNodeDefinition } from '../parse/model/LeafNodeDefinition.ts';
4
- import { BaseNode, BaseNodeState } from './BaseNode.ts';
5
+ import { BaseValueNode, BaseValueNodeState } from './BaseValueNode.ts';
5
6
  import { GeneralParentNode } from './hierarchy.ts';
6
7
  import { RootNode } from './RootNode.ts';
7
8
  import { LeafNodeValidationState } from './validation.ts';
8
- export interface TriggerNodeState extends BaseNodeState {
9
+ import { ValueType } from './ValueType.ts';
10
+ export type TriggerValue = TriggerRuntimeValue;
11
+ export interface TriggerNodeState extends BaseValueNodeState<TriggerValue> {
9
12
  get children(): null;
10
13
  get valueOptions(): null;
11
- get value(): boolean;
14
+ get value(): TriggerValue;
12
15
  }
13
- export interface TriggerNodeDefinition extends LeafNodeDefinition {
16
+ export interface TriggerNodeDefinition<V extends ValueType = ValueType> extends LeafNodeDefinition<V> {
14
17
  readonly bodyElement: TriggerControlDefinition;
15
18
  }
16
- export interface TriggerNode extends BaseNode {
19
+ export interface TriggerNode extends BaseValueNode<TriggerValueType, TriggerValue> {
17
20
  readonly nodeType: 'trigger';
18
- readonly definition: TriggerNodeDefinition;
21
+ readonly definition: TriggerNodeDefinition<TriggerValueType>;
19
22
  readonly appearances: UnknownAppearanceDefinition;
23
+ readonly nodeOptions: null;
20
24
  readonly root: RootNode;
21
25
  readonly parent: GeneralParentNode;
22
26
  readonly currentState: TriggerNodeState;
@@ -0,0 +1,3 @@
1
+ import { ExpandUnion } from '../../../common/types/helpers.js';
2
+ import { BindType } from '../parse/model/BindTypeDefinition.ts';
3
+ export type ValueType = ExpandUnion<BindType>;
@@ -1,8 +1,58 @@
1
1
  import { ValidationTextRole } from './TextRange.ts';
2
+ export declare const MISSING_RESOURCE_BEHAVIOR: {
3
+ /**
4
+ * When this behavior is configured, {@link InitializeForm | initializing} a
5
+ * {@link PrimaryInstance} for a form which references any **missing**
6
+ * resources will fail, producing an error to the calling client.
7
+ *
8
+ * @see {@link MissingResourceBehavior}
9
+ */
10
+ readonly ERROR: "ERROR";
11
+ /**
12
+ * When this behavior is configured, {@link InitializeForm | initializing} a
13
+ * {@link PrimaryInstance} for a form which references any **missing**
14
+ * resources will succeed (producing a warning).
15
+ *
16
+ * Such missing resources will be parsed as if they are blank, as appropriate
17
+ * for the resource's XForm semantic usage and/or format.
18
+ *
19
+ * @see {@link MissingResourceBehavior}
20
+ */
21
+ readonly BLANK: "BLANK";
22
+ /**
23
+ * @see {@link MISSING_RESOURCE_BEHAVIOR.ERROR}
24
+ */
25
+ readonly DEFAULT: "ERROR";
26
+ };
27
+ export type MissingResourceBehaviorError = typeof MISSING_RESOURCE_BEHAVIOR.ERROR;
28
+ export type MissingResourceBehaviorBlank = typeof MISSING_RESOURCE_BEHAVIOR.BLANK;
29
+ export type MissingResourceBehaviorDefault = typeof MISSING_RESOURCE_BEHAVIOR.DEFAULT;
30
+ /**
31
+ * Specifies behavior for {@link InitializeForm | initializing} a form's
32
+ * {@link PrimaryInstance} which references any **missing** resources.
33
+ *
34
+ * Here the term "missing" is consistent with
35
+ * {@link https://www.rfc-editor.org/rfc/rfc9110#status.404 | HTTP 404 status}
36
+ * semantics. Clients which provide access to form attachments by performing
37
+ * HTTP network requests (e.g. with {@link fetch}) can generally convey this
38
+ * semantic meaning with a standard {@link Response}.
39
+ *
40
+ * **IMPORTANT**
41
+ *
42
+ * The term "missing" is distinct from other network/IO failures, e.g. when
43
+ * network access itself is unavailable. In these cases, the engine will
44
+ * consider a resource's availability **ambiguous**, producing an error
45
+ * regardless of the configured behavior for **missing** resources.
46
+ */
47
+ export type MissingResourceBehavior = MissingResourceBehaviorError | MissingResourceBehaviorBlank;
2
48
  export declare const VALIDATION_TEXT: {
3
49
  readonly constraintMsg: "Condition not satisfied: constraint";
4
50
  readonly requiredMsg: "Condition not satisfied: required";
5
51
  };
6
52
  type ValidationTextDefaults = typeof VALIDATION_TEXT;
7
53
  export type ValidationTextDefault<Role extends ValidationTextRole> = ValidationTextDefaults[Role];
54
+ export declare const SUBMISSION_INSTANCE_FILE_NAME = "xml_submission_file";
55
+ export type SubmissionInstanceFileName = typeof SUBMISSION_INSTANCE_FILE_NAME;
56
+ export declare const SUBMISSION_INSTANCE_FILE_TYPE = "text/xml";
57
+ export type SubmissionInstanceFileType = typeof SUBMISSION_INSTANCE_FILE_TYPE;
8
58
  export {};
@@ -1,21 +1,21 @@
1
1
  import { ExpandUnion } from '../../../common/types/helpers.d.ts';
2
2
  import { GroupNode } from './GroupNode.ts';
3
- import { ModelValueNode } from './ModelValueNode.ts';
4
- import { NoteNode } from './NoteNode.ts';
3
+ import { AnyInputNode } from './InputNode.ts';
4
+ import { AnyModelValueNode } from './ModelValueNode.ts';
5
+ import { AnyNoteNode } from './NoteNode.ts';
6
+ import { AnyRangeNode } from './RangeNode.ts';
5
7
  import { RepeatInstanceNode } from './repeat/RepeatInstanceNode.ts';
6
8
  import { RepeatRangeControlledNode } from './repeat/RepeatRangeControlledNode.ts';
7
9
  import { RepeatRangeUncontrolledNode } from './repeat/RepeatRangeUncontrolledNode.ts';
8
10
  import { RootNode } from './RootNode.ts';
9
11
  import { SelectNode } from './SelectNode.ts';
10
- import { StringNode } from './StringNode.ts';
11
12
  import { SubtreeNode } from './SubtreeNode.ts';
12
13
  import { TriggerNode } from './TriggerNode.ts';
13
- import { RangeNode } from './unsupported/RangeNode.ts';
14
- import { RankNode } from './unsupported/RankNode.ts';
14
+ import { RankNode } from './RankNode.ts';
15
15
  import { UploadNode } from './unsupported/UploadNode.ts';
16
- export type AnyUnsupportedControlNode = RangeNode | RankNode | UploadNode;
17
- export type AnyControlNode = NoteNode | SelectNode | StringNode | TriggerNode;
18
- export type AnyLeafNode = AnyControlNode | AnyUnsupportedControlNode | ModelValueNode;
16
+ export type AnyUnsupportedControlNode = UploadNode;
17
+ export type AnyControlNode = AnyInputNode | AnyNoteNode | AnyRangeNode | RankNode | SelectNode | TriggerNode;
18
+ export type AnyLeafNode = AnyControlNode | AnyModelValueNode | AnyUnsupportedControlNode;
19
19
  export type RepeatRangeNode = RepeatRangeControlledNode | RepeatRangeUncontrolledNode;
20
20
  /**
21
21
  * Any of the concrete node types which may be a parent of non-repeat instance
@@ -0,0 +1,14 @@
1
+ type ODKXFormsUUID = `uuid:${string}`;
2
+ /**
3
+ * @see {@link https://getodk.github.io/xforms-spec/#metadata}
4
+ */
5
+ export type InstanceID = ODKXFormsUUID;
6
+ /**
7
+ * @see {@link https://getodk.github.io/xforms-spec/#metadata}
8
+ */
9
+ export type DeprecatedID = ODKXFormsUUID;
10
+ /**
11
+ * Represents a session-stable identifier for any particular node i
12
+ */
13
+ export type FormNodeID = `node:${string}`;
14
+ export {};
@@ -1,3 +1,4 @@
1
- export type UnsupportedControlNodeType = 'range' | 'rank' | 'upload';
1
+ export type UnsupportedControlNodeType = 'rank' | 'upload';
2
2
  export type RepeatRangeNodeType = 'repeat-range:controlled' | 'repeat-range:uncontrolled';
3
- export type InstanceNodeType = 'root' | RepeatRangeNodeType | 'repeat-instance' | 'group' | 'subtree' | 'model-value' | 'note' | 'select' | 'string' | 'trigger' | UnsupportedControlNodeType;
3
+ export type LeafNodeType = 'model-value' | 'note' | 'select' | 'input' | 'trigger' | 'range' | UnsupportedControlNodeType;
4
+ export type InstanceNodeType = 'root' | RepeatRangeNodeType | 'repeat-instance' | 'group' | 'subtree' | LeafNodeType | UnsupportedControlNodeType;
@@ -0,0 +1,93 @@
1
+ import { JRResourceURL } from '../../../common/src/jr-resources/JRResourceURL.ts';
2
+ interface FetchResourceHeadersIterator<T> extends IteratorObject<T, BuiltinIteratorReturn, unknown> {
3
+ [Symbol.iterator](): FetchResourceHeadersIterator<T>;
4
+ }
5
+ type FetchResourceHeadersForEachCallbackFn = (value: string, key: string, parent: FetchResourceResponseHeaders) => void;
6
+ /**
7
+ * A read-only strict subset of the web standard {@link Headers}.
8
+ *
9
+ * Note that the engine may make the following assumptions about
10
+ * {@link FetchResourceResponse.headers}:
11
+ *
12
+ * - If {@link FetchResourceResponse} is an instance of {@link Response}, it
13
+ * will be assumed its {@link FetchResourceResponse.headers | headers object}
14
+ * _is present_, and that it is an instance of {@link Headers}. In other
15
+ * words: for the purposes of resource resolution, we explicitly expect that
16
+ * clients using APIs provided by the runtime platform (or polyfills thereof)
17
+ * will not monkey-patch properties of values produced by those APIs.
18
+ *
19
+ * - If the object is an instance of {@link Headers} (whether by inference as a
20
+ * property of {@link Response}, or by a direct instance type check), the
21
+ * engine will assume it is safe to treat header names as case insensitive for
22
+ * any lookups it may perform. In other words: we explicitly expect that
23
+ * clients _providing access_ to APIs rovided by the runtime platform (or
24
+ * polyfills thereof) will not alter the guarantees of those APIs.
25
+ *
26
+ * - If the object is not an instance of {@link Headers}, it will be treated as
27
+ * a {@link ReadonlyMap<string, string>}. In other words: we explicitly expect
28
+ * that clients, when providing a bespoke implementation of
29
+ * {@link FetchResourceResponse} and its constituent parts, will likely
30
+ * implement them partially (and in the case of
31
+ * {@link FetchResourceResponse.headers}, with the nearest common idiom
32
+ * available). In this case, we will favor a best effort at correctness,
33
+ * generally at some expense of performance.
34
+ */
35
+ export interface FetchResourceResponseHeaders {
36
+ [Symbol.iterator](): FetchResourceHeadersIterator<[string, string]>;
37
+ entries(): FetchResourceHeadersIterator<[string, string]>;
38
+ keys(): FetchResourceHeadersIterator<string>;
39
+ values(): FetchResourceHeadersIterator<string>;
40
+ get(name: string): string | null;
41
+ has(name: string): boolean;
42
+ forEach(callbackfn: FetchResourceHeadersForEachCallbackFn): void;
43
+ }
44
+ /**
45
+ * This is a strict subset of the web standard {@link Response}. Clients are
46
+ * encouraged to use the global {@link Response} constructor (as provided by the
47
+ * runtime platform, or by a global runtime polyfill), but may also provide a
48
+ * bespoke implementation if it suits their needs.
49
+ *
50
+ * Since we cannot assume a client's implementation will always be an instance
51
+ * of {@link Response}, we make some assumptions about its {@link headers}
52
+ * object (if available, as detailed on {@link FetchResourceResponseHeaders}).
53
+ *
54
+ * For other properties, we make the following assumptions (all of which are
55
+ * assumptions we would make about a platform-provided/polyfilled
56
+ * {@link Response}, but are explicitly stated for the benefit of confidence in
57
+ * client implementations):
58
+ *
59
+ * - If we read {@link body} directly, we will assume it is consumed on first
60
+ * read, and will not read it again.
61
+ *
62
+ * - We assume that {@link blob} and {@link text} indirectly consume
63
+ * {@link body} on first read as well, and will only ever read one of each of
64
+ * these properties, and only ever once.
65
+ *
66
+ * Furthermore, if the engine intends to read {@link body} (or its indirect
67
+ * {@link blob} or {@link text} consumers), it will do so in the course of a
68
+ * client's call to {@link initializeForm}, and before the
69
+ * {@link Promise<PrimaryInstance>} returned by that call is resolved.
70
+ */
71
+ export interface FetchResourceResponse {
72
+ readonly ok?: boolean;
73
+ readonly status?: number;
74
+ readonly body?: ReadableStream<Uint8Array> | null;
75
+ readonly bodyUsed?: boolean;
76
+ readonly headers?: FetchResourceResponseHeaders;
77
+ readonly blob: () => Promise<Blob>;
78
+ readonly text: () => Promise<string>;
79
+ }
80
+ /**
81
+ * This is a strict subset of the web standard `fetch` interface. It implicitly
82
+ * assumes that the engine itself will only ever perform `GET`-like network/IO
83
+ * requests. It also provides no further request-like semantics to the engine.
84
+ *
85
+ * This is presumed sufficient for now, but notably doesn't expose any notion of
86
+ * content negotiation (e.g. the ability for the engine to include `Accept`
87
+ * headers in resource requests issued to a client's {@link FetchResource}
88
+ * implementation).
89
+ */
90
+ export type FetchResource<Resource extends URL = URL> = (resource: Resource) => Promise<FetchResourceResponse>;
91
+ export type FormAttachmentURL = JRResourceURL;
92
+ export type FetchFormAttachment = FetchResource<FormAttachmentURL>;
93
+ export {};
@@ -0,0 +1,7 @@
1
+ import { SubmissionInstanceFile, SubmissionInstanceFileName } from './SubmissionInstanceFile.ts';
2
+ export interface SubmissionData extends FormData {
3
+ get(name: SubmissionInstanceFileName): SubmissionInstanceFile;
4
+ get(name: string): FormDataEntryValue | null;
5
+ has(name: SubmissionInstanceFileName): true;
6
+ has(name: string): boolean;
7
+ }
@@ -0,0 +1,14 @@
1
+ export interface SubmissionDefinition {
2
+ /**
3
+ * @see {@link https://getodk.github.io/xforms-spec/#submission-attributes | `action` submission attribute}
4
+ */
5
+ readonly submissionAction: URL | null;
6
+ /**
7
+ * @see {@link https://getodk.github.io/xforms-spec/#submission-attributes | `method` submission attribute}
8
+ */
9
+ readonly submissionMethod: 'post';
10
+ /**
11
+ * @see {@link https://getodk.github.io/xforms-spec/#submission-attributes | `base64RsaPublicKey` submission attribute}
12
+ */
13
+ readonly encryptionKey: string | null;
14
+ }
@@ -0,0 +1,6 @@
1
+ import { SubmissionInstanceFileName, SubmissionInstanceFileType } from '../constants.ts';
2
+ export type { SubmissionInstanceFileName, SubmissionInstanceFileType };
3
+ export interface SubmissionInstanceFile extends File {
4
+ readonly name: SubmissionInstanceFileName;
5
+ readonly type: SubmissionInstanceFileType;
6
+ }
@@ -0,0 +1,23 @@
1
+ export type SubmissionChunkedType = 'chunked' | 'monolithic';
2
+ interface BaseSubmissionOptions<ChunkedType extends SubmissionChunkedType> {
3
+ readonly chunked?: ChunkedType | undefined;
4
+ /**
5
+ * As described in the
6
+ * {@link https://docs.getodk.org/openrosa-form-submission/#extended-transmission-considerations | OpenRosa Form Submission API},
7
+ * clients may obtain this value from an OpenRosa server's
8
+ * `X-OpenRosa-Accept-Content-Length` header.
9
+ */
10
+ readonly maxSize?: number;
11
+ }
12
+ interface ChunkedSubmissionOptions extends BaseSubmissionOptions<'chunked'> {
13
+ readonly maxSize: number;
14
+ }
15
+ interface MonolithicSubmissionOptions extends BaseSubmissionOptions<'monolithic'> {
16
+ readonly chunked?: 'monolithic' | undefined;
17
+ readonly maxSize?: never;
18
+ }
19
+ export type SubmissionOptions<ChunkedType extends SubmissionChunkedType = 'monolithic'> = {
20
+ chunked: ChunkedSubmissionOptions;
21
+ monolithic: MonolithicSubmissionOptions;
22
+ }[ChunkedType];
23
+ export {};
@@ -0,0 +1,91 @@
1
+ import { DescendantNodeViolationReference } from '../validation.ts';
2
+ import { SubmissionData } from './SubmissionData.ts';
3
+ import { SubmissionDefinition } from './SubmissionDefinition.ts';
4
+ import { SubmissionChunkedType } from './SubmissionOptions.ts';
5
+ export type SubmissionResultStatus = 'pending' | 'max-size-exceeded' | 'ready';
6
+ type SubmissionResultData<ChunkedType extends SubmissionChunkedType> = {
7
+ chunked: readonly [SubmissionData, ...SubmissionData[]];
8
+ monolithic: SubmissionData;
9
+ }[ChunkedType];
10
+ /**
11
+ * Provides detail about an individual submission attachment {@link File}s which
12
+ * exceeds the client-specified {@link maxSize} for a
13
+ * {@link SubmissionResult<'chunked'> | chunked submission result}. Clients may
14
+ * use this value to provide guidance to users.
15
+ *
16
+ * @todo We may want to consider (a) making {@link maxSize} a configuration the
17
+ * client can provide when initializing a form instance, rather than only on
18
+ * submission; and then (b) treating a maximum size violation as another kind of
19
+ * node-level violation. This would go beyond the kinds of validation specified
20
+ * by ODK XForms, but it would make a lot of _conceptual sense_.
21
+ *
22
+ * It would almost certainly be helpful to alert users to violations as the
23
+ * occur, rather than only at submission time (where they have likely already
24
+ * moved on). This is something clients can do without engine support, but it
25
+ * would likely promote good usability patterns if the engine makes it an
26
+ * obvious and uniform option at the main engine/client entrypoint.
27
+ *
28
+ * @todo If we consider the above, we'd want to reframe _this interface_ to
29
+ * match the shape of other {@link AnyViolation | violations} (adding it as a
30
+ * member of that union). We'd also likely eliminate
31
+ * {@link MaxSizeExceededResult} in the process, since
32
+ * {@link PendingSubmissionResult} would then cover the case.
33
+ */
34
+ interface MaxSizeViolation {
35
+ /**
36
+ * Specifies the index of
37
+ * {@link SubmissionResultData<'chunked'> | chunked submission data} where a
38
+ * submission attachment {@link File} exceeds the client-specified
39
+ * {@link maxSize}.
40
+ */
41
+ readonly dataIndex: number;
42
+ /**
43
+ * Specifies the name of the file which exceeds the client-specified
44
+ * {@link maxSize}. This name can also be used as a key to access the
45
+ * violating {@link File}/submission attachment, in the {@link SubmissionData}
46
+ * at the specified {@link dataIndex}.
47
+ */
48
+ readonly fileName: string;
49
+ /**
50
+ * Reflects the client-specified maximum size for each chunk of a
51
+ * {@link SubmissionResult<'chunked'> | chunked submission result}.
52
+ */
53
+ readonly maxSize: number;
54
+ /**
55
+ * Details the actual size of the violating {@link File}/submission
56
+ * attachment. Along with {@link maxSize}. Clients may use the delta between
57
+ * this value and {@link maxSize} to provide detailed guidance to users.
58
+ */
59
+ readonly actualSize: number;
60
+ }
61
+ type SubmissionResultViolation = DescendantNodeViolationReference | MaxSizeViolation;
62
+ interface BaseSubmissionResult<ChunkedType extends SubmissionChunkedType> {
63
+ readonly status: SubmissionResultStatus;
64
+ readonly definition: SubmissionDefinition;
65
+ get violations(): readonly SubmissionResultViolation[] | null;
66
+ /**
67
+ * Submission data may be chunked according to the
68
+ * {@link SubmissionOptions.maxSize | maxSize submission option}
69
+ */
70
+ readonly data: SubmissionResultData<ChunkedType>;
71
+ }
72
+ interface PendingSubmissionResult<ChunkedType extends SubmissionChunkedType> extends BaseSubmissionResult<ChunkedType> {
73
+ readonly status: 'pending';
74
+ get violations(): readonly DescendantNodeViolationReference[];
75
+ }
76
+ interface MaxSizeExceededResult extends BaseSubmissionResult<'chunked'> {
77
+ readonly status: 'max-size-exceeded';
78
+ get violations(): readonly MaxSizeViolation[];
79
+ }
80
+ interface ReadySubmissionResult<ChunkedType extends SubmissionChunkedType> extends BaseSubmissionResult<ChunkedType> {
81
+ readonly status: 'ready';
82
+ get violations(): null;
83
+ }
84
+ type CommonSubmissionResult<ChunkedType extends SubmissionChunkedType> = PendingSubmissionResult<ChunkedType> | ReadySubmissionResult<ChunkedType>;
85
+ export type ChunkedSubmissionResult = CommonSubmissionResult<'chunked'> | MaxSizeExceededResult;
86
+ export type MonolithicSubmissionResult = CommonSubmissionResult<'monolithic'>;
87
+ export type SubmissionResult<ChunkedType extends SubmissionChunkedType> = {
88
+ chunked: ChunkedSubmissionResult;
89
+ monolithic: MonolithicSubmissionResult;
90
+ }[ChunkedType];
91
+ export {};
@@ -0,0 +1,12 @@
1
+ export interface SubmissionState {
2
+ /**
3
+ * Represents the serialized XML state of a given node, as it will be prepared
4
+ * for submission. The value produced in {@link RootNode.submissionState} is
5
+ * the same serialization which will be produced for the complete submission.
6
+ *
7
+ * @todo Note that this particular aspect of the design doesn't yet address
8
+ * production of unique file names. As such, this may change as we introduce
9
+ * affected data types (and their supporting nodes).
10
+ */
11
+ get submissionXML(): string;
12
+ }
@@ -1,6 +1,4 @@
1
1
  import { UnknownAppearanceDefinition } from '../../parse/body/appearance/unknownAppearanceParser.ts';
2
- import { RangeControlDefinition } from '../../parse/body/control/RangeControlDefinition.ts';
3
- import { RankControlDefinition } from '../../parse/body/control/RankControlDefinition.ts';
4
2
  import { UploadControlDefinition } from '../../parse/body/control/UploadControlDefinition.ts';
5
3
  import { LeafNodeDefinition } from '../../parse/model/LeafNodeDefinition.ts';
6
4
  import { BaseNode, BaseNodeState } from '../BaseNode.ts';
@@ -13,7 +11,7 @@ export interface UnsupportedControlNodeState extends BaseNodeState {
13
11
  get valueOptions(): unknown;
14
12
  get value(): unknown;
15
13
  }
16
- export type UnsupportedControlElementDefinition = RangeControlDefinition | RankControlDefinition | UploadControlDefinition;
14
+ export type UnsupportedControlElementDefinition = UploadControlDefinition;
17
15
  export interface UnsupportedControlDefinition extends LeafNodeDefinition {
18
16
  readonly bodyElement: UnsupportedControlElementDefinition;
19
17
  }
@@ -1,4 +1,4 @@
1
- import { NodeID } from '../instance/identity.ts';
1
+ import { FormNodeID } from './identity.ts';
2
2
  import { TextRange } from './TextRange.ts';
3
3
  interface BaseValidity {
4
4
  /**
@@ -144,7 +144,7 @@ export interface LeafNodeValidationState {
144
144
  * each property will be directly computed from the affected node.
145
145
  */
146
146
  export interface DescendantNodeViolationReference {
147
- readonly nodeId: NodeID;
147
+ readonly nodeId: FormNodeID;
148
148
  get reference(): string;
149
149
  get violation(): AnyViolation;
150
150
  }
@@ -0,0 +1,7 @@
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 declare class ErrorProductionDesignPendingError extends Error {
7
+ }
@@ -0,0 +1,3 @@
1
+ export declare class RankMissingValueError extends Error {
2
+ constructor(message: string);
3
+ }
@@ -0,0 +1,6 @@
1
+ import { XFormsSpecViolationError } from './XFormsSpecViolationError.ts';
2
+ import { RankDefinition } from '../client/RankNode.ts';
3
+ import { UnsupportedBaseItemValueType } from '../lib/codecs/items/BaseItemCodec.ts';
4
+ export declare class RankValueTypeError extends XFormsSpecViolationError {
5
+ constructor(definition: RankDefinition<UnsupportedBaseItemValueType>);
6
+ }
@@ -0,0 +1,15 @@
1
+ import { SelectDefinition } from '../client/SelectNode.ts';
2
+ import { UnsupportedBaseItemValueType } from '../lib/codecs/items/BaseItemCodec.ts';
3
+ import { XFormsSpecViolationError } from './XFormsSpecViolationError.ts';
4
+ /**
5
+ * @todo It would be good to have a standardized way to use specific types of
6
+ * errors as a prompt for feedback. There is currently a feedback link presented
7
+ * by `@getodk/web-forms`, which is conditionally displayed (condition is
8
+ * evidently controlled by a
9
+ * {@link https://vuejs.org/api/sfc-script-setup#defineoptions | Vue component option}).
10
+ *
11
+ * @see {@link https://github.com/getodk/web-forms/issues/276}
12
+ */
13
+ export declare class SelectValueTypeError extends XFormsSpecViolationError {
14
+ constructor(definition: SelectDefinition<UnsupportedBaseItemValueType>);
15
+ }
@@ -0,0 +1,17 @@
1
+ import { ValueType } from '../client/ValueType.ts';
2
+ import { ErrorProductionDesignPendingError } from './ErrorProductionDesignPendingError.ts';
3
+ /**
4
+ * Temporary(?) representation of error conditions arising from violation of
5
+ * invariants specific to {@link valueType}.
6
+ *
7
+ * @todo The intent of this distinct subclass of
8
+ * {@link ErrorProductionDesignPendingError} is to call out cases where we may
9
+ * want to represent such errors to clients as **validation errors** in the
10
+ * future. We identified this as probably desirable in the initial work on `int`
11
+ * and `decimal` value types, but held off on that aspect of implementation to
12
+ * tame scope.
13
+ */
14
+ export declare class ValueTypeInvariantError extends ErrorProductionDesignPendingError {
15
+ readonly valueType: ValueType;
16
+ constructor(valueType: ValueType, message: string);
17
+ }
@@ -0,0 +1,2 @@
1
+ export declare abstract class XFormsSpecViolationError extends Error {
2
+ }
@@ -0,0 +1,14 @@
1
+ import { AnyFunction, ExpandUnion } from '../../../common/types/helpers.js';
2
+ import { XPathDOMAdapter, XPathNode } from '@getodk/xpath';
3
+ /**
4
+ * @todo this is general enough to go in `@getodk/common`. Holding off until
5
+ * it's clear we actually benefit from this particular type gymnastic.
6
+ */
7
+ type MethodNameOf<T> = {
8
+ [K in keyof T]: T[K] extends AnyFunction ? K : never;
9
+ }[keyof T];
10
+ export type XPathFunctionalityErrorCategory = ExpandUnion<MethodNameOf<XPathDOMAdapter<XPathNode>> | 'processing-instruction'>;
11
+ export declare abstract class XPathFunctionalityError extends Error {
12
+ constructor(functionalityMessagePrefix: string, category: XPathFunctionalityErrorCategory);
13
+ }
14
+ export {};