@getodk/xforms-engine 0.6.0 → 0.8.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 (332) hide show
  1. package/dist/client/BaseNode.d.ts +4 -4
  2. package/dist/client/BaseValueNode.d.ts +7 -3
  3. package/dist/client/RootNode.d.ts +20 -16
  4. package/dist/client/UploadNode.d.ts +53 -0
  5. package/dist/client/attachments/InstanceAttachmentMeta.d.ts +8 -0
  6. package/dist/client/attachments/InstanceAttachmentsConfig.d.ts +8 -0
  7. package/dist/client/constants.d.ts +11 -12
  8. package/dist/client/form/CreateFormInstance.d.ts +14 -0
  9. package/dist/client/form/EditFormInstance.d.ts +62 -0
  10. package/dist/client/form/FormInstance.d.ts +104 -0
  11. package/dist/client/form/FormInstanceConfig.d.ts +19 -0
  12. package/dist/client/form/FormResource.d.ts +1 -0
  13. package/dist/client/form/LoadForm.d.ts +79 -0
  14. package/dist/client/form/LoadFormResult.d.ts +67 -0
  15. package/dist/client/form/RestoreFormInstance.d.ts +8 -0
  16. package/dist/client/hierarchy.d.ts +4 -5
  17. package/dist/client/index.d.ts +40 -11
  18. package/dist/client/node-types.d.ts +2 -3
  19. package/dist/client/repeat/BaseRepeatRangeNode.d.ts +3 -4
  20. package/dist/client/repeat/RepeatInstanceNode.d.ts +4 -5
  21. package/dist/client/repeat/RepeatRangeControlledNode.d.ts +2 -2
  22. package/dist/client/repeat/RepeatRangeUncontrolledNode.d.ts +2 -2
  23. package/dist/client/resources.d.ts +1 -1
  24. package/dist/client/serialization/InstanceData.d.ts +14 -0
  25. package/dist/client/serialization/InstanceFile.d.ts +6 -0
  26. package/dist/client/serialization/InstancePayload.d.ts +93 -0
  27. package/dist/client/serialization/InstancePayloadOptions.d.ts +24 -0
  28. package/dist/client/serialization/InstanceState.d.ts +12 -0
  29. package/dist/client/submission/{SubmissionDefinition.d.ts → SubmissionMeta.d.ts} +1 -1
  30. package/dist/entrypoints/FormInstance.d.ts +20 -0
  31. package/dist/entrypoints/FormResult/BaseFormResult.d.ts +22 -0
  32. package/dist/entrypoints/FormResult/BaseInstantiableFormResult.d.ts +25 -0
  33. package/dist/entrypoints/FormResult/FormFailureResult.d.ts +17 -0
  34. package/dist/entrypoints/FormResult/FormSuccessResult.d.ts +15 -0
  35. package/dist/entrypoints/FormResult/FormWarningResult.d.ts +15 -0
  36. package/dist/entrypoints/createInstance.d.ts +9 -0
  37. package/dist/entrypoints/editInstance.d.ts +9 -0
  38. package/dist/entrypoints/index.d.ts +4 -0
  39. package/dist/entrypoints/loadForm.d.ts +4 -0
  40. package/dist/entrypoints/restoreInstance.d.ts +9 -0
  41. package/dist/error/LoadFormFailureError.d.ts +9 -0
  42. package/dist/error/MalformedInstanceDataError.d.ts +3 -0
  43. package/dist/error/TemplatedNodeAttributeSerializationError.d.ts +22 -0
  44. package/dist/error/UploadValueTypeError.d.ts +8 -0
  45. package/dist/index.d.ts +2 -33
  46. package/dist/index.js +8280 -6779
  47. package/dist/index.js.map +1 -1
  48. package/dist/instance/Group.d.ts +6 -5
  49. package/dist/instance/InputControl.d.ts +5 -4
  50. package/dist/instance/ModelValue.d.ts +5 -4
  51. package/dist/instance/Note.d.ts +4 -3
  52. package/dist/instance/PrimaryInstance.d.ts +34 -8
  53. package/dist/instance/RangeControl.d.ts +5 -4
  54. package/dist/instance/RankControl.d.ts +6 -5
  55. package/dist/instance/Root.d.ts +7 -9
  56. package/dist/instance/SelectControl.d.ts +4 -3
  57. package/dist/instance/Subtree.d.ts +6 -5
  58. package/dist/instance/TriggerControl.d.ts +4 -3
  59. package/dist/instance/UploadControl.d.ts +58 -0
  60. package/dist/instance/abstract/DescendantNode.d.ts +10 -1
  61. package/dist/instance/abstract/InstanceNode.d.ts +7 -4
  62. package/dist/instance/abstract/ValueNode.d.ts +7 -5
  63. package/dist/instance/attachments/InstanceAttachment.d.ts +42 -0
  64. package/dist/instance/attachments/InstanceAttachmentsState.d.ts +9 -0
  65. package/dist/instance/children/DescendantNodeInitOptions.d.ts +32 -0
  66. package/dist/instance/{children.d.ts → children/buildChildren.d.ts} +1 -1
  67. package/dist/instance/children/childrenInitOptions.d.ts +9 -0
  68. package/dist/instance/children/normalizeChildInitOptions.d.ts +2 -0
  69. package/dist/instance/hierarchy.d.ts +6 -7
  70. package/dist/instance/input/InitialInstanceState.d.ts +13 -0
  71. package/dist/instance/input/InstanceAttachmentMap.d.ts +19 -0
  72. package/dist/instance/internal-api/InstanceAttachmentContext.d.ts +19 -0
  73. package/dist/instance/internal-api/InstanceConfig.d.ts +4 -9
  74. package/dist/instance/internal-api/InstanceValueContext.d.ts +8 -1
  75. package/dist/instance/internal-api/serialization/ClientReactiveSerializableInstance.d.ts +16 -0
  76. package/dist/instance/internal-api/serialization/ClientReactiveSerializableLeafNode.d.ts +32 -0
  77. package/dist/instance/internal-api/serialization/ClientReactiveSerializableParentNode.d.ts +18 -0
  78. package/dist/instance/internal-api/serialization/ClientReactiveSerializableTemplatedNode.d.ts +13 -0
  79. package/dist/instance/internal-api/serialization/ClientReactiveSerializableValueNode.d.ts +21 -0
  80. package/dist/instance/repeat/BaseRepeatRange.d.ts +10 -8
  81. package/dist/instance/repeat/RepeatInstance.d.ts +10 -7
  82. package/dist/instance/repeat/RepeatRangeControlled.d.ts +27 -3
  83. package/dist/instance/repeat/RepeatRangeUncontrolled.d.ts +4 -3
  84. package/dist/instance/resource.d.ts +5 -1
  85. package/dist/integration/xpath/EngineXPathEvaluator.d.ts +2 -2
  86. package/dist/integration/xpath/adapter/kind.d.ts +4 -10
  87. package/dist/integration/xpath/static-dom/StaticAttribute.d.ts +4 -5
  88. package/dist/integration/xpath/static-dom/StaticDocument.d.ts +13 -10
  89. package/dist/integration/xpath/static-dom/StaticElement.d.ts +21 -22
  90. package/dist/integration/xpath/static-dom/StaticNode.d.ts +1 -1
  91. package/dist/integration/xpath/static-dom/StaticParentNode.d.ts +13 -0
  92. package/dist/integration/xpath/static-dom/staticNodeName.d.ts +3 -0
  93. package/dist/lib/client-reactivity/instance-state/createNodeRangeInstanceState.d.ts +4 -0
  94. package/dist/lib/client-reactivity/instance-state/createParentNodeInstanceState.d.ts +4 -0
  95. package/dist/lib/client-reactivity/instance-state/createPrimaryInstanceState.d.ts +3 -0
  96. package/dist/lib/client-reactivity/instance-state/createRootInstanceState.d.ts +3 -0
  97. package/dist/lib/client-reactivity/instance-state/createTemplatedNodeInstanceState.d.ts +6 -0
  98. package/dist/lib/client-reactivity/instance-state/createValueNodeInstanceState.d.ts +3 -0
  99. package/dist/lib/client-reactivity/instance-state/prepareInstancePayload.d.ts +8 -0
  100. package/dist/lib/names/UnprefixedXFormsName.d.ts +4 -0
  101. package/dist/lib/reactivity/createInstanceAttachment.d.ts +8 -0
  102. package/dist/lib/reactivity/createInstanceValueState.d.ts +2 -27
  103. package/dist/lib/resource-helpers.d.ts +2 -0
  104. package/dist/parse/XFormDOM.d.ts +1 -1
  105. package/dist/parse/body/BodyDefinition.d.ts +2 -1
  106. package/dist/parse/body/control/UploadControlDefinition.d.ts +2 -0
  107. package/dist/parse/model/BindDefinition.d.ts +1 -1
  108. package/dist/parse/model/BindTypeDefinition.d.ts +2 -7
  109. package/dist/parse/model/ItextTranslationsDefinition.d.ts +18 -0
  110. package/dist/parse/model/LeafNodeDefinition.d.ts +4 -5
  111. package/dist/parse/model/ModelBindMap.d.ts +1 -1
  112. package/dist/parse/model/ModelDefinition.d.ts +9 -2
  113. package/dist/parse/model/NodeDefinition.d.ts +18 -30
  114. package/dist/parse/model/NoteNodeDefinition.d.ts +3 -2
  115. package/dist/parse/model/RangeNodeDefinition.d.ts +2 -1
  116. package/dist/parse/model/RepeatDefinition.d.ts +62 -0
  117. package/dist/parse/model/RootAttributeDefinition.d.ts +1 -4
  118. package/dist/parse/model/RootAttributeMap.d.ts +2 -1
  119. package/dist/parse/model/RootDefinition.d.ts +7 -8
  120. package/dist/parse/model/SecondaryInstance/SecondaryInstancesDefinition.d.ts +15 -2
  121. package/dist/parse/model/SecondaryInstance/assertSecondaryInstanceDefinition.d.ts +5 -0
  122. package/dist/parse/model/SecondaryInstance/defineSecondaryInstance.d.ts +5 -0
  123. package/dist/parse/model/SecondaryInstance/sources/BlankSecondaryInstanceSource.d.ts +1 -7
  124. package/dist/parse/model/SecondaryInstance/sources/CSVExternalSecondaryInstance.d.ts +1 -1
  125. package/dist/parse/model/SecondaryInstance/sources/GeoJSONExternalSecondaryInstance.d.ts +1 -1
  126. package/dist/parse/model/SecondaryInstance/sources/InternalSecondaryInstanceSource.d.ts +1 -1
  127. package/dist/parse/model/SecondaryInstance/sources/SecondaryInstanceSource.d.ts +1 -1
  128. package/dist/parse/model/SecondaryInstance/sources/XMLExternalSecondaryInstanceSource.d.ts +1 -1
  129. package/dist/parse/model/{FormSubmissionDefinition.d.ts → SubmissionDefinition.d.ts} +2 -2
  130. package/dist/parse/model/SubtreeDefinition.d.ts +4 -5
  131. package/dist/parse/model/nodeDefinitionMap.d.ts +5 -0
  132. package/dist/parse/shared/parseInstanceXML.d.ts +21 -0
  133. package/dist/parse/shared/parseStaticDocumentFromDOMSubtree.d.ts +4 -21
  134. package/dist/solid.js +8251 -6751
  135. package/dist/solid.js.map +1 -1
  136. package/package.json +15 -14
  137. package/src/client/BaseNode.ts +4 -4
  138. package/src/client/BaseValueNode.ts +7 -3
  139. package/src/client/RootNode.ts +32 -19
  140. package/src/client/UploadNode.ts +78 -0
  141. package/src/client/attachments/InstanceAttachmentMeta.ts +10 -0
  142. package/src/client/attachments/InstanceAttachmentsConfig.ts +13 -0
  143. package/src/client/constants.ts +12 -14
  144. package/src/client/form/CreateFormInstance.ts +19 -0
  145. package/src/client/form/EditFormInstance.ts +93 -0
  146. package/src/client/form/FormInstance.ts +114 -0
  147. package/src/client/form/FormInstanceConfig.ts +21 -0
  148. package/src/client/form/FormResource.ts +1 -0
  149. package/src/client/form/LoadForm.ts +92 -0
  150. package/src/client/form/LoadFormResult.ts +103 -0
  151. package/src/client/form/RestoreFormInstance.ts +14 -0
  152. package/src/client/hierarchy.ts +5 -8
  153. package/src/client/index.ts +49 -29
  154. package/src/client/node-types.ts +3 -8
  155. package/src/client/repeat/BaseRepeatRangeNode.ts +3 -4
  156. package/src/client/repeat/RepeatInstanceNode.ts +4 -8
  157. package/src/client/repeat/RepeatRangeControlledNode.ts +2 -2
  158. package/src/client/repeat/RepeatRangeUncontrolledNode.ts +2 -2
  159. package/src/client/resources.ts +2 -2
  160. package/src/client/serialization/InstanceData.ts +24 -0
  161. package/src/client/serialization/InstanceFile.ts +9 -0
  162. package/src/client/serialization/InstancePayload.ts +126 -0
  163. package/src/client/serialization/InstancePayloadOptions.ts +29 -0
  164. package/src/client/serialization/InstanceState.ts +14 -0
  165. package/src/client/submission/{SubmissionDefinition.ts → SubmissionMeta.ts} +1 -1
  166. package/src/entrypoints/FormInstance.ts +56 -0
  167. package/src/entrypoints/FormResult/BaseFormResult.ts +40 -0
  168. package/src/entrypoints/FormResult/BaseInstantiableFormResult.ts +109 -0
  169. package/src/entrypoints/FormResult/FormFailureResult.ts +44 -0
  170. package/src/entrypoints/FormResult/FormSuccessResult.ts +25 -0
  171. package/src/entrypoints/FormResult/FormWarningResult.ts +25 -0
  172. package/src/entrypoints/createInstance.ts +23 -0
  173. package/src/entrypoints/editInstance.ts +24 -0
  174. package/src/entrypoints/index.ts +4 -0
  175. package/src/entrypoints/loadForm.ts +154 -0
  176. package/src/entrypoints/restoreInstance.ts +27 -0
  177. package/src/error/LoadFormFailureError.ts +114 -0
  178. package/src/error/MalformedInstanceDataError.ts +3 -0
  179. package/src/error/TemplatedNodeAttributeSerializationError.ts +24 -0
  180. package/src/error/UploadValueTypeError.ts +13 -0
  181. package/src/index.ts +2 -46
  182. package/src/instance/Group.ts +16 -15
  183. package/src/instance/InputControl.ts +17 -11
  184. package/src/instance/ModelValue.ts +17 -11
  185. package/src/instance/Note.ts +10 -9
  186. package/src/instance/PrimaryInstance.ts +68 -31
  187. package/src/instance/RangeControl.ts +17 -11
  188. package/src/instance/RankControl.ts +28 -19
  189. package/src/instance/Root.ts +20 -31
  190. package/src/instance/SelectControl.ts +21 -12
  191. package/src/instance/Subtree.ts +16 -15
  192. package/src/instance/TriggerControl.ts +21 -12
  193. package/src/instance/UploadControl.ts +184 -0
  194. package/src/instance/abstract/DescendantNode.ts +12 -2
  195. package/src/instance/abstract/InstanceNode.ts +9 -5
  196. package/src/instance/abstract/ValueNode.ts +11 -13
  197. package/src/instance/attachments/InstanceAttachment.ts +69 -0
  198. package/src/instance/attachments/InstanceAttachmentsState.ts +18 -0
  199. package/src/instance/children/DescendantNodeInitOptions.ts +35 -0
  200. package/src/instance/{children.ts → children/buildChildren.ts} +57 -53
  201. package/src/instance/children/childrenInitOptions.ts +117 -0
  202. package/src/instance/children/normalizeChildInitOptions.ts +332 -0
  203. package/src/instance/hierarchy.ts +6 -9
  204. package/src/instance/input/InitialInstanceState.ts +108 -0
  205. package/src/instance/input/InstanceAttachmentMap.ts +154 -0
  206. package/src/instance/internal-api/InstanceAttachmentContext.ts +20 -0
  207. package/src/instance/internal-api/InstanceConfig.ts +6 -10
  208. package/src/instance/internal-api/InstanceValueContext.ts +9 -1
  209. package/src/instance/internal-api/serialization/ClientReactiveSerializableInstance.ts +22 -0
  210. package/src/instance/internal-api/serialization/ClientReactiveSerializableLeafNode.ts +43 -0
  211. package/src/instance/internal-api/serialization/ClientReactiveSerializableParentNode.ts +26 -0
  212. package/src/instance/internal-api/serialization/ClientReactiveSerializableTemplatedNode.ts +24 -0
  213. package/src/instance/internal-api/serialization/ClientReactiveSerializableValueNode.ts +28 -0
  214. package/src/instance/repeat/BaseRepeatRange.ts +19 -24
  215. package/src/instance/repeat/RepeatInstance.ts +26 -19
  216. package/src/instance/repeat/RepeatRangeControlled.ts +90 -17
  217. package/src/instance/repeat/RepeatRangeUncontrolled.ts +10 -9
  218. package/src/instance/resource.ts +14 -1
  219. package/src/integration/xpath/EngineXPathEvaluator.ts +2 -2
  220. package/src/integration/xpath/adapter/kind.ts +1 -28
  221. package/src/integration/xpath/adapter/traversal.ts +2 -2
  222. package/src/integration/xpath/static-dom/StaticAttribute.ts +6 -5
  223. package/src/integration/xpath/static-dom/StaticDocument.ts +17 -16
  224. package/src/integration/xpath/static-dom/StaticElement.ts +196 -50
  225. package/src/integration/xpath/static-dom/StaticNode.ts +1 -1
  226. package/src/integration/xpath/static-dom/StaticParentNode.ts +22 -0
  227. package/src/integration/xpath/static-dom/staticNodeName.ts +20 -0
  228. package/src/lib/client-reactivity/instance-state/createNodeRangeInstanceState.ts +17 -0
  229. package/src/lib/client-reactivity/instance-state/createParentNodeInstanceState.ts +22 -0
  230. package/src/lib/client-reactivity/instance-state/createPrimaryInstanceState.ts +12 -0
  231. package/src/lib/client-reactivity/{submission/createRootSubmissionState.ts → instance-state/createRootInstanceState.ts} +4 -4
  232. package/src/lib/client-reactivity/instance-state/createTemplatedNodeInstanceState.ts +31 -0
  233. package/src/lib/client-reactivity/instance-state/createValueNodeInstanceState.ts +21 -0
  234. package/src/lib/client-reactivity/instance-state/prepareInstancePayload.ts +237 -0
  235. package/src/lib/names/UnprefixedXFormsName.ts +12 -0
  236. package/src/lib/reactivity/createInstanceAttachment.ts +212 -0
  237. package/src/lib/reactivity/createInstanceValueState.ts +27 -51
  238. package/src/lib/resource-helpers.ts +33 -0
  239. package/src/parse/XFormDOM.ts +1 -3
  240. package/src/parse/body/BodyDefinition.ts +4 -0
  241. package/src/parse/body/control/UploadControlDefinition.ts +42 -0
  242. package/src/parse/model/BindDefinition.ts +1 -1
  243. package/src/parse/model/BindTypeDefinition.ts +68 -26
  244. package/src/parse/model/ItextTranslationsDefinition.ts +79 -0
  245. package/src/parse/model/LeafNodeDefinition.ts +3 -5
  246. package/src/parse/model/ModelBindMap.ts +0 -5
  247. package/src/parse/model/ModelDefinition.ts +36 -3
  248. package/src/parse/model/NodeDefinition.ts +19 -45
  249. package/src/parse/model/NoteNodeDefinition.ts +4 -3
  250. package/src/parse/model/RangeNodeDefinition.ts +3 -2
  251. package/src/parse/model/RepeatDefinition.ts +382 -0
  252. package/src/parse/model/RootAttributeDefinition.ts +6 -7
  253. package/src/parse/model/RootAttributeMap.ts +15 -10
  254. package/src/parse/model/RootDefinition.ts +17 -19
  255. package/src/parse/model/SecondaryInstance/SecondaryInstancesDefinition.ts +23 -2
  256. package/src/parse/model/SecondaryInstance/assertSecondaryInstanceDefinition.ts +14 -0
  257. package/src/parse/model/SecondaryInstance/defineSecondaryInstance.ts +32 -0
  258. package/src/parse/model/SecondaryInstance/sources/BlankSecondaryInstanceSource.ts +3 -24
  259. package/src/parse/model/SecondaryInstance/sources/CSVExternalSecondaryInstance.ts +33 -86
  260. package/src/parse/model/SecondaryInstance/sources/ExternalSecondaryInstanceResource.ts +1 -30
  261. package/src/parse/model/SecondaryInstance/sources/GeoJSONExternalSecondaryInstance.ts +64 -137
  262. package/src/parse/model/SecondaryInstance/sources/InternalSecondaryInstanceSource.ts +9 -7
  263. package/src/parse/model/SecondaryInstance/sources/SecondaryInstanceSource.ts +1 -1
  264. package/src/parse/model/SecondaryInstance/sources/XMLExternalSecondaryInstanceSource.ts +7 -7
  265. package/src/parse/model/{FormSubmissionDefinition.ts → SubmissionDefinition.ts} +2 -2
  266. package/src/parse/model/SubtreeDefinition.ts +4 -5
  267. package/src/parse/model/nodeDefinitionMap.ts +34 -0
  268. package/src/parse/shared/parseInstanceXML.ts +79 -0
  269. package/src/parse/shared/parseStaticDocumentFromDOMSubtree.ts +45 -130
  270. package/dist/client/EngineConfig.d.ts +0 -79
  271. package/dist/client/submission/SubmissionData.d.ts +0 -7
  272. package/dist/client/submission/SubmissionInstanceFile.d.ts +0 -6
  273. package/dist/client/submission/SubmissionOptions.d.ts +0 -23
  274. package/dist/client/submission/SubmissionResult.d.ts +0 -91
  275. package/dist/client/submission/SubmissionState.d.ts +0 -12
  276. package/dist/client/unsupported/UnsupportedControlNode.d.ts +0 -30
  277. package/dist/client/unsupported/UploadNode.d.ts +0 -9
  278. package/dist/instance/abstract/UnsupportedControl.d.ts +0 -54
  279. package/dist/instance/index.d.ts +0 -8
  280. package/dist/instance/internal-api/ValueContext.d.ts +0 -23
  281. package/dist/instance/internal-api/submission/ClientReactiveSubmittableInstance.d.ts +0 -14
  282. package/dist/instance/internal-api/submission/ClientReactiveSubmittableLeafNode.d.ts +0 -32
  283. package/dist/instance/internal-api/submission/ClientReactiveSubmittableParentNode.d.ts +0 -19
  284. package/dist/instance/internal-api/submission/ClientReactiveSubmittableValueNode.d.ts +0 -18
  285. package/dist/instance/unsupported/UploadControl.d.ts +0 -6
  286. package/dist/lib/client-reactivity/submission/createInstanceSubmissionState.d.ts +0 -3
  287. package/dist/lib/client-reactivity/submission/createLeafNodeSubmissionState.d.ts +0 -3
  288. package/dist/lib/client-reactivity/submission/createNodeRangeSubmissionState.d.ts +0 -4
  289. package/dist/lib/client-reactivity/submission/createParentNodeSubmissionState.d.ts +0 -4
  290. package/dist/lib/client-reactivity/submission/createRootSubmissionState.d.ts +0 -3
  291. package/dist/lib/client-reactivity/submission/createValueNodeSubmissionState.d.ts +0 -3
  292. package/dist/lib/client-reactivity/submission/prepareSubmission.d.ts +0 -8
  293. package/dist/lib/reactivity/createValueState.d.ts +0 -40
  294. package/dist/parse/model/ItextTranslation/ItextTranslationDefinition.d.ts +0 -4
  295. package/dist/parse/model/ItextTranslation/ItextTranslationRootDefinition.d.ts +0 -9
  296. package/dist/parse/model/ItextTranslation/ItextTranslationsDefinition.d.ts +0 -8
  297. package/dist/parse/model/RepeatInstanceDefinition.d.ts +0 -17
  298. package/dist/parse/model/RepeatRangeDefinition.d.ts +0 -32
  299. package/dist/parse/model/RepeatTemplateDefinition.d.ts +0 -31
  300. package/dist/parse/model/SecondaryInstance/SecondaryInstanceDefinition.d.ts +0 -4
  301. package/dist/parse/model/SecondaryInstance/SecondaryInstanceRootDefinition.d.ts +0 -7
  302. package/src/client/EngineConfig.ts +0 -84
  303. package/src/client/submission/SubmissionData.ts +0 -12
  304. package/src/client/submission/SubmissionInstanceFile.ts +0 -9
  305. package/src/client/submission/SubmissionOptions.ts +0 -28
  306. package/src/client/submission/SubmissionResult.ts +0 -124
  307. package/src/client/submission/SubmissionState.ts +0 -14
  308. package/src/client/unsupported/UnsupportedControlNode.ts +0 -36
  309. package/src/client/unsupported/UploadNode.ts +0 -14
  310. package/src/instance/abstract/UnsupportedControl.ts +0 -175
  311. package/src/instance/index.ts +0 -55
  312. package/src/instance/internal-api/ValueContext.ts +0 -28
  313. package/src/instance/internal-api/submission/ClientReactiveSubmittableInstance.ts +0 -20
  314. package/src/instance/internal-api/submission/ClientReactiveSubmittableLeafNode.ts +0 -43
  315. package/src/instance/internal-api/submission/ClientReactiveSubmittableParentNode.ts +0 -26
  316. package/src/instance/internal-api/submission/ClientReactiveSubmittableValueNode.ts +0 -24
  317. package/src/instance/unsupported/UploadControl.ts +0 -9
  318. package/src/lib/client-reactivity/submission/createInstanceSubmissionState.ts +0 -12
  319. package/src/lib/client-reactivity/submission/createLeafNodeSubmissionState.ts +0 -20
  320. package/src/lib/client-reactivity/submission/createNodeRangeSubmissionState.ts +0 -17
  321. package/src/lib/client-reactivity/submission/createParentNodeSubmissionState.ts +0 -22
  322. package/src/lib/client-reactivity/submission/createValueNodeSubmissionState.ts +0 -21
  323. package/src/lib/client-reactivity/submission/prepareSubmission.ts +0 -172
  324. package/src/lib/reactivity/createValueState.ts +0 -200
  325. package/src/parse/model/ItextTranslation/ItextTranslationDefinition.ts +0 -4
  326. package/src/parse/model/ItextTranslation/ItextTranslationRootDefinition.ts +0 -42
  327. package/src/parse/model/ItextTranslation/ItextTranslationsDefinition.ts +0 -31
  328. package/src/parse/model/RepeatInstanceDefinition.ts +0 -38
  329. package/src/parse/model/RepeatRangeDefinition.ts +0 -98
  330. package/src/parse/model/RepeatTemplateDefinition.ts +0 -149
  331. package/src/parse/model/SecondaryInstance/SecondaryInstanceDefinition.ts +0 -4
  332. package/src/parse/model/SecondaryInstance/SecondaryInstanceRootDefinition.ts +0 -12
@@ -0,0 +1,382 @@
1
+ import { JAVAROSA_NAMESPACE_URI } from '@getodk/common/constants/xmlns.ts';
2
+ import type { XFORMS_KNOWN_ATTRIBUTE } from '@getodk/xpath';
3
+ import type { RepeatRange } from '../../instance/hierarchy.ts';
4
+ import type { PrimaryInstance } from '../../instance/PrimaryInstance.ts';
5
+ import type { RepeatInstance } from '../../instance/repeat/RepeatInstance.ts';
6
+ import type {
7
+ StaticAttribute,
8
+ StaticAttributeOptions,
9
+ } from '../../integration/xpath/static-dom/StaticAttribute.ts';
10
+ import { StaticDocument } from '../../integration/xpath/static-dom/StaticDocument.ts';
11
+ import type {
12
+ StaticElement,
13
+ StaticElementOptions,
14
+ } from '../../integration/xpath/static-dom/StaticElement.ts';
15
+ import type { StaticNode } from '../../integration/xpath/static-dom/StaticNode.ts';
16
+ import type { StaticText } from '../../integration/xpath/static-dom/StaticText.ts';
17
+ import { NamespaceDeclarationMap } from '../../lib/names/NamespaceDeclarationMap.ts';
18
+ import type { NamespaceURL } from '../../lib/names/NamespaceURL.ts';
19
+ import type { QualifiedName, QualifiedNameSource } from '../../lib/names/QualifiedName.ts';
20
+ import type { RepeatElementDefinition } from '../body/RepeatElementDefinition.ts';
21
+ import { RepeatCountControlExpression } from '../expression/RepeatCountControlExpression.ts';
22
+ import type { BindDefinition } from './BindDefinition.ts';
23
+ import { DescendentNodeDefinition } from './DescendentNodeDefinition.ts';
24
+ import type { ChildNodeDefinition, ParentNodeDefinition } from './NodeDefinition.ts';
25
+ import type { RootDefinition } from './RootDefinition.ts';
26
+ import type { SubtreeDefinition } from './SubtreeDefinition.ts';
27
+
28
+ interface JavaRosaNamespaceURI extends NamespaceURL {
29
+ readonly href: JAVAROSA_NAMESPACE_URI;
30
+ }
31
+
32
+ interface JRTemplateAttributeName extends QualifiedName {
33
+ readonly namespaceURI: JavaRosaNamespaceURI;
34
+ readonly localName: 'template';
35
+ }
36
+
37
+ const isJRTemplateAttributeName = (name: QualifiedNameSource) => {
38
+ if (name.localName !== 'template') {
39
+ return false;
40
+ }
41
+
42
+ const namespaceURI = (name.namespaceURI as NamespaceURL)?.href ?? name.namespaceURI;
43
+
44
+ return namespaceURI === JAVAROSA_NAMESPACE_URI;
45
+ };
46
+
47
+ interface JRTemplateAttribute extends StaticAttribute {
48
+ readonly qualifiedName: JRTemplateAttributeName;
49
+ }
50
+
51
+ const isJRTemplateAttribute = (attribute: StaticAttribute): attribute is JRTemplateAttribute => {
52
+ return isJRTemplateAttributeName(attribute.qualifiedName);
53
+ };
54
+
55
+ interface ExplicitRepeatTemplateElement extends StaticElement {
56
+ readonly [XFORMS_KNOWN_ATTRIBUTE]: 'template';
57
+
58
+ getAttributeValue(localName: 'template'): string;
59
+ getAttributeValue(localName: string): string | null;
60
+ }
61
+
62
+ /**
63
+ * Determines whether a model instance node is an **explicit** repeat template,
64
+ * as defined by the presence of a `jr:template` attribute on that node.
65
+ *
66
+ * @see {@link https://getodk.github.io/xforms-spec/#default-values-in-repeats}
67
+ */
68
+ const isExplicitRepeatTemplateElement = (
69
+ sourceElement: StaticElement
70
+ ): sourceElement is ExplicitRepeatTemplateElement => {
71
+ return sourceElement.attributes.some(isJRTemplateAttribute);
72
+ };
73
+
74
+ const cloneStaticAttributeOptions = (attribute: StaticAttribute): StaticAttributeOptions => {
75
+ return {
76
+ name: attribute.qualifiedName,
77
+ value: attribute.value,
78
+ };
79
+ };
80
+
81
+ interface ClonedSubtreeStructure extends StaticElementOptions {
82
+ readonly attributes: readonly StaticAttributeOptions[];
83
+ readonly children: readonly StaticElementOptions[];
84
+ }
85
+
86
+ const cloneStaticSubtreeStructure = (sourceElement: StaticElement): ClonedSubtreeStructure => {
87
+ const name = sourceElement.qualifiedName;
88
+ const attributes = sourceElement.attributes.map(cloneStaticAttributeOptions);
89
+ const children = sourceElement.childElements.map(cloneStaticSubtreeStructure);
90
+
91
+ return {
92
+ name,
93
+ attributes,
94
+ children,
95
+ };
96
+ };
97
+
98
+ /**
99
+ * Clones the **structure** of a {@link StaticElement}, omitting
100
+ * {@link StaticText | text values} of the element itself, and any of its
101
+ * descendants.
102
+ *
103
+ * @todo This function's behavior is **plausibly** general purpose. The function
104
+ * itself, its argument, its local bindings are all named to reflect that fact.
105
+ *
106
+ * However, the **use case** for the function is quite specific: when a form
107
+ * defines a `<repeat>` that isn't associated with an explicit `jr:template`, we
108
+ * fabricate a template by cloning its structure with all text values removed
109
+ * (described in more detail for {@link parseRepeatTemplateElement}).
110
+ *
111
+ * As generalized as this the function is, it's not at all clear how or why we'd
112
+ * use it for other purposes. Even the top-of-mind (at time of writing) use case
113
+ * which might semantically line up with it (i.e. potentially as a basis to
114
+ * reconcile edit instance state into a form definition, as sort of a three-way
115
+ * merge) would effectively be pure overhead. For now, we have something
116
+ * library-ish living here private in this module unless/until we find another
117
+ * good reason to use it elsewhere!
118
+ *
119
+ * If we do find another plausible use case for this behavior, it's pretty
120
+ * likely we'd want to implement it as a part of the {@link StaticElement} (or
121
+ * somewhere else up the class hierarchy to {@link StaticNode}), to encapsulate
122
+ * as much as possible about how it's done. We've been pretty aggressive about
123
+ * changing the internals and signatures of {@link StaticNode}s and the
124
+ * static-dom abstraction. It'd be nice if ongoing changes were a lot more
125
+ * isolated, with far less impact on the growing set of use cases actually
126
+ * consuming the abstraction.
127
+ */
128
+ const cloneStaticElementStructure = (sourceElement: StaticElement): StaticElement => {
129
+ const { root: clone } = new StaticDocument({
130
+ documentRoot: cloneStaticSubtreeStructure(sourceElement),
131
+ nodesetPrefix: sourceElement.parent.nodeset,
132
+ });
133
+
134
+ return clone;
135
+ };
136
+
137
+ export type RepeatInstanceNodes = readonly [StaticElement, ...StaticElement[]];
138
+
139
+ /**
140
+ * Produces a consistent "repeat template" interface for each
141
+ * {@link RepeatDefinition}, which is used to produce new repeat instances in
142
+ * {@link PrimaryInstance | runtime form instance state}. How a "repeat
143
+ * template" is parsed is as follows:
144
+ *
145
+ * - If the form definition includes an **explicit template** (as described by
146
+ * {@link isExplicitRepeatTemplateElement}) as the
147
+ * {@link firstRepeatInstanceNode | first} node referenced by a `<repeat
148
+ * nodeset>`, that node is returned as it was already parsed.
149
+ *
150
+ * - If the {@link firstRepeatInstanceNode | first} repeat instance node is
151
+ * **NOT** an explicit template, a template is **implicitly created** from its
152
+ * blank structure, as a
153
+ * {@link cloneStaticElementStructure | clone of its structure}.
154
+ *
155
+ * The latter behavior may sound surprising if unfamiliar, but it is well
156
+ * understood. It is also known to be consistent with Collect (JavaRosa), as
157
+ * demonstrated by affected tests in `@getodk/scenario` which fail when this
158
+ * behavior is changed.
159
+ *
160
+ * - - -
161
+ *
162
+ * Note: this is a vastly simplified evolution of what was previously
163
+ * implemented in
164
+ * {@link https://github.com/getodk/web-forms/blob/99295eb1d6ec78cd6a758385793e97859b6a74cc/packages/xforms-engine/src/parse/model/RepeatTemplateDefinition.ts#L81 | `RepeatTemplateDefinition.parseModelNodes`}
165
+ * (permalink to implementation at time of writing/refactor).
166
+ *
167
+ * That previous implementation was based on a flawed mental model of how a
168
+ * parsed form model relates to the form's instance structure. The following
169
+ * describes the previous flawed mental model, and the reasoning behind revising
170
+ * the mental model established here.
171
+ *
172
+ * - - -
173
+ *
174
+ * **Flawed mental model**
175
+ *
176
+ * Repeat model definitions were composed of a combination of:
177
+ *
178
+ * 1. `RepeatRangeDefinition`: this effectively had a 1:1 correspondence to the
179
+ * `<repeat>` _body element_ referencing the `nodeset` of 1+ instance nodes
180
+ * (as defined in the form's model).
181
+ *
182
+ * 2. `RepeatTemplateDefinition`: this had a 0-1:1 correspondence between an
183
+ * instance node (as defined in the form's model) defining a `jr:template`
184
+ * attribute, if one exists; if none exists, one was synthesized at parse
185
+ * time.
186
+ *
187
+ * 3. `RepeatInstanceDefinition`: these had an N:N correspondence to _every
188
+ * non-template instance node_ (as defined in the form's model).
189
+ *
190
+ * For each instance of a form:
191
+ *
192
+ * - `RepeatRangeControlled` or `RepeatRangeUncontrolled` (engine-internal
193
+ * implementation of the `RepeatRangeControlledNode` and
194
+ * `RepeatRangeUncontrolledNode` client interfaces, respectively) also
195
+ * corresponded 1:1 with a `RepeatRangeDefinition`.
196
+ *
197
+ * - `RepeatInstance` (engine-internal implementation of the
198
+ * `RepeatInstanceNode`) had an N:N relationship with _either_:
199
+ * - `RepeatInstanceDefinition`, if one was defined for that repeat instance's
200
+ * the positional index
201
+ * - `RepeatTemplateDefinition`, otherwise
202
+ *
203
+ * **Revised mental model**
204
+ *
205
+ * 1. `RepeatDefinition`: merges the responsibilities of the former
206
+ * `RepeatRangeDefinition` and `RepeatTemplateDefinition`.
207
+ *
208
+ * 2. Repeat instance nodes (as defined in the form's model) are refereced
209
+ * _during the construction of instance state_ (`PrimaryInstance`):
210
+ *
211
+ * - if an instance node exists at the positional index of the
212
+ * `RepeatInstance` to be created, that node is used to populate the
213
+ * `RepeatInstance`'s initial state
214
+ *
215
+ * - if no instance node exists at that positional index, the template
216
+ * returned by {@link RepeatTemplateDefinition.parseRepeatTemplateElement}
217
+ * is referenced for the `RepeatInstance`'s initial state instead
218
+ *
219
+ * Aside from simplifying the parsing responsibilities associated with repeats,
220
+ * this also creates a roughly 1:1 relationship between the different
221
+ * representations of what we call an "instance node".
222
+ *
223
+ * @todo The above "revised mental model" for repeat definitions pretty much
224
+ * reflects the same principles which will be applied for non-form instance
225
+ * state, i.e. for (a) restoring previously serialized instance state and/or (b)
226
+ * editing previously submitted instance state. It will make sense to reflect
227
+ * that once that aspect of implementation is complete!
228
+ *
229
+ * - - -
230
+ *
231
+ * At time of writing, I believe that detailing the differences between these
232
+ * mental models will provide useful context, in the long term, for reasoning
233
+ * about the relationship between "node definition" and "instance node" (as
234
+ * defined in a form or a serialized and/or submitted instance; also the
235
+ * engine's active, stateful representations of those same nodes).
236
+ *
237
+ * Namely, the revised relationship is _1 (node definition) : N (instance
238
+ * node)_, associated by each instance node's nodeset.
239
+ */
240
+ const parseRepeatTemplateElement = (firstRepeatInstanceNode: StaticElement) => {
241
+ if (isExplicitRepeatTemplateElement(firstRepeatInstanceNode)) {
242
+ return firstRepeatInstanceNode;
243
+ }
244
+
245
+ return cloneStaticElementStructure(firstRepeatInstanceNode);
246
+
247
+ // TODO: We previously **intended** to check for duplicate explicit repeat
248
+ // templates (i.e. defined with a `jr:template` attribute). This was
249
+ // **partially** handled by defining a (temporary/local) mapping from the
250
+ // repeat's `BindDefinition` to an already-parsed explicit template element
251
+ // (if any). Identifying duplicates **should** have been handled by
252
+ // determining that an entry for the same binding already existed. **BUT NO
253
+ // ENTRY WAS NEVER WRITTEN!** This comment is now intended to recognize:
254
+ //
255
+ // 1. ... that the intended behavior was never implemented correctly in the
256
+ // first place, and we are not making any changes to that intended aspect
257
+ // of engine behavior/semantics by eliminating the flawed implementation
258
+ // now.
259
+ //
260
+ // 2. ... that whether this behavior should have even been implemented was
261
+ // also an open question! The previous text of this
262
+ // comment's conceptual successor is preserved below, either for clarity in review or for logner-term posterity.
263
+ //
264
+ // - - -
265
+ //
266
+ // Previous text of this comment:
267
+ //
268
+ // > TODO: this is under the assumption that for any depth > 1, if a
269
+ // > template has already been defined for the given form definition, any
270
+ // > subsequent nodes matching the repeat's nodeset are implicitly default
271
+ // > instances. Is this right?
272
+ };
273
+
274
+ export interface ControlledRepeatDefinition extends RepeatDefinition {
275
+ readonly count: RepeatCountControlExpression;
276
+ }
277
+
278
+ export interface UncontrolledRepeatDefinition extends RepeatDefinition {
279
+ readonly count: null;
280
+ }
281
+
282
+ /**
283
+ * Represents a definition of the combined concepts colloquially called a
284
+ * "repeat", as defined by a form, where those concepts include:
285
+ *
286
+ * - A {@link RepeatElementDefinition}—corresponding to a `<repeat>` {@link https://getodk.github.io/xforms-spec/#body-elements | body element}—which is associated with the nodeset referencing the "repeat template" and
287
+ * all "repeat instances" (see below points describing both concepts in more detail). The presence of such a body element determines whether to produce a repeat definition (rather than e.g. a {@link SubtreeDefinition}).
288
+ *
289
+ * - A "repeat template", defined by a form either
290
+ * explicitly,
291
+ * or derived from the structure of the first form-defined "repeat instance"
292
+ * (as described in the next point).
293
+ *
294
+ * - A sequence of one or more model instance nodes, each representing a "repeat instance"
295
+ * defined by the form. These nodes contribute to the definition in the following ways:
296
+ *
297
+ * - If an explicit "repeat template" is not defined for
298
+ * the "repeat", one is derived from the **structure** (but not the values!)
299
+ * of the first such model instance node.
300
+ *
301
+ * - If the "repeat" is {@link ControlledRepeatDefinition | controlled} (i.e. by either a `jr:count` or `jr:noAddRemove` {@link https://getodk.github.io/xforms-spec/#body-attributes | attribute} on the associated {@link RepeatElementDefinition}
302
+ *
303
+ * (For construction of this
304
+ * definition, all other referenced instance nodes are **consumed** in the
305
+ * process of building the repeat definition's subtree of a
306
+ * {@link RootDefinition}, ensuring that one repeat definition is produced for
307
+ * all applicable nodes; they are later referenced for construction of a
308
+ * form's {@link PrimaryInstance | instance state}.)
309
+ *
310
+ * Combined, these concepts produce the details required to instantiate the
311
+ * {@link RepeatRange} and {@link RepeatInstance} instance state nodes
312
+ * associated with a defined repeat.
313
+ */
314
+ export class RepeatDefinition extends DescendentNodeDefinition<'repeat', RepeatElementDefinition> {
315
+ static from(
316
+ parent: ParentNodeDefinition,
317
+ bind: BindDefinition,
318
+ bodyElement: RepeatElementDefinition,
319
+ instanceNodes: RepeatInstanceNodes
320
+ ): AnyRepeatDefinition;
321
+ static from(
322
+ parent: ParentNodeDefinition,
323
+ bind: BindDefinition,
324
+ bodyElement: RepeatElementDefinition,
325
+ instanceNodes: RepeatInstanceNodes
326
+ ): RepeatDefinition {
327
+ return new this(parent, bind, bodyElement, instanceNodes);
328
+ }
329
+
330
+ readonly type = 'repeat';
331
+ readonly children: readonly ChildNodeDefinition[];
332
+ readonly count: RepeatCountControlExpression | null;
333
+ readonly template: StaticElement;
334
+ readonly namespaceDeclarations: NamespaceDeclarationMap;
335
+ readonly qualifiedName: QualifiedName;
336
+
337
+ private constructor(
338
+ parent: ParentNodeDefinition,
339
+ bind: BindDefinition,
340
+ bodyElement: RepeatElementDefinition,
341
+ instanceNodes: RepeatInstanceNodes
342
+ ) {
343
+ super(parent, bind, bodyElement);
344
+
345
+ const { root } = parent;
346
+ const [instanceNode] = instanceNodes;
347
+ const template = parseRepeatTemplateElement(instanceNode);
348
+ const self = this as AnyRepeatDefinition;
349
+
350
+ this.template = template;
351
+ this.qualifiedName = template.qualifiedName;
352
+ this.namespaceDeclarations = new NamespaceDeclarationMap(this);
353
+ this.children = root.buildSubtree(self, template);
354
+
355
+ const initialCount = this.omitTemplate(instanceNodes).length;
356
+
357
+ this.count = RepeatCountControlExpression.from(bodyElement, initialCount);
358
+ }
359
+
360
+ isControlled(): this is ControlledRepeatDefinition {
361
+ return this.count != null;
362
+ }
363
+
364
+ isUncontrolled(): this is UncontrolledRepeatDefinition {
365
+ return this.count == null;
366
+ }
367
+
368
+ omitTemplate(instanceNodes: readonly StaticElement[]): readonly StaticElement[] {
369
+ return instanceNodes.filter((instanceNode) => {
370
+ return instanceNode !== this.template;
371
+ });
372
+ }
373
+
374
+ toJSON(): object {
375
+ return {};
376
+ }
377
+ }
378
+
379
+ // prettier-ignore
380
+ export type AnyRepeatDefinition =
381
+ | ControlledRepeatDefinition
382
+ | UncontrolledRepeatDefinition;
@@ -5,10 +5,7 @@ import { escapeXMLText } from '../../lib/xml-serialization.ts';
5
5
  import type { RootDefinition } from './RootDefinition.ts';
6
6
 
7
7
  interface RootAttributeSource {
8
- readonly namespaceURI: string | null;
9
- readonly nodeName: string;
10
- readonly prefix: string | null;
11
- readonly localName: string;
8
+ readonly qualifiedName: QualifiedName;
12
9
  readonly value: string;
13
10
  }
14
11
 
@@ -25,16 +22,18 @@ export class RootAttributeDefinition implements NamedNodeDefinition {
25
22
  readonly value: string;
26
23
 
27
24
  constructor(root: RootDefinition, source: RootAttributeSource) {
28
- const { namespaceURI, nodeName, value } = source;
25
+ const { qualifiedName, value } = source;
29
26
 
30
27
  this.parent = root;
31
- this.qualifiedName = new QualifiedName(source);
28
+ this.qualifiedName = qualifiedName;
32
29
  this.value = value;
33
30
 
34
31
  // We serialize namespace declarations separately
35
- if (namespaceURI === XMLNS_NAMESPACE_URI) {
32
+ if (qualifiedName.namespaceURI?.href === XMLNS_NAMESPACE_URI) {
36
33
  this.serializedXML = '';
37
34
  } else {
35
+ const nodeName = qualifiedName.getPrefixedName();
36
+
38
37
  this.serializedXML = ` ${nodeName}="${escapeXMLText(value, true)}"`;
39
38
  }
40
39
  }
@@ -1,10 +1,16 @@
1
1
  import { XMLNS_NAMESPACE_URI } from '@getodk/common/constants/xmlns.ts';
2
+ import type { StaticAttribute } from '../../integration/xpath/static-dom/StaticAttribute.ts';
3
+ import type { StaticElement } from '../../integration/xpath/static-dom/StaticElement.ts';
2
4
  import type { QualifiedName } from '../../lib/names/QualifiedName.ts';
3
5
  import { RootAttributeDefinition } from './RootAttributeDefinition.ts';
4
6
  import type { RootDefinition } from './RootDefinition.ts';
5
7
 
6
- const isNonNamespaceDeclarationDOMAttr = (domAttr: Attr) => {
7
- return domAttr.namespaceURI !== XMLNS_NAMESPACE_URI;
8
+ /**
9
+ * @todo We should probably just distinguish these as separate `StaticNode`
10
+ * subclasses, probably as separate collections on `StaticElement`!
11
+ */
12
+ const isNonNamespaceAttribute = (attribute: StaticAttribute) => {
13
+ return attribute.qualifiedName.namespaceURI?.href !== XMLNS_NAMESPACE_URI;
8
14
  };
9
15
 
10
16
  /**
@@ -24,19 +30,18 @@ const isNonNamespaceDeclarationDOMAttr = (domAttr: Attr) => {
24
30
  * @see {@link QualifiedName} for more detail.
25
31
  */
26
32
  export class RootAttributeMap extends Map<QualifiedName, RootAttributeDefinition> {
27
- static from(root: RootDefinition, domRootSourceElement: Element) {
28
- const domAttrs = Array.from(domRootSourceElement.attributes);
29
- const nonNamespaceDeclarationDOMAttrs = domAttrs.filter(isNonNamespaceDeclarationDOMAttr);
30
- const attributes = nonNamespaceDeclarationDOMAttrs.map((source) => {
31
- return new RootAttributeDefinition(root, source);
33
+ static from(root: RootDefinition, instanceNode: StaticElement) {
34
+ const nonNamespaceAttributes = instanceNode.attributes.filter(isNonNamespaceAttribute);
35
+ const definitions = nonNamespaceAttributes.map((attribute) => {
36
+ return new RootAttributeDefinition(root, attribute);
32
37
  });
33
38
 
34
- return new this(attributes);
39
+ return new this(definitions);
35
40
  }
36
41
 
37
- private constructor(attributes: readonly RootAttributeDefinition[]) {
42
+ private constructor(definitions: readonly RootAttributeDefinition[]) {
38
43
  super(
39
- attributes.map((attribute) => {
44
+ definitions.map((attribute) => {
40
45
  return [attribute.qualifiedName, attribute];
41
46
  })
42
47
  );
@@ -1,16 +1,17 @@
1
+ import type { StaticElement } from '../../integration/xpath/static-dom/StaticElement.ts';
1
2
  import { NamespaceDeclarationMap } from '../../lib/names/NamespaceDeclarationMap.ts';
2
3
  import { QualifiedName } from '../../lib/names/QualifiedName.ts';
3
4
  import type { BodyClassList } from '../body/BodyDefinition.ts';
4
5
  import type { XFormDefinition } from '../XFormDefinition.ts';
5
- import type { FormSubmissionDefinition } from './FormSubmissionDefinition.ts';
6
6
  import { LeafNodeDefinition } from './LeafNodeDefinition.ts';
7
7
  import type { ModelDefinition } from './ModelDefinition.ts';
8
8
  import type { ChildNodeDefinition, ParentNodeDefinition } from './NodeDefinition.ts';
9
9
  import { NodeDefinition } from './NodeDefinition.ts';
10
10
  import { NoteNodeDefinition } from './NoteNodeDefinition.ts';
11
11
  import { RangeNodeDefinition } from './RangeNodeDefinition.ts';
12
- import { RepeatRangeDefinition } from './RepeatRangeDefinition.ts';
12
+ import { RepeatDefinition } from './RepeatDefinition.ts';
13
13
  import { RootAttributeMap } from './RootAttributeMap.ts';
14
+ import type { SubmissionDefinition } from './SubmissionDefinition.ts';
14
15
  import { SubtreeDefinition } from './SubtreeDefinition.ts';
15
16
 
16
17
  export class RootDefinition extends NodeDefinition<'root'> {
@@ -19,23 +20,21 @@ export class RootDefinition extends NodeDefinition<'root'> {
19
20
  readonly bodyElement = null;
20
21
  readonly root = this;
21
22
  readonly parent = null;
23
+ readonly template: StaticElement;
22
24
  readonly namespaceDeclarations: NamespaceDeclarationMap;
23
25
  readonly attributes: RootAttributeMap;
24
26
  readonly children: readonly ChildNodeDefinition[];
25
- readonly instances = null;
26
- readonly node: Element;
27
- readonly defaultValue = null;
28
27
 
29
28
  readonly isTranslated = false;
30
29
 
31
30
  constructor(
32
31
  protected readonly form: XFormDefinition,
33
32
  protected readonly model: ModelDefinition,
34
- readonly submission: FormSubmissionDefinition,
33
+ readonly submission: SubmissionDefinition,
35
34
  readonly classes: BodyClassList
36
35
  ) {
37
- const { primaryInstanceRoot } = form.xformDOM;
38
- const qualifiedName = new QualifiedName(primaryInstanceRoot);
36
+ const template = model.instance.root;
37
+ const qualifiedName = template.qualifiedName;
39
38
  const nodeName = qualifiedName.getPrefixedName();
40
39
 
41
40
  // TODO: theoretically the pertinent step in the bind's `nodeset` *could* be
@@ -51,23 +50,23 @@ export class RootDefinition extends NodeDefinition<'root'> {
51
50
  super(bind);
52
51
 
53
52
  this.qualifiedName = qualifiedName;
54
- this.node = primaryInstanceRoot;
55
- this.attributes = RootAttributeMap.from(this, primaryInstanceRoot);
53
+ this.template = template;
54
+ this.attributes = RootAttributeMap.from(this, template);
56
55
  this.namespaceDeclarations = new NamespaceDeclarationMap(this);
57
- this.children = this.buildSubtree(this);
56
+ this.children = this.buildSubtree(this, template);
58
57
  }
59
58
 
60
- buildSubtree(parent: ParentNodeDefinition): readonly ChildNodeDefinition[] {
59
+ buildSubtree(parent: ParentNodeDefinition, node: StaticElement): readonly ChildNodeDefinition[] {
61
60
  const { form, model } = this;
62
61
  const { body } = form;
63
62
  const { binds } = model;
64
- const { bind: parentBind, node } = parent;
63
+ const { bind: parentBind } = parent;
65
64
  const { nodeset: parentNodeset } = parentBind;
66
65
 
67
- const childrenByName = new Map<string, [Element, ...Element[]]>();
66
+ const childrenByName = new Map<string, [StaticElement, ...StaticElement[]]>();
68
67
 
69
- for (const child of node.children) {
70
- const { nodeName } = child;
68
+ for (const child of node.childElements) {
69
+ const nodeName = child.qualifiedName.getPrefixedName();
71
70
 
72
71
  let elements = childrenByName.get(nodeName);
73
72
 
@@ -88,7 +87,7 @@ export class RootDefinition extends NodeDefinition<'root'> {
88
87
  const [firstChild, ...restChildren] = children;
89
88
 
90
89
  if (bodyElement?.type === 'repeat') {
91
- return RepeatRangeDefinition.from(parent, bind, bodyElement, children);
90
+ return RepeatDefinition.from(parent, bind, bodyElement, children);
92
91
  }
93
92
 
94
93
  if (restChildren.length) {
@@ -96,9 +95,8 @@ export class RootDefinition extends NodeDefinition<'root'> {
96
95
  }
97
96
 
98
97
  const element = firstChild;
99
- const isLeafNode = element.childElementCount === 0;
100
98
 
101
- if (isLeafNode) {
99
+ if (element.isLeafElement()) {
102
100
  if (bodyElement?.type === 'range') {
103
101
  return RangeNodeDefinition.from(parent, bind, bodyElement, element);
104
102
  }
@@ -1,10 +1,15 @@
1
1
  import { JRResourceURL } from '@getodk/common/jr-resources/JRResourceURL.ts';
2
2
  import { UnreachableError } from '@getodk/common/lib/error/UnreachableError.ts';
3
- import type { XFormsSecondaryInstanceMap } from '@getodk/xpath';
3
+ import type {
4
+ XFORMS_KNOWN_ATTRIBUTE,
5
+ XFORMS_LOCAL_NAME,
6
+ XFormsSecondaryInstanceMap,
7
+ } from '@getodk/xpath';
4
8
  import { ErrorProductionDesignPendingError } from '../../../error/ErrorProductionDesignPendingError.ts';
5
9
  import type { EngineXPathNode } from '../../../integration/xpath/adapter/kind.ts';
10
+ import type { StaticDocument } from '../../../integration/xpath/static-dom/StaticDocument.ts';
11
+ import type { StaticElement } from '../../../integration/xpath/static-dom/StaticElement.ts';
6
12
  import type { XFormDOM } from '../../XFormDOM.ts';
7
- import { SecondaryInstanceRootDefinition } from './SecondaryInstanceRootDefinition.ts';
8
13
  import { BlankSecondaryInstanceSource } from './sources/BlankSecondaryInstanceSource.ts';
9
14
  import { CSVExternalSecondaryInstanceSource } from './sources/CSVExternalSecondaryInstance.ts';
10
15
  import type { ExternalSecondaryInstanceResourceLoadOptions } from './sources/ExternalSecondaryInstanceResource.ts';
@@ -14,6 +19,22 @@ import { InternalSecondaryInstanceSource } from './sources/InternalSecondaryInst
14
19
  import type { SecondaryInstanceSource } from './sources/SecondaryInstanceSource.ts';
15
20
  import { XMLExternalSecondaryInstanceSource } from './sources/XMLExternalSecondaryInstanceSource.ts';
16
21
 
22
+ export interface SecondaryInstanceDefinition extends StaticDocument {
23
+ readonly rootDocument: SecondaryInstanceDefinition;
24
+ readonly root: SecondaryInstanceRootDefinition;
25
+ }
26
+
27
+ export interface SecondaryInstanceRootDefinition extends StaticElement {
28
+ readonly [XFORMS_LOCAL_NAME]: 'instance';
29
+ readonly [XFORMS_KNOWN_ATTRIBUTE]: 'id';
30
+
31
+ readonly rootDocument: SecondaryInstanceDefinition;
32
+ readonly root: SecondaryInstanceRootDefinition;
33
+
34
+ getAttributeValue(localName: 'id'): string;
35
+ getAttributeValue(localName: string): string | null;
36
+ }
37
+
17
38
  export class SecondaryInstancesDefinition
18
39
  extends Map<string, SecondaryInstanceRootDefinition>
19
40
  implements XFormsSecondaryInstanceMap<EngineXPathNode>
@@ -0,0 +1,14 @@
1
+ import type { StaticDocument } from '../../../integration/xpath/static-dom/StaticDocument.ts';
2
+ import type { SecondaryInstanceDefinition } from './SecondaryInstancesDefinition.ts';
3
+
4
+ type AssertSecondaryInstanceDefinition = (
5
+ doc: StaticDocument
6
+ ) => asserts doc is SecondaryInstanceDefinition;
7
+
8
+ export const assertSecondaryInstanceDefinition: AssertSecondaryInstanceDefinition = ({ root }) => {
9
+ const id = root.getAttributeValue('id');
10
+
11
+ if (id == null) {
12
+ throw new Error();
13
+ }
14
+ };
@@ -0,0 +1,32 @@
1
+ import { StaticDocument } from '../../../integration/xpath/static-dom/StaticDocument.ts';
2
+ import type { StaticElementOptions } from '../../../integration/xpath/static-dom/StaticElement.ts';
3
+ import { assertSecondaryInstanceDefinition } from './assertSecondaryInstanceDefinition.ts';
4
+ import type { SecondaryInstanceDefinition } from './SecondaryInstancesDefinition.ts';
5
+
6
+ // prettier-ignore
7
+ type SecondaryInstanceRoot =
8
+ | StaticElementOptions
9
+ | '';
10
+
11
+ export const defineSecondaryInstance = (
12
+ instanceId: string,
13
+ secondaryInstanceRoot: SecondaryInstanceRoot
14
+ ): SecondaryInstanceDefinition => {
15
+ const doc = new StaticDocument({
16
+ documentRoot: {
17
+ name: 'instance',
18
+ attributes: [
19
+ {
20
+ name: 'id',
21
+ value: instanceId,
22
+ },
23
+ ],
24
+ children: [secondaryInstanceRoot],
25
+ },
26
+ nodesetPrefix: `instance('${instanceId}')`,
27
+ });
28
+
29
+ assertSecondaryInstanceDefinition(doc);
30
+
31
+ return doc;
32
+ };