@getodk/xforms-engine 0.3.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (429) hide show
  1. package/dist/client/BaseNode.d.ts +15 -5
  2. package/dist/client/BaseValueNode.d.ts +32 -0
  3. package/dist/client/EngineConfig.d.ts +49 -49
  4. package/dist/client/GroupNode.d.ts +2 -3
  5. package/dist/client/InputNode.d.ts +53 -0
  6. package/dist/client/ModelValueNode.d.ts +13 -9
  7. package/dist/client/NodeAppearances.d.ts +1 -2
  8. package/dist/client/NoteNode.d.ts +3 -4
  9. package/dist/client/RootNode.d.ts +36 -10
  10. package/dist/client/SelectNode.d.ts +4 -5
  11. package/dist/client/SubtreeNode.d.ts +1 -2
  12. package/dist/client/TextRange.d.ts +3 -4
  13. package/dist/client/TriggerNode.d.ts +25 -0
  14. package/dist/client/ValueType.d.ts +3 -0
  15. package/dist/client/constants.d.ts +50 -1
  16. package/dist/client/hierarchy.d.ts +9 -5
  17. package/dist/client/identity.d.ts +14 -0
  18. package/dist/client/index.d.ts +0 -1
  19. package/dist/client/node-types.d.ts +3 -1
  20. package/dist/client/repeat/BaseRepeatRangeNode.d.ts +1 -2
  21. package/dist/client/repeat/RepeatInstanceNode.d.ts +2 -3
  22. package/dist/client/repeat/RepeatRangeControlledNode.d.ts +1 -2
  23. package/dist/client/repeat/RepeatRangeUncontrolledNode.d.ts +1 -2
  24. package/dist/client/resources.d.ts +93 -0
  25. package/dist/client/submission/SubmissionData.d.ts +7 -0
  26. package/dist/client/submission/SubmissionDefinition.d.ts +14 -0
  27. package/dist/client/submission/SubmissionInstanceFile.d.ts +6 -0
  28. package/dist/client/submission/SubmissionOptions.d.ts +23 -0
  29. package/dist/client/submission/SubmissionResult.d.ts +91 -0
  30. package/dist/client/submission/SubmissionState.d.ts +12 -0
  31. package/dist/client/unsupported/RangeNode.d.ts +9 -0
  32. package/dist/client/unsupported/RankNode.d.ts +9 -0
  33. package/dist/client/unsupported/UnsupportedControlNode.d.ts +32 -0
  34. package/dist/client/unsupported/UploadNode.d.ts +9 -0
  35. package/dist/client/validation.d.ts +2 -3
  36. package/dist/error/ErrorProductionDesignPendingError.d.ts +7 -0
  37. package/dist/error/ValueTypeInvariantError.d.ts +17 -0
  38. package/dist/error/XPathFunctionalityError.d.ts +14 -0
  39. package/dist/error/XPathFunctionalityNotSupportedError.d.ts +7 -0
  40. package/dist/error/XPathFunctionalityPendingError.d.ts +7 -0
  41. package/dist/index.d.ts +16 -4
  42. package/dist/index.js +8559 -4700
  43. package/dist/index.js.map +1 -1
  44. package/dist/instance/Group.d.ts +9 -5
  45. package/dist/instance/InputControl.d.ts +36 -0
  46. package/dist/instance/ModelValue.d.ts +16 -27
  47. package/dist/instance/Note.d.ts +11 -5
  48. package/dist/instance/PrimaryInstance.d.ts +84 -0
  49. package/dist/instance/Root.d.ts +31 -28
  50. package/dist/instance/SelectField.d.ts +13 -6
  51. package/dist/instance/Subtree.d.ts +10 -6
  52. package/dist/instance/TriggerControl.d.ts +47 -0
  53. package/dist/instance/abstract/DescendantNode.d.ts +33 -26
  54. package/dist/instance/abstract/InstanceNode.d.ts +50 -31
  55. package/dist/instance/abstract/UnsupportedControl.d.ts +53 -0
  56. package/dist/instance/abstract/ValueNode.d.ts +48 -0
  57. package/dist/instance/children.d.ts +0 -1
  58. package/dist/instance/hierarchy.d.ts +13 -8
  59. package/dist/instance/identity.d.ts +2 -7
  60. package/dist/instance/index.d.ts +0 -1
  61. package/dist/instance/internal-api/EvaluationContext.d.ts +53 -13
  62. package/dist/instance/internal-api/InstanceConfig.d.ts +8 -3
  63. package/dist/instance/internal-api/InstanceValueContext.d.ts +20 -0
  64. package/dist/instance/internal-api/PrimaryInstanceDocument.d.ts +36 -0
  65. package/dist/instance/internal-api/TranslationContext.d.ts +3 -3
  66. package/dist/instance/internal-api/ValidationContext.d.ts +12 -6
  67. package/dist/instance/internal-api/ValueContext.d.ts +5 -5
  68. package/dist/instance/internal-api/submission/ClientReactiveSubmittableInstance.d.ts +14 -0
  69. package/dist/instance/internal-api/submission/ClientReactiveSubmittableLeafNode.d.ts +31 -0
  70. package/dist/instance/internal-api/submission/ClientReactiveSubmittableParentNode.d.ts +18 -0
  71. package/dist/instance/internal-api/submission/ClientReactiveSubmittableValueNode.d.ts +17 -0
  72. package/dist/instance/repeat/BaseRepeatRange.d.ts +40 -85
  73. package/dist/instance/repeat/RepeatInstance.d.ts +11 -30
  74. package/dist/instance/repeat/RepeatRangeControlled.d.ts +3 -4
  75. package/dist/instance/repeat/RepeatRangeUncontrolled.d.ts +3 -4
  76. package/dist/instance/resource.d.ts +1 -2
  77. package/dist/instance/text/TextChunk.d.ts +0 -1
  78. package/dist/instance/text/TextRange.d.ts +1 -2
  79. package/dist/instance/unsupported/RangeControl.d.ts +6 -0
  80. package/dist/instance/unsupported/RankControl.d.ts +6 -0
  81. package/dist/instance/unsupported/UploadControl.d.ts +6 -0
  82. package/dist/integration/xpath/EngineXPathEvaluator.d.ts +14 -0
  83. package/dist/integration/xpath/adapter/XFormsXPathNode.d.ts +71 -0
  84. package/dist/integration/xpath/adapter/engineDOMAdapter.d.ts +5 -0
  85. package/dist/integration/xpath/adapter/kind.d.ts +32 -0
  86. package/dist/integration/xpath/adapter/names.d.ts +16 -0
  87. package/dist/integration/xpath/adapter/traversal.d.ts +25 -0
  88. package/dist/integration/xpath/adapter/values.d.ts +2 -0
  89. package/dist/integration/xpath/static-dom/StaticAttribute.d.ts +19 -0
  90. package/dist/integration/xpath/static-dom/StaticDocument.d.ts +16 -0
  91. package/dist/integration/xpath/static-dom/StaticElement.d.ts +40 -0
  92. package/dist/integration/xpath/static-dom/StaticNamedNode.d.ts +17 -0
  93. package/dist/integration/xpath/static-dom/StaticNode.d.ts +33 -0
  94. package/dist/integration/xpath/static-dom/StaticText.d.ts +16 -0
  95. package/dist/lib/TokenListParser.d.ts +3 -3
  96. package/dist/lib/client-reactivity/submission/createInstanceSubmissionState.d.ts +3 -0
  97. package/dist/lib/client-reactivity/submission/createLeafNodeSubmissionState.d.ts +3 -0
  98. package/dist/lib/client-reactivity/submission/createNodeRangeSubmissionState.d.ts +4 -0
  99. package/dist/lib/client-reactivity/submission/createParentNodeSubmissionState.d.ts +4 -0
  100. package/dist/lib/client-reactivity/submission/createValueNodeSubmissionState.d.ts +3 -0
  101. package/dist/lib/client-reactivity/submission/prepareSubmission.d.ts +8 -0
  102. package/dist/lib/codecs/DecimalValueCodec.d.ts +6 -0
  103. package/dist/lib/codecs/IntValueCodec.d.ts +6 -0
  104. package/dist/lib/codecs/StringValueCodec.d.ts +4 -0
  105. package/dist/lib/codecs/ValueCodec.d.ts +30 -0
  106. package/dist/lib/codecs/ValueTypePlaceholderCodec.d.ts +12 -0
  107. package/dist/lib/codecs/getSharedValueCodec.d.ts +47 -0
  108. package/dist/lib/dom/query.d.ts +4 -2
  109. package/dist/lib/reactivity/createChildrenState.d.ts +7 -6
  110. package/dist/lib/reactivity/createComputedExpression.d.ts +19 -7
  111. package/dist/lib/reactivity/createInstanceValueState.d.ts +40 -0
  112. package/dist/lib/reactivity/createNoteReadonlyThunk.d.ts +2 -3
  113. package/dist/lib/reactivity/createSelectItems.d.ts +0 -1
  114. package/dist/lib/reactivity/createTranslationState.d.ts +19 -0
  115. package/dist/lib/reactivity/createValueState.d.ts +6 -11
  116. package/dist/lib/reactivity/materializeCurrentStateChildren.d.ts +4 -5
  117. package/dist/lib/reactivity/node-state/createClientState.d.ts +0 -1
  118. package/dist/lib/reactivity/node-state/createCurrentState.d.ts +0 -1
  119. package/dist/lib/reactivity/node-state/createEngineState.d.ts +0 -1
  120. package/dist/lib/reactivity/node-state/createSharedNodeState.d.ts +0 -1
  121. package/dist/lib/reactivity/node-state/createSpecifiedPropertyDescriptor.d.ts +0 -1
  122. package/dist/lib/reactivity/node-state/createSpecifiedState.d.ts +0 -1
  123. package/dist/lib/reactivity/node-state/representations.d.ts +0 -1
  124. package/dist/lib/reactivity/scope.d.ts +0 -1
  125. package/dist/lib/reactivity/text/createFieldHint.d.ts +1 -2
  126. package/dist/lib/reactivity/text/createNodeLabel.d.ts +1 -2
  127. package/dist/lib/reactivity/text/createNoteText.d.ts +1 -2
  128. package/dist/lib/reactivity/text/createTextRange.d.ts +0 -1
  129. package/dist/lib/reactivity/types.d.ts +0 -1
  130. package/dist/lib/reactivity/validation/createAggregatedViolations.d.ts +0 -1
  131. package/dist/lib/reactivity/validation/createValidation.d.ts +0 -1
  132. package/dist/lib/xml-serialization.d.ts +41 -0
  133. package/dist/parse/XFormDOM.d.ts +42 -0
  134. package/dist/{XFormDefinition.d.ts → parse/XFormDefinition.d.ts} +3 -5
  135. package/dist/parse/attachments/FormAttachmentResource.d.ts +27 -0
  136. package/dist/{body → parse/body}/BodyDefinition.d.ts +16 -11
  137. package/dist/{body → parse/body}/BodyElementDefinition.d.ts +7 -7
  138. package/dist/{body → parse/body}/RepeatElementDefinition.d.ts +3 -4
  139. package/dist/{body → parse/body}/UnsupportedBodyElementDefinition.d.ts +0 -1
  140. package/dist/parse/body/appearance/inputAppearanceParser.d.ts +3 -0
  141. package/dist/{body → parse/body}/appearance/selectAppearanceParser.d.ts +1 -2
  142. package/dist/{body → parse/body}/appearance/structureElementAppearanceParser.d.ts +1 -2
  143. package/dist/parse/body/appearance/unknownAppearanceParser.d.ts +3 -0
  144. package/dist/{body → parse/body}/control/ControlDefinition.d.ts +3 -4
  145. package/dist/{body/control/InputDefinition.d.ts → parse/body/control/InputControlDefinition.d.ts} +2 -3
  146. package/dist/parse/body/control/RangeControlDefinition.d.ts +11 -0
  147. package/dist/parse/body/control/RankControlDefinition.d.ts +11 -0
  148. package/dist/parse/body/control/TriggerControlDefinition.d.ts +11 -0
  149. package/dist/parse/body/control/UploadControlDefinition.d.ts +11 -0
  150. package/dist/{body → parse/body}/control/select/ItemDefinition.d.ts +2 -3
  151. package/dist/{body → parse/body}/control/select/ItemsetDefinition.d.ts +4 -5
  152. package/dist/{body → parse/body}/control/select/ItemsetNodesetContext.d.ts +1 -4
  153. package/dist/{body → parse/body}/control/select/SelectDefinition.d.ts +3 -12
  154. package/dist/{body → parse/body}/group/BaseGroupDefinition.d.ts +3 -5
  155. package/dist/{body → parse/body}/group/LogicalGroupDefinition.d.ts +0 -1
  156. package/dist/{body → parse/body}/group/PresentationGroupDefinition.d.ts +1 -2
  157. package/dist/{body → parse/body}/group/StructuralGroupDefinition.d.ts +0 -1
  158. package/dist/{model/BindComputation.d.ts → parse/expression/BindComputationExpression.d.ts} +5 -6
  159. package/dist/{body/control/select → parse/expression}/ItemsetNodesetExpression.d.ts +2 -3
  160. package/dist/{body/control/select → parse/expression}/ItemsetValueExpression.d.ts +2 -3
  161. package/dist/parse/expression/RepeatCountControlExpression.d.ts +2 -3
  162. package/dist/parse/expression/TextLiteralExpression.d.ts +9 -0
  163. package/dist/parse/expression/TextOutputExpression.d.ts +7 -0
  164. package/dist/parse/expression/TextReferenceExpression.d.ts +7 -0
  165. package/dist/parse/expression/TextTranslationExpression.d.ts +8 -0
  166. package/dist/parse/expression/abstract/DependencyContext.d.ts +7 -0
  167. package/dist/{expression → parse/expression/abstract}/DependentExpression.d.ts +4 -6
  168. package/dist/parse/expression/abstract/TextChunkExpression.d.ts +17 -0
  169. package/dist/parse/model/BindDefinition.d.ts +38 -0
  170. package/dist/parse/model/BindTypeDefinition.d.ts +20 -0
  171. package/dist/{model → parse/model}/DescendentNodeDefinition.d.ts +0 -2
  172. package/dist/parse/model/FormSubmissionDefinition.d.ts +8 -0
  173. package/dist/parse/model/ItextTranslation/ItextTranslationDefinition.d.ts +4 -0
  174. package/dist/parse/model/ItextTranslation/ItextTranslationRootDefinition.d.ts +8 -0
  175. package/dist/parse/model/ItextTranslation/ItextTranslationsDefinition.d.ts +8 -0
  176. package/dist/{model → parse/model}/LeafNodeDefinition.d.ts +4 -3
  177. package/dist/{model → parse/model}/ModelBindMap.d.ts +1 -2
  178. package/dist/{model → parse/model}/ModelDefinition.d.ts +3 -2
  179. package/dist/{model → parse/model}/NodeDefinition.d.ts +0 -2
  180. package/dist/parse/{NoteNodeDefinition.d.ts → model/NoteNodeDefinition.d.ts} +12 -13
  181. package/dist/{model → parse/model}/RepeatInstanceDefinition.d.ts +1 -2
  182. package/dist/{model → parse/model}/RepeatRangeDefinition.d.ts +2 -3
  183. package/dist/{model → parse/model}/RepeatTemplateDefinition.d.ts +2 -3
  184. package/dist/{model → parse/model}/RootDefinition.d.ts +5 -5
  185. package/dist/parse/model/SecondaryInstance/SecondaryInstanceDefinition.d.ts +4 -0
  186. package/dist/parse/model/SecondaryInstance/SecondaryInstanceRootDefinition.d.ts +7 -0
  187. package/dist/parse/model/SecondaryInstance/SecondaryInstancesDefinition.d.ts +13 -0
  188. package/dist/parse/model/SecondaryInstance/sources/BlankSecondaryInstanceSource.d.ts +14 -0
  189. package/dist/parse/model/SecondaryInstance/sources/CSVExternalSecondaryInstance.d.ts +22 -0
  190. package/dist/parse/model/SecondaryInstance/sources/ExternalSecondaryInstanceResource.d.ts +23 -0
  191. package/dist/parse/model/SecondaryInstance/sources/ExternalSecondaryInstanceSource.d.ts +9 -0
  192. package/dist/parse/model/SecondaryInstance/sources/GeoJSONExternalSecondaryInstance.d.ts +5 -0
  193. package/dist/parse/model/SecondaryInstance/sources/InternalSecondaryInstanceSource.d.ts +7 -0
  194. package/dist/parse/model/SecondaryInstance/sources/SecondaryInstanceSource.d.ts +13 -0
  195. package/dist/parse/model/SecondaryInstance/sources/XMLExternalSecondaryInstanceSource.d.ts +12 -0
  196. package/dist/{model → parse/model}/SubtreeDefinition.d.ts +1 -2
  197. package/dist/parse/shared/parseStaticDocumentFromDOMSubtree.d.ts +24 -0
  198. package/dist/parse/text/HintDefinition.d.ts +2 -3
  199. package/dist/parse/text/ItemLabelDefinition.d.ts +2 -3
  200. package/dist/parse/text/ItemsetLabelDefinition.d.ts +3 -4
  201. package/dist/parse/text/LabelDefinition.d.ts +5 -6
  202. package/dist/parse/text/MessageDefinition.d.ts +4 -5
  203. package/dist/parse/text/abstract/TextElementDefinition.d.ts +8 -9
  204. package/dist/parse/text/abstract/TextRangeDefinition.d.ts +4 -7
  205. package/dist/parse/xpath/path-resolution.d.ts +0 -1
  206. package/dist/parse/xpath/predicate-analysis.d.ts +0 -1
  207. package/dist/parse/xpath/reference-parsing.d.ts +0 -1
  208. package/dist/parse/xpath/semantic-analysis.d.ts +5 -1
  209. package/dist/parse/xpath/syntax-traversal.d.ts +0 -1
  210. package/dist/solid.js +8398 -4543
  211. package/dist/solid.js.map +1 -1
  212. package/package.json +14 -12
  213. package/src/client/BaseNode.ts +17 -7
  214. package/src/client/BaseValueNode.ts +35 -0
  215. package/src/client/EngineConfig.ts +52 -51
  216. package/src/client/GroupNode.ts +2 -2
  217. package/src/client/InputNode.ts +77 -0
  218. package/src/client/ModelValueNode.ts +31 -8
  219. package/src/client/NodeAppearances.ts +1 -1
  220. package/src/client/NoteNode.ts +3 -3
  221. package/src/client/RootNode.ts +39 -9
  222. package/src/client/SelectNode.ts +5 -5
  223. package/src/client/SubtreeNode.ts +1 -1
  224. package/src/client/TextRange.ts +4 -5
  225. package/src/client/TriggerNode.ts +29 -0
  226. package/src/client/ValueType.ts +4 -0
  227. package/src/client/constants.ts +67 -0
  228. package/src/client/hierarchy.ts +16 -4
  229. package/src/client/identity.ts +16 -0
  230. package/src/client/node-types.ts +19 -5
  231. package/src/client/repeat/BaseRepeatRangeNode.ts +1 -1
  232. package/src/client/repeat/RepeatInstanceNode.ts +2 -2
  233. package/src/client/repeat/RepeatRangeControlledNode.ts +1 -1
  234. package/src/client/repeat/RepeatRangeUncontrolledNode.ts +1 -1
  235. package/src/client/resources.ts +118 -0
  236. package/src/client/submission/SubmissionData.ts +12 -0
  237. package/src/client/submission/SubmissionDefinition.ts +16 -0
  238. package/src/client/submission/SubmissionInstanceFile.ts +9 -0
  239. package/src/client/submission/SubmissionOptions.ts +28 -0
  240. package/src/client/submission/SubmissionResult.ts +124 -0
  241. package/src/client/submission/SubmissionState.ts +14 -0
  242. package/src/client/unsupported/RangeNode.ts +14 -0
  243. package/src/client/unsupported/RankNode.ts +14 -0
  244. package/src/client/unsupported/UnsupportedControlNode.ts +40 -0
  245. package/src/client/unsupported/UploadNode.ts +14 -0
  246. package/src/client/validation.ts +2 -2
  247. package/src/error/ErrorProductionDesignPendingError.ts +6 -0
  248. package/src/error/ValueTypeInvariantError.ts +22 -0
  249. package/src/error/XPathFunctionalityError.ts +26 -0
  250. package/src/error/XPathFunctionalityNotSupportedError.ts +18 -0
  251. package/src/error/XPathFunctionalityPendingError.ts +18 -0
  252. package/src/index.ts +16 -2
  253. package/src/instance/Group.ts +17 -5
  254. package/src/instance/InputControl.ts +119 -0
  255. package/src/instance/ModelValue.ts +47 -54
  256. package/src/instance/Note.ts +26 -10
  257. package/src/instance/PrimaryInstance.ts +244 -0
  258. package/src/instance/Root.ts +64 -132
  259. package/src/instance/SelectField.ts +62 -25
  260. package/src/instance/Subtree.ts +19 -7
  261. package/src/instance/{StringField.ts → TriggerControl.ts} +61 -30
  262. package/src/instance/abstract/DescendantNode.ts +92 -47
  263. package/src/instance/abstract/InstanceNode.ts +104 -98
  264. package/src/instance/abstract/UnsupportedControl.ts +174 -0
  265. package/src/instance/abstract/ValueNode.ts +127 -0
  266. package/src/instance/children.ts +83 -14
  267. package/src/instance/hierarchy.ts +36 -14
  268. package/src/instance/identity.ts +3 -9
  269. package/src/instance/index.ts +26 -8
  270. package/src/instance/internal-api/EvaluationContext.ts +61 -14
  271. package/src/instance/internal-api/InstanceConfig.ts +9 -2
  272. package/src/instance/internal-api/InstanceValueContext.ts +24 -0
  273. package/src/instance/internal-api/PrimaryInstanceDocument.ts +53 -0
  274. package/src/instance/internal-api/TranslationContext.ts +3 -2
  275. package/src/instance/internal-api/ValidationContext.ts +13 -5
  276. package/src/instance/internal-api/ValueContext.ts +5 -4
  277. package/src/instance/internal-api/submission/ClientReactiveSubmittableInstance.ts +20 -0
  278. package/src/instance/internal-api/submission/ClientReactiveSubmittableLeafNode.ts +42 -0
  279. package/src/instance/internal-api/submission/ClientReactiveSubmittableParentNode.ts +25 -0
  280. package/src/instance/internal-api/submission/ClientReactiveSubmittableValueNode.ts +23 -0
  281. package/src/instance/repeat/BaseRepeatRange.ts +51 -132
  282. package/src/instance/repeat/RepeatInstance.ts +20 -46
  283. package/src/instance/repeat/RepeatRangeControlled.ts +6 -6
  284. package/src/instance/repeat/RepeatRangeUncontrolled.ts +3 -5
  285. package/src/instance/resource.ts +1 -1
  286. package/src/instance/text/TextChunk.ts +1 -1
  287. package/src/instance/unsupported/RangeControl.ts +9 -0
  288. package/src/instance/unsupported/RankControl.ts +9 -0
  289. package/src/instance/unsupported/UploadControl.ts +9 -0
  290. package/src/integration/xpath/EngineXPathEvaluator.ts +22 -0
  291. package/src/integration/xpath/adapter/XFormsXPathNode.ts +126 -0
  292. package/src/integration/xpath/adapter/engineDOMAdapter.ts +57 -0
  293. package/src/integration/xpath/adapter/kind.ts +114 -0
  294. package/src/integration/xpath/adapter/names.ts +99 -0
  295. package/src/integration/xpath/adapter/traversal.ts +228 -0
  296. package/src/integration/xpath/adapter/values.ts +5 -0
  297. package/src/integration/xpath/static-dom/StaticAttribute.ts +33 -0
  298. package/src/integration/xpath/static-dom/StaticDocument.ts +38 -0
  299. package/src/integration/xpath/static-dom/StaticElement.ts +106 -0
  300. package/src/integration/xpath/static-dom/StaticNamedNode.ts +45 -0
  301. package/src/integration/xpath/static-dom/StaticNode.ts +68 -0
  302. package/src/integration/xpath/static-dom/StaticText.ts +28 -0
  303. package/src/lib/TokenListParser.ts +11 -7
  304. package/src/lib/client-reactivity/README.md +0 -0
  305. package/src/lib/client-reactivity/submission/createInstanceSubmissionState.ts +12 -0
  306. package/src/lib/client-reactivity/submission/createLeafNodeSubmissionState.ts +20 -0
  307. package/src/lib/client-reactivity/submission/createNodeRangeSubmissionState.ts +17 -0
  308. package/src/lib/client-reactivity/submission/createParentNodeSubmissionState.ts +22 -0
  309. package/src/lib/client-reactivity/submission/createValueNodeSubmissionState.ts +21 -0
  310. package/src/lib/client-reactivity/submission/prepareSubmission.ts +172 -0
  311. package/src/lib/codecs/DecimalValueCodec.ts +46 -0
  312. package/src/lib/codecs/IntValueCodec.ts +100 -0
  313. package/src/lib/codecs/StringValueCodec.ts +11 -0
  314. package/src/lib/codecs/ValueCodec.ts +106 -0
  315. package/src/lib/codecs/ValueTypePlaceholderCodec.ts +19 -0
  316. package/src/lib/codecs/getSharedValueCodec.ts +77 -0
  317. package/src/lib/dom/query.ts +8 -1
  318. package/src/lib/reactivity/createChildrenState.ts +8 -6
  319. package/src/lib/reactivity/createComputedExpression.ts +59 -36
  320. package/src/lib/reactivity/createInstanceValueState.ts +166 -0
  321. package/src/lib/reactivity/createNoteReadonlyThunk.ts +12 -7
  322. package/src/lib/reactivity/createSelectItems.ts +23 -23
  323. package/src/lib/reactivity/createTranslationState.ts +61 -0
  324. package/src/lib/reactivity/createValueState.ts +64 -122
  325. package/src/lib/reactivity/materializeCurrentStateChildren.ts +7 -7
  326. package/src/lib/reactivity/node-state/createSpecifiedState.ts +1 -1
  327. package/src/lib/reactivity/text/createFieldHint.ts +1 -1
  328. package/src/lib/reactivity/text/createNodeLabel.ts +1 -1
  329. package/src/lib/reactivity/text/createNoteText.ts +1 -1
  330. package/src/lib/reactivity/text/createTextRange.ts +8 -7
  331. package/src/lib/reactivity/validation/createAggregatedViolations.ts +9 -4
  332. package/src/lib/reactivity/validation/createValidation.ts +2 -3
  333. package/src/lib/xml-serialization.ts +96 -0
  334. package/src/{XFormDOM.ts → parse/XFormDOM.ts} +110 -75
  335. package/src/{XFormDefinition.ts → parse/XFormDefinition.ts} +3 -8
  336. package/src/parse/attachments/FormAttachmentResource.ts +40 -0
  337. package/src/{body → parse/body}/BodyDefinition.ts +46 -29
  338. package/src/{body → parse/body}/BodyElementDefinition.ts +12 -6
  339. package/src/{body → parse/body}/RepeatElementDefinition.ts +7 -5
  340. package/src/{body → parse/body}/appearance/inputAppearanceParser.ts +2 -2
  341. package/src/{body → parse/body}/appearance/selectAppearanceParser.ts +1 -1
  342. package/src/{body → parse/body}/appearance/structureElementAppearanceParser.ts +1 -1
  343. package/src/parse/body/appearance/unknownAppearanceParser.ts +5 -0
  344. package/src/{body → parse/body}/control/ControlDefinition.ts +4 -4
  345. package/src/{body/control/InputDefinition.ts → parse/body/control/InputControlDefinition.ts} +3 -5
  346. package/src/parse/body/control/RangeControlDefinition.ts +26 -0
  347. package/src/parse/body/control/RankControlDefinition.ts +27 -0
  348. package/src/parse/body/control/TriggerControlDefinition.ts +26 -0
  349. package/src/parse/body/control/UploadControlDefinition.ts +26 -0
  350. package/src/{body → parse/body}/control/select/ItemDefinition.ts +2 -2
  351. package/src/{body → parse/body}/control/select/ItemsetDefinition.ts +5 -5
  352. package/src/{body → parse/body}/control/select/ItemsetNodesetContext.ts +1 -6
  353. package/src/{body → parse/body}/control/select/SelectDefinition.ts +3 -11
  354. package/src/{body → parse/body}/group/BaseGroupDefinition.ts +11 -22
  355. package/src/{body → parse/body}/group/PresentationGroupDefinition.ts +1 -1
  356. package/src/{model/BindComputation.ts → parse/expression/BindComputationExpression.ts} +8 -8
  357. package/src/{body/control/select → parse/expression}/ItemsetNodesetExpression.ts +2 -2
  358. package/src/{body/control/select → parse/expression}/ItemsetValueExpression.ts +2 -2
  359. package/src/parse/expression/RepeatCountControlExpression.ts +2 -2
  360. package/src/parse/expression/TextLiteralExpression.ts +19 -0
  361. package/src/parse/{text/OutputChunkDefinition.ts → expression/TextOutputExpression.ts} +4 -4
  362. package/src/parse/{text/ReferenceChunkDefinition.ts → expression/TextReferenceExpression.ts} +4 -4
  363. package/src/parse/{text/TranslationChunkDefinition.ts → expression/TextTranslationExpression.ts} +4 -4
  364. package/src/{expression → parse/expression/abstract}/DependencyContext.ts +0 -26
  365. package/src/{expression → parse/expression/abstract}/DependentExpression.ts +5 -16
  366. package/src/parse/expression/abstract/TextChunkExpression.ts +38 -0
  367. package/src/parse/model/BindDefinition.ts +104 -0
  368. package/src/parse/model/BindTypeDefinition.ts +175 -0
  369. package/src/{model → parse/model}/DescendentNodeDefinition.ts +0 -6
  370. package/src/parse/model/FormSubmissionDefinition.ts +44 -0
  371. package/src/parse/model/ItextTranslation/ItextTranslationDefinition.ts +4 -0
  372. package/src/parse/model/ItextTranslation/ItextTranslationRootDefinition.ts +41 -0
  373. package/src/parse/model/ItextTranslation/ItextTranslationsDefinition.ts +31 -0
  374. package/src/{model → parse/model}/LeafNodeDefinition.ts +4 -1
  375. package/src/{model → parse/model}/ModelBindMap.ts +6 -8
  376. package/src/parse/model/ModelDefinition.ts +24 -0
  377. package/src/{model → parse/model}/NodeDefinition.ts +0 -3
  378. package/src/parse/{NoteNodeDefinition.ts → model/NoteNodeDefinition.ts} +12 -12
  379. package/src/{model → parse/model}/RepeatRangeDefinition.ts +1 -1
  380. package/src/{model → parse/model}/RootDefinition.ts +4 -3
  381. package/src/parse/model/SecondaryInstance/SecondaryInstanceDefinition.ts +4 -0
  382. package/src/parse/model/SecondaryInstance/SecondaryInstanceRootDefinition.ts +12 -0
  383. package/src/parse/model/SecondaryInstance/SecondaryInstancesDefinition.ts +102 -0
  384. package/src/parse/model/SecondaryInstance/sources/BlankSecondaryInstanceSource.ts +40 -0
  385. package/src/parse/model/SecondaryInstance/sources/CSVExternalSecondaryInstance.ts +288 -0
  386. package/src/parse/model/SecondaryInstance/sources/ExternalSecondaryInstanceResource.ts +222 -0
  387. package/src/parse/model/SecondaryInstance/sources/ExternalSecondaryInstanceSource.ts +22 -0
  388. package/src/parse/model/SecondaryInstance/sources/GeoJSONExternalSecondaryInstance.ts +414 -0
  389. package/src/parse/model/SecondaryInstance/sources/InternalSecondaryInstanceSource.ts +19 -0
  390. package/src/parse/model/SecondaryInstance/sources/SecondaryInstanceSource.ts +29 -0
  391. package/src/parse/model/SecondaryInstance/sources/XMLExternalSecondaryInstanceSource.ts +32 -0
  392. package/src/parse/shared/parseStaticDocumentFromDOMSubtree.ts +149 -0
  393. package/src/parse/text/HintDefinition.ts +2 -2
  394. package/src/parse/text/ItemLabelDefinition.ts +2 -2
  395. package/src/parse/text/ItemsetLabelDefinition.ts +7 -7
  396. package/src/parse/text/LabelDefinition.ts +5 -5
  397. package/src/parse/text/MessageDefinition.ts +7 -7
  398. package/src/parse/text/abstract/TextElementDefinition.ts +14 -14
  399. package/src/parse/text/abstract/TextRangeDefinition.ts +4 -10
  400. package/src/parse/xpath/semantic-analysis.ts +29 -0
  401. package/dist/XFormDOM.d.ts +0 -32
  402. package/dist/XFormDataType.d.ts +0 -27
  403. package/dist/body/appearance/inputAppearanceParser.d.ts +0 -4
  404. package/dist/client/StringNode.d.ts +0 -47
  405. package/dist/expression/DependencyContext.d.ts +0 -13
  406. package/dist/instance/StringField.d.ts +0 -45
  407. package/dist/instance/internal-api/SubscribableDependency.d.ts +0 -60
  408. package/dist/model/BindDefinition.d.ts +0 -34
  409. package/dist/parse/text/OutputChunkDefinition.d.ts +0 -8
  410. package/dist/parse/text/ReferenceChunkDefinition.d.ts +0 -8
  411. package/dist/parse/text/StaticTextChunkDefinition.d.ts +0 -10
  412. package/dist/parse/text/TranslationChunkDefinition.d.ts +0 -9
  413. package/dist/parse/text/abstract/TextChunkDefinition.d.ts +0 -18
  414. package/src/XFormDataType.ts +0 -64
  415. package/src/client/StringNode.ts +0 -52
  416. package/src/instance/internal-api/SubscribableDependency.ts +0 -61
  417. package/src/model/BindDefinition.ts +0 -106
  418. package/src/model/ModelDefinition.ts +0 -19
  419. package/src/parse/TODO.md +0 -3
  420. package/src/parse/text/StaticTextChunkDefinition.ts +0 -19
  421. package/src/parse/text/abstract/TextChunkDefinition.ts +0 -38
  422. /package/dist/{model → parse/model}/BindElement.d.ts +0 -0
  423. /package/src/{body → parse/body}/UnsupportedBodyElementDefinition.ts +0 -0
  424. /package/src/{body → parse/body}/group/LogicalGroupDefinition.ts +0 -0
  425. /package/src/{body → parse/body}/group/StructuralGroupDefinition.ts +0 -0
  426. /package/src/{model → parse/model}/BindElement.ts +0 -0
  427. /package/src/{model → parse/model}/RepeatInstanceDefinition.ts +0 -0
  428. /package/src/{model → parse/model}/RepeatTemplateDefinition.ts +0 -0
  429. /package/src/{model → parse/model}/SubtreeDefinition.ts +0 -0
@@ -0,0 +1,106 @@
1
+ import { XFORMS_KNOWN_ATTRIBUTE, XFORMS_LOCAL_NAME, XPathNodeKindKey } from '@getodk/xpath';
2
+ import type { EngineDOMAdapter } from '../adapter/engineDOMAdapter.ts';
3
+ import type { XFormsXPathElement } from '../adapter/XFormsXPathNode.ts';
4
+ import { StaticAttribute } from './StaticAttribute.ts';
5
+ import type { StaticNamedNodeOptions } from './StaticNamedNode.ts';
6
+ import { StaticNamedNode } from './StaticNamedNode.ts';
7
+ import type { StaticChildNode, StaticParentNode } from './StaticNode.ts';
8
+
9
+ export type StaticElementAttributesFactory = (element: StaticElement) => readonly StaticAttribute[];
10
+
11
+ export type StaticElementChildNodesFactory = (element: StaticElement) => readonly StaticChildNode[];
12
+
13
+ export interface StaticElementOptions extends StaticNamedNodeOptions {}
14
+
15
+ type StaticElementKnownAttributeValue<
16
+ T extends StaticElement,
17
+ LocalName extends string,
18
+ > = T extends { readonly [XFORMS_KNOWN_ATTRIBUTE]: LocalName } ? string : string | null;
19
+
20
+ type AssertStaticElementKnownAttributeValue = <T extends StaticElement, LocalName extends string>(
21
+ element: T,
22
+ localName: LocalName,
23
+ value: string | null
24
+ ) => asserts value is StaticElementKnownAttributeValue<T, LocalName>;
25
+
26
+ const assertStaticElementKnownAttributeValue: AssertStaticElementKnownAttributeValue = (
27
+ element,
28
+ localName,
29
+ value
30
+ ) => {
31
+ if (localName === element[XFORMS_KNOWN_ATTRIBUTE] && value == null) {
32
+ throw new Error(`Expected attribute: ${element[XFORMS_KNOWN_ATTRIBUTE]}`);
33
+ }
34
+ };
35
+
36
+ export class StaticElement<Parent extends StaticParentNode = StaticParentNode>
37
+ extends StaticNamedNode<'element'>
38
+ implements XFormsXPathElement
39
+ {
40
+ readonly [XFORMS_LOCAL_NAME]?: string;
41
+ readonly [XFORMS_KNOWN_ATTRIBUTE]?: string;
42
+
43
+ readonly [XPathNodeKindKey] = 'element';
44
+ readonly nodeType = 'static-element';
45
+ readonly root: StaticElement;
46
+ readonly attributes: readonly StaticAttribute[];
47
+ readonly children: readonly StaticChildNode[];
48
+
49
+ constructor(
50
+ parent: Parent,
51
+ attributesFactory: StaticElementAttributesFactory,
52
+ childNodesFactory: StaticElementChildNodesFactory,
53
+ options: StaticElementOptions
54
+ ) {
55
+ super(parent, options);
56
+
57
+ // Account for the fact that we may be constructing the document root!
58
+ if (parent === this.rootDocument) {
59
+ this.root = this;
60
+ } else {
61
+ this.root = parent.root;
62
+ }
63
+
64
+ this.attributes = attributesFactory(this);
65
+ this.children = childNodesFactory(this);
66
+ }
67
+
68
+ /**
69
+ * @todo Generalize this, incorporate into {@link EngineDOMAdapter}
70
+ * @todo Namespaced lookup
71
+ * @todo Optimize: lookup from map and/or caching
72
+ */
73
+ protected getAttributeNode(localName: string): StaticAttribute | null {
74
+ return (
75
+ this.attributes.find((attribute) => {
76
+ return attribute.localName === localName;
77
+ }) ?? null
78
+ );
79
+ }
80
+
81
+ /**
82
+ * @todo Generalize this, incorporate into {@link EngineDOMAdapter}
83
+ * @todo Namespaced lookup
84
+ * @todo Optimize: lookup from map and/or caching (especially asserting known
85
+ * attributes!)
86
+ * @todo As long as this depends on {@link getAttributeNode}, push assertion
87
+ * up. (This was put off because the types are already plenty complex as it
88
+ * is.)
89
+ */
90
+ getAttributeValue<This extends StaticElement, LocalName extends string>(
91
+ this: This,
92
+ localName: LocalName
93
+ ): StaticElementKnownAttributeValue<This, LocalName> {
94
+ const attribute = this.getAttributeNode(localName);
95
+ const value = attribute?.value ?? null;
96
+
97
+ assertStaticElementKnownAttributeValue(this, localName, value);
98
+
99
+ return value;
100
+ }
101
+
102
+ // XFormsXPathElement
103
+ getXPathValue(): string {
104
+ return this.children.map((child) => child.getXPathValue()).join('');
105
+ }
106
+ }
@@ -0,0 +1,45 @@
1
+ import { XFORMS_NAMESPACE_URI } from '@getodk/common/constants/xmlns.ts';
2
+ import type { XFormsXPathNamedNode, XPathNamedNodeKind } from '../adapter/XFormsXPathNode.ts';
3
+ import type { StaticDocument } from './StaticDocument.ts';
4
+ import type { StaticParentNode } from './StaticNode.ts';
5
+ import { StaticNode } from './StaticNode.ts';
6
+
7
+ export interface StaticNamedNodeOptions {
8
+ readonly namespaceURI: string | null;
9
+ readonly localName: string;
10
+ readonly value?: string;
11
+ }
12
+
13
+ export abstract class StaticNamedNode<Kind extends XPathNamedNodeKind>
14
+ extends StaticNode<Kind>
15
+ implements XFormsXPathNamedNode
16
+ {
17
+ readonly rootDocument: StaticDocument;
18
+ readonly isXFormsNamespace: boolean;
19
+ readonly namespaceURI: string | null;
20
+ readonly localName: string;
21
+ readonly value: string | null;
22
+
23
+ protected constructor(
24
+ readonly parent: StaticParentNode,
25
+ options: StaticNamedNodeOptions
26
+ ) {
27
+ super();
28
+
29
+ this.rootDocument = parent.rootDocument;
30
+
31
+ const { namespaceURI, localName, value = null } = options;
32
+
33
+ this.namespaceURI = namespaceURI;
34
+ this.localName = localName;
35
+ this.value = value;
36
+
37
+ if (namespaceURI === XFORMS_NAMESPACE_URI) {
38
+ this.isXFormsNamespace = true;
39
+ } else if (parent == null || parent.isXFormsNamespace) {
40
+ this.isXFormsNamespace = namespaceURI == null;
41
+ } else {
42
+ this.isXFormsNamespace = false;
43
+ }
44
+ }
45
+ }
@@ -0,0 +1,68 @@
1
+ // import type { StaticNodeBrand } from '@getodk/xpath';
2
+ import { XPathNodeKindKey } from '@getodk/xpath';
3
+ import type { XFormsXPathNode } from '../adapter/XFormsXPathNode.ts';
4
+ import type { StaticAttribute } from './StaticAttribute.ts';
5
+ import type { StaticDocument } from './StaticDocument.ts';
6
+ import type { StaticElement } from './StaticElement.ts';
7
+ import type { StaticText } from './StaticText.ts';
8
+
9
+ // prettier-ignore
10
+ export type StaticNodeKind =
11
+ // eslint-disable-next-line @typescript-eslint/sort-type-constituents
12
+ | 'document'
13
+ | 'element'
14
+ | 'attribute'
15
+ | 'text';
16
+
17
+ // prettier-ignore
18
+ export type StaticNodeType<Kind extends StaticNodeKind> = `static-${Kind}`;
19
+
20
+ export abstract class StaticNode<Kind extends StaticNodeKind> implements XFormsXPathNode {
21
+ abstract readonly [XPathNodeKindKey]: Kind;
22
+
23
+ abstract readonly nodeType: StaticNodeType<Kind>;
24
+
25
+ /**
26
+ * A concrete {@link StaticDocument} instance, representing the topmost node
27
+ * of a static document tree, containing all of:
28
+ *
29
+ * - {@link root}
30
+ * - {@link children}
31
+ * - any {@link StaticChildNode} descendants of either of the above
32
+ */
33
+ abstract readonly rootDocument: StaticDocument;
34
+
35
+ /**
36
+ * A concrete {@link StaticElement} instance, representing the single,
37
+ * immediate child of {@link rootDocument}, containing all other descendants
38
+ * of its document tree.
39
+ */
40
+ abstract readonly root: StaticElement;
41
+
42
+ abstract readonly children: readonly StaticChildNode[] | null;
43
+
44
+ // XFormsXPathNode
45
+ getXPathChildNodes(): readonly StaticChildNode[] {
46
+ return this.children ?? [];
47
+ }
48
+
49
+ abstract getXPathValue(): string;
50
+ }
51
+
52
+ // prettier-ignore
53
+ export type AnyStaticNode =
54
+ // eslint-disable-next-line @typescript-eslint/sort-type-constituents
55
+ | StaticDocument
56
+ | StaticElement
57
+ | StaticAttribute
58
+ | StaticText;
59
+
60
+ // prettier-ignore
61
+ export type StaticParentNode =
62
+ | StaticDocument
63
+ | StaticElement;
64
+
65
+ // prettier-ignore
66
+ export type StaticChildNode =
67
+ | StaticElement
68
+ | StaticText;
@@ -0,0 +1,28 @@
1
+ import { XPathNodeKindKey } from '@getodk/xpath';
2
+ import type { XFormsXPathText } from '../adapter/XFormsXPathNode.ts';
3
+ import type { StaticDocument } from './StaticDocument.ts';
4
+ import type { StaticElement } from './StaticElement.ts';
5
+ import { StaticNode } from './StaticNode.ts';
6
+
7
+ export class StaticText extends StaticNode<'text'> implements XFormsXPathText {
8
+ readonly [XPathNodeKindKey] = 'text';
9
+ readonly nodeType = 'static-text';
10
+ readonly rootDocument: StaticDocument;
11
+ readonly root: StaticElement;
12
+ readonly children = null;
13
+
14
+ constructor(
15
+ readonly parent: StaticElement,
16
+ readonly value: string
17
+ ) {
18
+ super();
19
+
20
+ this.rootDocument = parent.rootDocument;
21
+ this.root = parent.root;
22
+ }
23
+
24
+ // XFormsXPathText
25
+ getXPathValue(): string {
26
+ return this.value;
27
+ }
28
+ }
@@ -11,16 +11,20 @@ type TokenListIterator<CanonicalToken extends string> = IterableIterator<
11
11
  PartiallyKnownString<CanonicalToken>
12
12
  >;
13
13
 
14
+ type PassthroughTokenList = Readonly<Record<string, boolean>>;
15
+
14
16
  /**
15
17
  * @see {@link TokenListParser}
16
18
  */
17
19
  // prettier-ignore
18
- export type TokenList<CanonicalToken extends string = string> = {
19
- readonly [Key in TokenListKey<CanonicalToken>]:
20
- Key extends SymbolIterator
21
- ? () => TokenListIterator<CanonicalToken>
22
- : boolean;
23
- };
20
+ export type TokenList<CanonicalToken extends string = string> =
21
+ & PassthroughTokenList
22
+ & {
23
+ readonly [Key in TokenListKey<CanonicalToken>]:
24
+ Key extends SymbolIterator
25
+ ? () => TokenListIterator<CanonicalToken>
26
+ : boolean;
27
+ };
24
28
 
25
29
  interface TokenListAlias<CanonicalToken extends string> {
26
30
  readonly fromAlias: string;
@@ -101,7 +105,7 @@ export class TokenListParser<
101
105
  private readonly aliases: ReadonlyMap<string, CanonicalToken>;
102
106
 
103
107
  constructor(
104
- readonly canonicalTokens: readonly CanonicalToken[],
108
+ readonly canonicalTokens: readonly CanonicalToken[] = [],
105
109
  options?: TokenListParserOptions<TokenAlias>
106
110
  ) {
107
111
  this.aliases = new Map(
File without changes
@@ -0,0 +1,12 @@
1
+ import type { SubmissionState } from '../../../client/submission/SubmissionState.ts';
2
+ import type { ClientReactiveSubmittableInstance } from '../../../instance/internal-api/submission/ClientReactiveSubmittableInstance.ts';
3
+
4
+ export const createInstanceSubmissionState = (
5
+ node: ClientReactiveSubmittableInstance
6
+ ): SubmissionState => {
7
+ return {
8
+ get submissionXML(): string {
9
+ return node.root.submissionState.submissionXML;
10
+ },
11
+ };
12
+ };
@@ -0,0 +1,20 @@
1
+ import type { SubmissionState } from '../../../client/submission/SubmissionState.ts';
2
+ import type { ClientReactiveSubmittableLeafNode } from '../../../instance/internal-api/submission/ClientReactiveSubmittableLeafNode.ts';
3
+ import { escapeXMLText, serializeLeafElementXML } from '../../xml-serialization.ts';
4
+
5
+ export const createLeafNodeSubmissionState = <Value>(
6
+ node: ClientReactiveSubmittableLeafNode<Value>
7
+ ): SubmissionState => {
8
+ return {
9
+ get submissionXML() {
10
+ if (!node.currentState.relevant) {
11
+ return '';
12
+ }
13
+
14
+ const value = node.encodeValue(node.currentState.value);
15
+ const xmlValue = escapeXMLText(value);
16
+
17
+ return serializeLeafElementXML(node.definition.nodeName, xmlValue);
18
+ },
19
+ };
20
+ };
@@ -0,0 +1,17 @@
1
+ import type { SubmissionState } from '../../../client/submission/SubmissionState.ts';
2
+ import type { ClientReactiveSubmittableParentNode } from '../../../instance/internal-api/submission/ClientReactiveSubmittableParentNode.ts';
3
+ import type { RepeatInstance } from '../../../instance/repeat/RepeatInstance.ts';
4
+
5
+ export const createNodeRangeSubmissionState = (
6
+ node: ClientReactiveSubmittableParentNode<RepeatInstance>
7
+ ): SubmissionState => {
8
+ return {
9
+ get submissionXML() {
10
+ const serializedChildren = node.currentState.children.map((child) => {
11
+ return child.submissionState.submissionXML;
12
+ });
13
+
14
+ return serializedChildren.join('');
15
+ },
16
+ };
17
+ };
@@ -0,0 +1,22 @@
1
+ import type { SubmissionState } from '../../../client/submission/SubmissionState.ts';
2
+ import type { GeneralChildNode } from '../../../instance/hierarchy.ts';
3
+ import type { ClientReactiveSubmittableParentNode } from '../../../instance/internal-api/submission/ClientReactiveSubmittableParentNode.ts';
4
+ import { serializeParentElementXML } from '../../xml-serialization.ts';
5
+
6
+ export const createParentNodeSubmissionState = (
7
+ node: ClientReactiveSubmittableParentNode<GeneralChildNode>
8
+ ): SubmissionState => {
9
+ return {
10
+ get submissionXML() {
11
+ if (!node.currentState.relevant) {
12
+ return '';
13
+ }
14
+
15
+ const serializedChildren = node.currentState.children.map((child) => {
16
+ return child.submissionState.submissionXML;
17
+ });
18
+
19
+ return serializeParentElementXML(node.definition.nodeName, serializedChildren);
20
+ },
21
+ };
22
+ };
@@ -0,0 +1,21 @@
1
+ import type { SubmissionState } from '../../../client/submission/SubmissionState.ts';
2
+ import type { ClientReactiveSubmittableValueNode } from '../../../instance/internal-api/submission/ClientReactiveSubmittableValueNode.ts';
3
+ import { escapeXMLText, serializeLeafElementXML } from '../../xml-serialization.ts';
4
+
5
+ export const createValueNodeSubmissionState = (
6
+ node: ClientReactiveSubmittableValueNode
7
+ ): SubmissionState => {
8
+ const { nodeName } = node.definition;
9
+
10
+ return {
11
+ get submissionXML() {
12
+ if (!node.currentState.relevant) {
13
+ return '';
14
+ }
15
+
16
+ const xmlValue = escapeXMLText(node.currentState.instanceValue);
17
+
18
+ return serializeLeafElementXML(nodeName, xmlValue);
19
+ },
20
+ };
21
+ };
@@ -0,0 +1,172 @@
1
+ import { UnreachableError } from '@getodk/common/lib/error/UnreachableError.ts';
2
+ import {
3
+ SUBMISSION_INSTANCE_FILE_NAME,
4
+ SUBMISSION_INSTANCE_FILE_TYPE,
5
+ } from '../../../client/constants.ts';
6
+ import type { SubmissionData } from '../../../client/submission/SubmissionData.ts';
7
+ import type { SubmissionDefinition } from '../../../client/submission/SubmissionDefinition.ts';
8
+ import type { SubmissionInstanceFile } from '../../../client/submission/SubmissionInstanceFile.ts';
9
+ import type { SubmissionChunkedType } from '../../../client/submission/SubmissionOptions.ts';
10
+ import type { SubmissionResult } from '../../../client/submission/SubmissionResult.ts';
11
+ import type { DescendantNodeViolationReference } from '../../../client/validation.ts';
12
+ import type { ClientReactiveSubmittableInstance } from '../../../instance/internal-api/submission/ClientReactiveSubmittableInstance.ts';
13
+
14
+ class InstanceFile extends File implements SubmissionInstanceFile {
15
+ override readonly name = SUBMISSION_INSTANCE_FILE_NAME;
16
+ override readonly type = SUBMISSION_INSTANCE_FILE_TYPE;
17
+
18
+ constructor(instanceRoot: ClientReactiveSubmittableInstance) {
19
+ const { submissionXML } = instanceRoot.submissionState;
20
+
21
+ super([submissionXML], SUBMISSION_INSTANCE_FILE_NAME, {
22
+ type: SUBMISSION_INSTANCE_FILE_TYPE,
23
+ });
24
+ }
25
+ }
26
+
27
+ type AssertSubmissionData = (data: FormData) => asserts data is SubmissionData;
28
+
29
+ const assertSubmissionData: AssertSubmissionData = (data) => {
30
+ const instanceFile = data.get(SUBMISSION_INSTANCE_FILE_NAME);
31
+
32
+ if (!(instanceFile instanceof InstanceFile)) {
33
+ throw new Error(`Invalid SubmissionData`);
34
+ }
35
+ };
36
+
37
+ class InstanceSubmissionData extends FormData {
38
+ static from(instanceFile: InstanceFile, attachments: readonly File[]): SubmissionData {
39
+ const data = new this(instanceFile, attachments);
40
+
41
+ assertSubmissionData(data);
42
+
43
+ return data;
44
+ }
45
+
46
+ private constructor(
47
+ readonly instanceFile: InstanceFile,
48
+ readonly attachments: readonly File[]
49
+ ) {
50
+ super();
51
+
52
+ this.set(SUBMISSION_INSTANCE_FILE_NAME, instanceFile);
53
+
54
+ attachments.forEach((attachment) => {
55
+ const { name } = attachment;
56
+
57
+ if (name === SUBMISSION_INSTANCE_FILE_NAME && attachment !== instanceFile) {
58
+ throw new Error(
59
+ `Failed to add conflicting attachment with name ${SUBMISSION_INSTANCE_FILE_NAME}`
60
+ );
61
+ }
62
+
63
+ this.set(name, attachment);
64
+ });
65
+ }
66
+ }
67
+
68
+ interface PendingValidation {
69
+ readonly status: 'pending';
70
+ readonly violations: readonly DescendantNodeViolationReference[];
71
+ }
72
+
73
+ interface ReadyValidation {
74
+ readonly status: 'ready';
75
+ readonly violations: null;
76
+ }
77
+
78
+ type SubmissionInstanceStateValidation = PendingValidation | ReadyValidation;
79
+
80
+ const validateSubmission = (
81
+ instanceRoot: ClientReactiveSubmittableInstance
82
+ ): SubmissionInstanceStateValidation => {
83
+ const { violations } = instanceRoot.validationState;
84
+
85
+ if (violations.length === 0) {
86
+ return {
87
+ status: 'ready',
88
+ violations: null,
89
+ };
90
+ }
91
+
92
+ return {
93
+ status: 'pending',
94
+ violations,
95
+ };
96
+ };
97
+
98
+ const monolithicSubmissionResult = (
99
+ validation: SubmissionInstanceStateValidation,
100
+ definition: SubmissionDefinition,
101
+ instanceFile: InstanceFile,
102
+ attachments: readonly File[]
103
+ ): SubmissionResult<'monolithic'> => {
104
+ const data = InstanceSubmissionData.from(instanceFile, attachments);
105
+
106
+ return {
107
+ ...validation,
108
+ definition,
109
+ data,
110
+ };
111
+ };
112
+
113
+ interface ChunkedSubmissionResultOptions {
114
+ readonly maxSize: number;
115
+ }
116
+
117
+ const chunkedSubmissionResult = (
118
+ validation: SubmissionInstanceStateValidation,
119
+ definition: SubmissionDefinition,
120
+ instanceFile: InstanceFile,
121
+ attachments: readonly File[],
122
+ options: ChunkedSubmissionResultOptions
123
+ ): SubmissionResult<'chunked'> => {
124
+ if (attachments.length > 0 || options.maxSize !== Infinity) {
125
+ throw new Error('Submission chunking pending implementation');
126
+ }
127
+
128
+ const data = InstanceSubmissionData.from(instanceFile, attachments);
129
+
130
+ return {
131
+ ...validation,
132
+ definition,
133
+ data: [data],
134
+ };
135
+ };
136
+
137
+ export interface PrepeareSubmissionOptions<ChunkedType extends SubmissionChunkedType> {
138
+ readonly chunked: ChunkedType;
139
+ readonly maxSize: number;
140
+ }
141
+
142
+ export const prepareSubmission = <ChunkedType extends SubmissionChunkedType>(
143
+ instanceRoot: ClientReactiveSubmittableInstance,
144
+ options: PrepeareSubmissionOptions<ChunkedType>
145
+ ): SubmissionResult<ChunkedType> => {
146
+ const validation = validateSubmission(instanceRoot);
147
+ const definition = instanceRoot.definition.submission;
148
+ const instanceFile = new InstanceFile(instanceRoot);
149
+ const attachments: readonly File[] = [];
150
+
151
+ switch (options.chunked) {
152
+ case 'chunked':
153
+ return chunkedSubmissionResult(
154
+ validation,
155
+ definition,
156
+ instanceFile,
157
+ attachments,
158
+ options
159
+ ) satisfies SubmissionResult<'chunked'> as SubmissionResult<ChunkedType>;
160
+
161
+ case 'monolithic':
162
+ return monolithicSubmissionResult(
163
+ validation,
164
+ definition,
165
+ instanceFile,
166
+ attachments
167
+ ) satisfies SubmissionResult<'monolithic'> as SubmissionResult<ChunkedType>;
168
+
169
+ default:
170
+ throw new UnreachableError(options.chunked);
171
+ }
172
+ };
@@ -0,0 +1,46 @@
1
+ import { ValueCodec } from './ValueCodec.ts';
2
+
3
+ export type DecimalInputValue = bigint | number | string | null;
4
+
5
+ const encodeDecimal = (value: DecimalInputValue): string => {
6
+ if (value == null) {
7
+ return '';
8
+ }
9
+
10
+ if (typeof value === 'string') {
11
+ decodeDecimal(value);
12
+ }
13
+
14
+ return String(value);
15
+ };
16
+
17
+ export type DecimalRuntimeValue = number | null;
18
+
19
+ const decodeDecimal = (value: string): DecimalRuntimeValue => {
20
+ if (value === '') {
21
+ return null;
22
+ }
23
+
24
+ const decoded = Number(value);
25
+
26
+ if (
27
+ // NaN is not a decimal value!
28
+ Number.isNaN(decoded) ||
29
+ // Infinity is not a decimal value!
30
+ !Number.isFinite(decoded)
31
+ ) {
32
+ return null;
33
+ }
34
+
35
+ return decoded;
36
+ };
37
+
38
+ export class DecimalValueCodec extends ValueCodec<
39
+ 'decimal',
40
+ DecimalRuntimeValue,
41
+ DecimalInputValue
42
+ > {
43
+ constructor() {
44
+ super('decimal', encodeDecimal, decodeDecimal);
45
+ }
46
+ }