@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,244 @@
1
+ import { XPathNodeKindKey } from '@getodk/xpath';
2
+ import type { Accessor } from 'solid-js';
3
+ import { createSignal } from 'solid-js';
4
+ import type { ActiveLanguage, FormLanguage, FormLanguages } from '../client/FormLanguage.ts';
5
+ import type { FormNodeID } from '../client/identity.ts';
6
+ import type { RootNode } from '../client/RootNode.ts';
7
+ import type {
8
+ SubmissionChunkedType,
9
+ SubmissionOptions,
10
+ } from '../client/submission/SubmissionOptions.ts';
11
+ import type { SubmissionResult } from '../client/submission/SubmissionResult.ts';
12
+ import type { SubmissionState } from '../client/submission/SubmissionState.ts';
13
+ import type { AncestorNodeValidationState } from '../client/validation.ts';
14
+ import type { XFormsXPathDocument } from '../integration/xpath/adapter/XFormsXPathNode.ts';
15
+ import { EngineXPathEvaluator } from '../integration/xpath/EngineXPathEvaluator.ts';
16
+ import { createInstanceSubmissionState } from '../lib/client-reactivity/submission/createInstanceSubmissionState.ts';
17
+ import { prepareSubmission } from '../lib/client-reactivity/submission/prepareSubmission.ts';
18
+ import { createChildrenState } from '../lib/reactivity/createChildrenState.ts';
19
+ import { createTranslationState } from '../lib/reactivity/createTranslationState.ts';
20
+ import type { MaterializedChildren } from '../lib/reactivity/materializeCurrentStateChildren.ts';
21
+ import { materializeCurrentStateChildren } from '../lib/reactivity/materializeCurrentStateChildren.ts';
22
+ import type { CurrentState } from '../lib/reactivity/node-state/createCurrentState.ts';
23
+ import type { EngineState } from '../lib/reactivity/node-state/createEngineState.ts';
24
+ import type { SharedNodeState } from '../lib/reactivity/node-state/createSharedNodeState.ts';
25
+ import { createSharedNodeState } from '../lib/reactivity/node-state/createSharedNodeState.ts';
26
+ import type { ReactiveScope } from '../lib/reactivity/scope.ts';
27
+ import type { SimpleAtomicStateSetter } from '../lib/reactivity/types.ts';
28
+ import type { BodyClassList } from '../parse/body/BodyDefinition.ts';
29
+ import type { ModelDefinition } from '../parse/model/ModelDefinition.ts';
30
+ import type { RootDefinition } from '../parse/model/RootDefinition.ts';
31
+ import type { SecondaryInstancesDefinition } from '../parse/model/SecondaryInstance/SecondaryInstancesDefinition.ts';
32
+ import { InstanceNode } from './abstract/InstanceNode.ts';
33
+ import type { EvaluationContext } from './internal-api/EvaluationContext.ts';
34
+ import type { InstanceConfig } from './internal-api/InstanceConfig.ts';
35
+ import type { PrimaryInstanceDocument } from './internal-api/PrimaryInstanceDocument.ts';
36
+ import type { ClientReactiveSubmittableInstance } from './internal-api/submission/ClientReactiveSubmittableInstance.ts';
37
+ import type { TranslationContext } from './internal-api/TranslationContext.ts';
38
+ import { Root } from './Root.ts';
39
+
40
+ /**
41
+ * As specified by {@link | XPath 1.0}:
42
+ *
43
+ * > A `/` by itself selects the root node of the document containing the
44
+ * > context node.
45
+ *
46
+ * Important note: "root node" here references the same semantics currently
47
+ * represented by `@getodk/xpath` as {@link XPathDocument}. It is an infortunate
48
+ * historical mistake that our internal representation of a primary instance has
49
+ * conflated the same "root" term to represent the "document element" with the
50
+ * same semantic name.
51
+ *
52
+ * {@link PrimaryInstance} exists specifically to provide XPath document
53
+ * semantics. At time of writing, it is expected that every XPath evaluation
54
+ * will be performed with a context node either:
55
+ *
56
+ * - somewhere in this primary instance document's hierarchy; or
57
+ * - in a related subtree where the primary instance document is still
58
+ * semantically represented as the context root node
59
+ */
60
+ const PRIMARY_INSTANCE_REFERENCE = '/';
61
+
62
+ interface PrimaryInstanceStateSpec {
63
+ readonly reference: string;
64
+ readonly readonly: boolean;
65
+ readonly relevant: boolean;
66
+ readonly required: boolean;
67
+ readonly label: null;
68
+ readonly hint: null;
69
+ readonly children: Accessor<readonly FormNodeID[]>;
70
+ readonly valueOptions: null;
71
+ readonly value: null;
72
+
73
+ // Root-specific
74
+ readonly activeLanguage: Accessor<ActiveLanguage>;
75
+ }
76
+
77
+ export class PrimaryInstance
78
+ extends InstanceNode<RootDefinition, PrimaryInstanceStateSpec, null, Root>
79
+ implements
80
+ PrimaryInstanceDocument,
81
+ XFormsXPathDocument,
82
+ TranslationContext,
83
+ EvaluationContext,
84
+ ClientReactiveSubmittableInstance
85
+ {
86
+ // InstanceNode
87
+ protected readonly state: SharedNodeState<PrimaryInstanceStateSpec>;
88
+ protected readonly engineState: EngineState<PrimaryInstanceStateSpec>;
89
+ readonly getChildren: Accessor<readonly Root[]>;
90
+
91
+ readonly hasReadonlyAncestor = () => false;
92
+ readonly isReadonly = () => false;
93
+ readonly hasNonRelevantAncestor = () => false;
94
+ readonly isRelevant = () => true;
95
+
96
+ // TranslationContext (support)
97
+ private readonly setActiveLanguage: SimpleAtomicStateSetter<FormLanguage>;
98
+
99
+ // XFormsXPathDocument
100
+ readonly [XPathNodeKindKey] = 'document';
101
+
102
+ // PrimaryInstanceDocument, ClientReactiveSubmittableInstance
103
+ readonly nodeType = 'primary-instance';
104
+ readonly appearances = null;
105
+ readonly classes: BodyClassList;
106
+ readonly root: Root;
107
+ readonly currentState: MaterializedChildren<CurrentState<PrimaryInstanceStateSpec>, Root>;
108
+ readonly validationState: AncestorNodeValidationState;
109
+ readonly submissionState: SubmissionState;
110
+ readonly languages: FormLanguages;
111
+
112
+ // TranslationContext (+ EvaluationContext)
113
+ readonly getActiveLanguage: Accessor<ActiveLanguage>;
114
+
115
+ // EvaluationContext
116
+ readonly isAttached: Accessor<boolean>;
117
+ readonly evaluator: EngineXPathEvaluator;
118
+ override readonly contextNode = this;
119
+
120
+ constructor(
121
+ scope: ReactiveScope,
122
+ model: ModelDefinition,
123
+ secondaryInstances: SecondaryInstancesDefinition,
124
+ engineConfig: InstanceConfig
125
+ ) {
126
+ const { root: definition } = model;
127
+
128
+ super(engineConfig, null, definition, {
129
+ scope,
130
+ computeReference: () => PRIMARY_INSTANCE_REFERENCE,
131
+ });
132
+
133
+ const [isAttached, setIsAttached] = createSignal(false);
134
+
135
+ this.isAttached = isAttached;
136
+
137
+ const evaluator = new EngineXPathEvaluator({
138
+ rootNode: this,
139
+ itextTranslationsByLanguage: model.itextTranslations,
140
+ secondaryInstancesById: secondaryInstances,
141
+ });
142
+
143
+ const { languages, getActiveLanguage, setActiveLanguage } = createTranslationState(
144
+ scope,
145
+ evaluator
146
+ );
147
+
148
+ this.languages = languages;
149
+ this.getActiveLanguage = getActiveLanguage;
150
+ this.setActiveLanguage = setActiveLanguage;
151
+
152
+ this.evaluator = evaluator;
153
+ this.classes = definition.classes;
154
+
155
+ const childrenState = createChildrenState<this, Root>(this);
156
+
157
+ this.getChildren = childrenState.getChildren;
158
+
159
+ const stateSpec: PrimaryInstanceStateSpec = {
160
+ activeLanguage: getActiveLanguage,
161
+ reference: PRIMARY_INSTANCE_REFERENCE,
162
+ label: null,
163
+ hint: null,
164
+ readonly: false,
165
+ relevant: true,
166
+ required: false,
167
+ valueOptions: null,
168
+ value: null,
169
+ children: childrenState.childIds,
170
+ };
171
+
172
+ const state = createSharedNodeState(scope, stateSpec, {
173
+ clientStateFactory: engineConfig.stateFactory,
174
+ });
175
+
176
+ this.state = state;
177
+ this.engineState = state.engineState;
178
+ this.currentState = materializeCurrentStateChildren(scope, state.currentState, childrenState);
179
+
180
+ const root = new Root(this);
181
+
182
+ this.root = root;
183
+
184
+ this.validationState = {
185
+ get violations() {
186
+ return root.validationState.violations;
187
+ },
188
+ };
189
+ this.submissionState = createInstanceSubmissionState(this);
190
+
191
+ childrenState.setChildren([root]);
192
+ setIsAttached(true);
193
+ }
194
+
195
+ // PrimaryInstanceDocument
196
+ /**
197
+ * @todo Note that this method's signature is intentionally derived from
198
+ * {@link RootNode.setLanguage}, but its return type differs! The design
199
+ * intent of returning {@link RootNode} from all of the client-facing state
200
+ * setter methods has proven… interesting philosophically. But nothing
201
+ * downstream has availed itself of that philosophy, and otherwise it's not
202
+ * particularly pragmatic or ergonomic (internally or for clients alike).
203
+ *
204
+ * Since this class is (currently) engine-internal, this seems like an
205
+ * excellent place to start a discussion around what we want longer term for
206
+ * state setter signatures in _client-facing_ APIs. As a first pass, it seems
207
+ * reasonable to borrow the idiomatic convention of returning the effective
208
+ * value assigned by the setter.
209
+ *
210
+ * @see
211
+ * {@link https://github.com/getodk/web-forms/issues/45#issuecomment-1967932261 | Initial read interface design between engine and UI - design summary comment}
212
+ * (and some of the comments leading up to it) for background on the
213
+ * philosophical reasoning behind the existing signature convention.
214
+ */
215
+ setLanguage(language: FormLanguage): FormLanguage {
216
+ const availableFormLanguage = this.languages.find(
217
+ (formLanguage): formLanguage is FormLanguage => {
218
+ return (
219
+ formLanguage.isSyntheticDefault == null && formLanguage.language === language.language
220
+ );
221
+ }
222
+ );
223
+
224
+ if (availableFormLanguage == null) {
225
+ throw new Error(`Language "${language.language}" not available`);
226
+ }
227
+
228
+ this.evaluator.setActiveLanguage(availableFormLanguage.language);
229
+
230
+ return this.setActiveLanguage(availableFormLanguage);
231
+ }
232
+
233
+ // PrimaryInstanceDocument, ClientReactiveSubmittableInstance
234
+ prepareSubmission<ChunkedType extends SubmissionChunkedType = 'monolithic'>(
235
+ options?: SubmissionOptions<ChunkedType>
236
+ ): Promise<SubmissionResult<ChunkedType>> {
237
+ const result = prepareSubmission(this, {
238
+ chunked: (options?.chunked ?? 'monolithic') as ChunkedType,
239
+ maxSize: options?.maxSize ?? Infinity,
240
+ });
241
+
242
+ return Promise.resolve(result);
243
+ }
244
+ }
@@ -1,11 +1,18 @@
1
- import type { XFormsXPathEvaluator } from '@getodk/xpath';
2
- import type { Accessor, Signal } from 'solid-js';
3
- import { createSignal } from 'solid-js';
4
- import type { XFormDOM } from '../XFormDOM.ts';
5
- import type { BodyClassList } from '../body/BodyDefinition.ts';
1
+ import { XPathNodeKindKey } from '@getodk/xpath';
2
+ import type { Accessor } from 'solid-js';
6
3
  import type { ActiveLanguage, FormLanguage, FormLanguages } from '../client/FormLanguage.ts';
4
+ import type { FormNodeID } from '../client/identity.ts';
7
5
  import type { RootNode } from '../client/RootNode.ts';
6
+ import type { SubmissionDefinition } from '../client/submission/SubmissionDefinition.ts';
7
+ import type {
8
+ SubmissionChunkedType,
9
+ SubmissionOptions,
10
+ } from '../client/submission/SubmissionOptions.ts';
11
+ import type { SubmissionResult } from '../client/submission/SubmissionResult.ts';
12
+ import type { SubmissionState } from '../client/submission/SubmissionState.ts';
8
13
  import type { AncestorNodeValidationState } from '../client/validation.ts';
14
+ import type { XFormsXPathElement } from '../integration/xpath/adapter/XFormsXPathNode.ts';
15
+ import { createParentNodeSubmissionState } from '../lib/client-reactivity/submission/createParentNodeSubmissionState.ts';
9
16
  import type { ChildrenState } from '../lib/reactivity/createChildrenState.ts';
10
17
  import { createChildrenState } from '../lib/reactivity/createChildrenState.ts';
11
18
  import type { MaterializedChildren } from '../lib/reactivity/materializeCurrentStateChildren.ts';
@@ -15,146 +22,89 @@ import type { EngineState } from '../lib/reactivity/node-state/createEngineState
15
22
  import type { SharedNodeState } from '../lib/reactivity/node-state/createSharedNodeState.ts';
16
23
  import { createSharedNodeState } from '../lib/reactivity/node-state/createSharedNodeState.ts';
17
24
  import { createAggregatedViolations } from '../lib/reactivity/validation/createAggregatedViolations.ts';
18
- import type { RootDefinition } from '../model/RootDefinition.ts';
19
- import { InstanceNode } from './abstract/InstanceNode.ts';
25
+ import type { BodyClassList } from '../parse/body/BodyDefinition.ts';
26
+ import type { RootDefinition } from '../parse/model/RootDefinition.ts';
27
+ import { DescendantNode } from './abstract/DescendantNode.ts';
20
28
  import { buildChildren } from './children.ts';
21
29
  import type { GeneralChildNode } from './hierarchy.ts';
22
- import type { NodeID } from './identity.ts';
23
- import type { EvaluationContext, EvaluationContextRoot } from './internal-api/EvaluationContext.ts';
24
- import type { InstanceConfig } from './internal-api/InstanceConfig.ts';
25
- import type { SubscribableDependency } from './internal-api/SubscribableDependency.ts';
30
+ import type { EvaluationContext } from './internal-api/EvaluationContext.ts';
31
+ import type { ClientReactiveSubmittableParentNode } from './internal-api/submission/ClientReactiveSubmittableParentNode.ts';
26
32
  import type { TranslationContext } from './internal-api/TranslationContext.ts';
33
+ import type { PrimaryInstance } from './PrimaryInstance.ts';
27
34
 
28
35
  interface RootStateSpec {
29
- readonly reference: string;
30
- readonly readonly: boolean;
31
- readonly relevant: boolean;
32
- readonly required: boolean;
36
+ readonly reference: Accessor<string>;
37
+ readonly readonly: Accessor<boolean>;
38
+ readonly relevant: Accessor<boolean>;
39
+ readonly required: Accessor<boolean>;
33
40
  readonly label: null;
34
41
  readonly hint: null;
35
- readonly children: Accessor<readonly NodeID[]>;
42
+ readonly children: Accessor<readonly FormNodeID[]>;
36
43
  readonly valueOptions: null;
37
44
  readonly value: null;
38
45
 
39
46
  // Root-specific
40
- readonly activeLanguage: Signal<ActiveLanguage>;
47
+ readonly activeLanguage: Accessor<ActiveLanguage>;
41
48
  }
42
49
 
43
- // Subset of types expected from evaluator
44
- interface ItextTranslations {
45
- getActiveLanguage(): string | null;
46
- getLanguages(): readonly string[];
47
- }
48
-
49
- interface InitialLanguageState {
50
- readonly defaultLanguage: ActiveLanguage;
51
- readonly languages: FormLanguages;
52
- }
53
-
54
- // TODO: it's really very silly that the XPath evaluator is the current
55
- // definitional source of truth for translation stuff... even though it currently makes sense that that's where it's first derived.
56
- const getInitialLanguageState = (translations: ItextTranslations): InitialLanguageState => {
57
- const activeLanguageName = translations.getActiveLanguage();
58
-
59
- if (activeLanguageName == null) {
60
- const defaultLanguage: ActiveLanguage = {
61
- isSyntheticDefault: true,
62
- language: '',
63
- };
64
- const languages = [defaultLanguage] satisfies FormLanguages;
65
-
66
- return {
67
- defaultLanguage,
68
- languages,
69
- };
70
- }
71
-
72
- const languageNames = translations.getLanguages();
73
-
74
- const inactiveLanguages = languageNames
75
- .filter((languageName) => {
76
- return languageName !== activeLanguageName;
77
- })
78
- .map((language): FormLanguage => {
79
- return { language };
80
- });
81
-
82
- const languages = [
83
- { language: activeLanguageName } satisfies FormLanguage,
84
-
85
- ...inactiveLanguages,
86
- ] satisfies FormLanguages;
87
- const [defaultLanguage] = languages;
88
-
89
- return {
90
- defaultLanguage,
91
- languages,
92
- };
93
- };
94
-
95
50
  export class Root
96
- extends InstanceNode<RootDefinition, RootStateSpec, GeneralChildNode>
51
+ extends DescendantNode<RootDefinition, RootStateSpec, PrimaryInstance, GeneralChildNode>
97
52
  implements
98
53
  RootNode,
54
+ XFormsXPathElement,
99
55
  EvaluationContext,
100
- EvaluationContextRoot,
101
- SubscribableDependency,
102
- TranslationContext
56
+ TranslationContext,
57
+ ClientReactiveSubmittableParentNode<GeneralChildNode>
103
58
  {
104
59
  private readonly childrenState: ChildrenState<GeneralChildNode>;
105
60
 
106
- // InstanceNode
107
- readonly hasReadonlyAncestor = () => false;
108
- readonly isReadonly = () => false;
109
- readonly hasNonRelevantAncestor = () => false;
110
- readonly isRelevant = () => true;
61
+ // XFormsXPathElement
62
+ override readonly [XPathNodeKindKey] = 'element';
63
+
64
+ // DescendantNode
111
65
  protected readonly state: SharedNodeState<RootStateSpec>;
112
66
  protected readonly engineState: EngineState<RootStateSpec>;
113
67
 
68
+ override readonly hasReadonlyAncestor = () => false;
69
+ override readonly isSelfReadonly = () => false;
70
+ override readonly isReadonly = () => false;
71
+ override readonly hasNonRelevantAncestor = () => false;
72
+ override readonly isSelfRelevant = () => true;
73
+ override readonly isRelevant = () => true;
74
+ override readonly isRequired = () => false;
75
+
114
76
  // RootNode
115
77
  readonly nodeType = 'root';
116
78
  readonly appearances = null;
117
79
  readonly classes: BodyClassList;
118
80
  readonly currentState: MaterializedChildren<CurrentState<RootStateSpec>, GeneralChildNode>;
119
81
  readonly validationState: AncestorNodeValidationState;
82
+ readonly submissionState: SubmissionState;
120
83
 
121
- protected readonly instanceDOM: XFormDOM;
122
-
123
- // BaseNode
124
- readonly root = this;
125
-
126
- // EvaluationContext
127
- readonly evaluator: XFormsXPathEvaluator;
128
-
129
- readonly contextNode: Element;
84
+ // ClientReactiveSubmittableInstance
85
+ get submissionDefinition(): SubmissionDefinition {
86
+ return this.definition.submission;
87
+ }
130
88
 
131
89
  // RootNode
132
- override readonly parent = null;
133
-
134
90
  readonly languages: FormLanguages;
135
91
 
136
- // TranslationContext
137
- get activeLanguage(): ActiveLanguage {
138
- return this.engineState.activeLanguage;
139
- }
140
-
141
- constructor(xformDOM: XFormDOM, definition: RootDefinition, engineConfig: InstanceConfig) {
142
- const reference = definition.nodeset;
92
+ constructor(parent: PrimaryInstance) {
93
+ const { definition } = parent;
94
+ const { nodeset: reference } = definition;
95
+ const computeReference: Accessor<string> = () => reference;
143
96
 
144
- super(engineConfig, null, definition, {
145
- computeReference: () => reference,
97
+ super(parent, definition, {
98
+ computeReference,
146
99
  });
147
100
 
148
- this.classes = definition.classes;
101
+ this.classes = parent.classes;
149
102
 
150
103
  const childrenState = createChildrenState<Root, GeneralChildNode>(this);
151
104
 
152
105
  this.childrenState = childrenState;
106
+ this.languages = parent.languages;
153
107
 
154
- const instanceDOM = xformDOM.createInstance();
155
- const evaluator = instanceDOM.primaryInstanceEvaluator;
156
- const { translations } = evaluator;
157
- const { defaultLanguage, languages } = getInitialLanguageState(translations);
158
108
  const sharedStateOptions = {
159
109
  clientStateFactory: this.engineConfig.stateFactory,
160
110
  };
@@ -162,13 +112,13 @@ export class Root
162
112
  const state = createSharedNodeState(
163
113
  this.scope,
164
114
  {
165
- activeLanguage: createSignal<ActiveLanguage>(defaultLanguage),
166
- reference,
115
+ activeLanguage: parent.getActiveLanguage,
116
+ reference: computeReference,
167
117
  label: null,
168
118
  hint: null,
169
- readonly: false,
170
- relevant: true,
171
- required: false,
119
+ readonly: () => false,
120
+ relevant: () => true,
121
+ required: () => false,
172
122
  valueOptions: null,
173
123
  value: null,
174
124
  children: childrenState.childIds,
@@ -184,17 +134,9 @@ export class Root
184
134
  childrenState
185
135
  );
186
136
 
187
- const contextNode = instanceDOM.xformDocument.createElement(definition.nodeName);
188
-
189
- instanceDOM.primaryInstanceRoot.replaceWith(contextNode);
190
-
191
- this.evaluator = evaluator;
192
- this.contextNode = contextNode;
193
- this.instanceDOM = instanceDOM;
194
- this.languages = languages;
195
-
196
137
  childrenState.setChildren(buildChildren(this));
197
138
  this.validationState = createAggregatedViolations(this, sharedStateOptions);
139
+ this.submissionState = createParentNodeSubmissionState(this);
198
140
  }
199
141
 
200
142
  getChildren(): readonly GeneralChildNode[] {
@@ -203,24 +145,14 @@ export class Root
203
145
 
204
146
  // RootNode
205
147
  setLanguage(language: FormLanguage): Root {
206
- const activeLanguage = this.languages.find((formLanguage) => {
207
- return formLanguage.language === language.language;
208
- });
209
-
210
- if (activeLanguage == null) {
211
- throw new Error(`Language "${language.language}" not available`);
212
- }
213
-
214
- this.evaluator.translations.setActiveLanguage(activeLanguage.language);
215
- this.state.setProperty('activeLanguage', activeLanguage);
148
+ this.rootDocument.setLanguage(language);
216
149
 
217
150
  return this;
218
151
  }
219
152
 
220
- // SubscribableDependency
221
- override subscribe(): void {
222
- super.subscribe();
223
-
224
- this.engineState.activeLanguage;
153
+ prepareSubmission<ChunkedType extends SubmissionChunkedType = 'monolithic'>(
154
+ options?: SubmissionOptions<ChunkedType>
155
+ ): Promise<SubmissionResult<ChunkedType>> {
156
+ return this.rootDocument.prepareSubmission(options);
225
157
  }
226
158
  }