@getodk/xforms-engine 0.5.0 → 0.7.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 (425) hide show
  1. package/README.md +1 -1
  2. package/dist/client/BaseNode.d.ts +8 -4
  3. package/dist/client/BaseValueNode.d.ts +8 -4
  4. package/dist/client/GroupNode.d.ts +1 -0
  5. package/dist/client/InputNode.d.ts +32 -3
  6. package/dist/client/ModelValueNode.d.ts +1 -0
  7. package/dist/client/NoteNode.d.ts +24 -7
  8. package/dist/client/RangeNode.d.ts +36 -0
  9. package/dist/client/RankNode.d.ts +46 -0
  10. package/dist/client/RootNode.d.ts +21 -14
  11. package/dist/client/SelectNode.d.ts +47 -25
  12. package/dist/client/SubtreeNode.d.ts +1 -0
  13. package/dist/client/TriggerNode.d.ts +10 -6
  14. package/dist/client/constants.d.ts +11 -12
  15. package/dist/client/form/CreateFormInstance.d.ts +14 -0
  16. package/dist/client/form/EditFormInstance.d.ts +62 -0
  17. package/dist/client/form/FormInstance.d.ts +104 -0
  18. package/dist/client/form/FormInstanceConfig.d.ts +17 -0
  19. package/dist/client/form/FormResource.d.ts +1 -0
  20. package/dist/client/form/LoadForm.d.ts +79 -0
  21. package/dist/client/form/LoadFormResult.d.ts +67 -0
  22. package/dist/client/form/RestoreFormInstance.d.ts +8 -0
  23. package/dist/client/hierarchy.d.ts +5 -5
  24. package/dist/client/index.d.ts +37 -11
  25. package/dist/client/node-types.d.ts +2 -2
  26. package/dist/client/repeat/BaseRepeatRangeNode.d.ts +3 -4
  27. package/dist/client/repeat/RepeatInstanceNode.d.ts +4 -5
  28. package/dist/client/repeat/RepeatRangeControlledNode.d.ts +2 -2
  29. package/dist/client/repeat/RepeatRangeUncontrolledNode.d.ts +2 -2
  30. package/dist/client/resources.d.ts +1 -1
  31. package/dist/client/serialization/InstanceData.d.ts +12 -0
  32. package/dist/client/serialization/InstanceFile.d.ts +6 -0
  33. package/dist/client/serialization/InstancePayload.d.ts +93 -0
  34. package/dist/client/serialization/InstancePayloadOptions.d.ts +23 -0
  35. package/dist/client/serialization/InstanceState.d.ts +12 -0
  36. package/dist/client/submission/{SubmissionDefinition.d.ts → SubmissionMeta.d.ts} +1 -1
  37. package/dist/client/unsupported/UnsupportedControlNode.d.ts +1 -3
  38. package/dist/entrypoints/FormInstance.d.ts +20 -0
  39. package/dist/entrypoints/FormResult/BaseFormResult.d.ts +22 -0
  40. package/dist/entrypoints/FormResult/BaseInstantiableFormResult.d.ts +25 -0
  41. package/dist/entrypoints/FormResult/FormFailureResult.d.ts +17 -0
  42. package/dist/entrypoints/FormResult/FormSuccessResult.d.ts +15 -0
  43. package/dist/entrypoints/FormResult/FormWarningResult.d.ts +15 -0
  44. package/dist/entrypoints/createInstance.d.ts +9 -0
  45. package/dist/entrypoints/editInstance.d.ts +9 -0
  46. package/dist/entrypoints/index.d.ts +4 -0
  47. package/dist/entrypoints/loadForm.d.ts +4 -0
  48. package/dist/entrypoints/restoreInstance.d.ts +9 -0
  49. package/dist/error/LoadFormFailureError.d.ts +9 -0
  50. package/dist/error/MalformedInstanceDataError.d.ts +3 -0
  51. package/dist/error/RankMissingValueError.d.ts +3 -0
  52. package/dist/error/RankValueTypeError.d.ts +6 -0
  53. package/dist/error/SelectValueTypeError.d.ts +15 -0
  54. package/dist/error/TemplatedNodeAttributeSerializationError.d.ts +22 -0
  55. package/dist/error/XFormsSpecViolationError.d.ts +2 -0
  56. package/dist/index.d.ts +2 -34
  57. package/dist/index.js +7274 -5840
  58. package/dist/index.js.map +1 -1
  59. package/dist/instance/Group.d.ts +7 -5
  60. package/dist/instance/InputControl.d.ts +9 -6
  61. package/dist/instance/ModelValue.d.ts +7 -4
  62. package/dist/instance/Note.d.ts +14 -25
  63. package/dist/instance/PrimaryInstance.d.ts +36 -8
  64. package/dist/instance/RangeControl.d.ts +35 -0
  65. package/dist/instance/RankControl.d.ts +41 -0
  66. package/dist/instance/Root.d.ts +8 -9
  67. package/dist/instance/SelectControl.d.ts +67 -0
  68. package/dist/instance/Subtree.d.ts +7 -5
  69. package/dist/instance/TriggerControl.d.ts +10 -22
  70. package/dist/instance/abstract/DescendantNode.d.ts +11 -3
  71. package/dist/instance/abstract/InstanceNode.d.ts +10 -5
  72. package/dist/instance/abstract/ValueNode.d.ts +7 -6
  73. package/dist/instance/children/DescendantNodeInitOptions.d.ts +32 -0
  74. package/dist/instance/{children.d.ts → children/buildChildren.d.ts} +1 -1
  75. package/dist/instance/children/childrenInitOptions.d.ts +9 -0
  76. package/dist/instance/children/normalizeChildInitOptions.d.ts +2 -0
  77. package/dist/instance/hierarchy.d.ts +9 -9
  78. package/dist/instance/input/InitialInstanceState.d.ts +13 -0
  79. package/dist/instance/input/InstanceAttachmentMap.d.ts +19 -0
  80. package/dist/instance/internal-api/InstanceConfig.d.ts +2 -9
  81. package/dist/instance/internal-api/InstanceValueContext.d.ts +10 -1
  82. package/dist/instance/internal-api/serialization/ClientReactiveSerializableInstance.d.ts +14 -0
  83. package/dist/instance/internal-api/serialization/ClientReactiveSerializableLeafNode.d.ts +32 -0
  84. package/dist/instance/internal-api/serialization/ClientReactiveSerializableParentNode.d.ts +18 -0
  85. package/dist/instance/internal-api/serialization/ClientReactiveSerializableTemplatedNode.d.ts +13 -0
  86. package/dist/instance/internal-api/serialization/ClientReactiveSerializableValueNode.d.ts +21 -0
  87. package/dist/instance/repeat/BaseRepeatRange.d.ts +11 -8
  88. package/dist/instance/repeat/RepeatInstance.d.ts +11 -7
  89. package/dist/instance/repeat/RepeatRangeControlled.d.ts +27 -3
  90. package/dist/instance/repeat/RepeatRangeUncontrolled.d.ts +4 -3
  91. package/dist/instance/resource.d.ts +5 -1
  92. package/dist/instance/unsupported/UploadControl.d.ts +32 -4
  93. package/dist/integration/xpath/EngineXPathEvaluator.d.ts +2 -2
  94. package/dist/integration/xpath/adapter/kind.d.ts +4 -10
  95. package/dist/integration/xpath/adapter/names.d.ts +1 -11
  96. package/dist/integration/xpath/adapter/traversal.d.ts +10 -9
  97. package/dist/integration/xpath/static-dom/StaticAttribute.d.ts +10 -4
  98. package/dist/integration/xpath/static-dom/StaticDocument.d.ts +13 -11
  99. package/dist/integration/xpath/static-dom/StaticElement.d.ts +25 -18
  100. package/dist/integration/xpath/static-dom/StaticNode.d.ts +1 -1
  101. package/dist/integration/xpath/static-dom/StaticParentNode.d.ts +13 -0
  102. package/dist/integration/xpath/static-dom/staticNodeName.d.ts +3 -0
  103. package/dist/lib/client-reactivity/instance-state/createNodeRangeInstanceState.d.ts +4 -0
  104. package/dist/lib/client-reactivity/instance-state/createParentNodeInstanceState.d.ts +4 -0
  105. package/dist/lib/client-reactivity/instance-state/createPrimaryInstanceState.d.ts +3 -0
  106. package/dist/lib/client-reactivity/instance-state/createRootInstanceState.d.ts +3 -0
  107. package/dist/lib/client-reactivity/instance-state/createTemplatedNodeInstanceState.d.ts +6 -0
  108. package/dist/lib/client-reactivity/instance-state/createValueNodeInstanceState.d.ts +3 -0
  109. package/dist/lib/client-reactivity/instance-state/prepareInstancePayload.d.ts +8 -0
  110. package/dist/lib/codecs/Geopoint/Geopoint.d.ts +48 -0
  111. package/dist/lib/codecs/Geopoint/GeopointValueCodec.d.ts +5 -0
  112. package/dist/lib/codecs/NoteCodec.d.ts +8 -0
  113. package/dist/lib/codecs/RangeCodec.d.ts +8 -0
  114. package/dist/lib/codecs/TempUnsupportedControlCodec.d.ts +7 -0
  115. package/dist/lib/codecs/TriggerCodec.d.ts +7 -0
  116. package/dist/lib/codecs/ValueArrayCodec.d.ts +11 -0
  117. package/dist/lib/codecs/ValueCodec.d.ts +2 -2
  118. package/dist/lib/codecs/getNoteCodec.d.ts +3 -0
  119. package/dist/lib/codecs/getSelectCodec.d.ts +5 -0
  120. package/dist/lib/codecs/getSharedValueCodec.d.ts +3 -2
  121. package/dist/lib/codecs/items/BaseItemCodec.d.ts +9 -0
  122. package/dist/lib/codecs/items/MultipleValueItemCodec.d.ts +14 -0
  123. package/dist/lib/codecs/items/SingleValueItemCodec.d.ts +24 -0
  124. package/dist/lib/dom/query.d.ts +1 -2
  125. package/dist/lib/names/NamespaceDeclaration.d.ts +45 -0
  126. package/dist/lib/names/NamespaceDeclarationMap.d.ts +137 -0
  127. package/dist/lib/names/NamespaceURL.d.ts +30 -0
  128. package/dist/lib/names/QualifiedName.d.ts +113 -0
  129. package/dist/lib/names/UnprefixedXFormsName.d.ts +4 -0
  130. package/dist/lib/number-parsers.d.ts +2 -0
  131. package/dist/lib/reactivity/createInstanceValueState.d.ts +2 -27
  132. package/dist/lib/reactivity/createItemCollection.d.ts +21 -0
  133. package/dist/lib/xml-serialization.d.ts +11 -2
  134. package/dist/parse/XFormDOM.d.ts +1 -1
  135. package/dist/parse/body/BodyDefinition.d.ts +2 -2
  136. package/dist/parse/body/appearance/rangeAppearanceParser.d.ts +3 -0
  137. package/dist/parse/body/control/InputControlDefinition.d.ts +3 -0
  138. package/dist/parse/body/control/ItemDefinition.d.ts +14 -0
  139. package/dist/parse/body/control/ItemsetDefinition.d.ts +18 -0
  140. package/dist/parse/body/control/RangeControlDefinition.d.ts +31 -2
  141. package/dist/parse/body/control/RankControlDefinition.d.ts +7 -3
  142. package/dist/parse/body/control/{select/SelectDefinition.d.ts → SelectControlDefinition.d.ts} +9 -9
  143. package/dist/parse/expression/ItemsetNodesetExpression.d.ts +1 -1
  144. package/dist/parse/expression/ItemsetValueExpression.d.ts +1 -1
  145. package/dist/parse/model/BindDefinition.d.ts +3 -1
  146. package/dist/parse/model/BindPreloadDefinition.d.ts +42 -0
  147. package/dist/parse/model/DescendentNodeDefinition.d.ts +4 -13
  148. package/dist/parse/model/ItextTranslationsDefinition.d.ts +18 -0
  149. package/dist/parse/model/LeafNodeDefinition.d.ts +9 -7
  150. package/dist/parse/model/ModelDefinition.d.ts +9 -2
  151. package/dist/parse/model/NodeDefinition.d.ts +30 -45
  152. package/dist/parse/model/NoteNodeDefinition.d.ts +7 -5
  153. package/dist/parse/model/RangeNodeDefinition.d.ts +42 -0
  154. package/dist/parse/model/RepeatDefinition.d.ts +62 -0
  155. package/dist/parse/model/RootAttributeDefinition.d.ts +21 -0
  156. package/dist/parse/model/RootAttributeMap.d.ts +24 -0
  157. package/dist/parse/model/RootDefinition.d.ts +15 -14
  158. package/dist/parse/model/SecondaryInstance/SecondaryInstancesDefinition.d.ts +15 -2
  159. package/dist/parse/model/SecondaryInstance/assertSecondaryInstanceDefinition.d.ts +5 -0
  160. package/dist/parse/model/SecondaryInstance/defineSecondaryInstance.d.ts +5 -0
  161. package/dist/parse/model/SecondaryInstance/sources/BlankSecondaryInstanceSource.d.ts +1 -7
  162. package/dist/parse/model/SecondaryInstance/sources/CSVExternalSecondaryInstance.d.ts +1 -1
  163. package/dist/parse/model/SecondaryInstance/sources/GeoJSONExternalSecondaryInstance.d.ts +1 -1
  164. package/dist/parse/model/SecondaryInstance/sources/InternalSecondaryInstanceSource.d.ts +1 -1
  165. package/dist/parse/model/SecondaryInstance/sources/SecondaryInstanceSource.d.ts +1 -1
  166. package/dist/parse/model/SecondaryInstance/sources/XMLExternalSecondaryInstanceSource.d.ts +1 -1
  167. package/dist/parse/model/{FormSubmissionDefinition.d.ts → SubmissionDefinition.d.ts} +2 -2
  168. package/dist/parse/model/SubtreeDefinition.d.ts +9 -7
  169. package/dist/parse/model/nodeDefinitionMap.d.ts +5 -0
  170. package/dist/parse/shared/parseInstanceXML.d.ts +21 -0
  171. package/dist/parse/shared/parseStaticDocumentFromDOMSubtree.d.ts +4 -22
  172. package/dist/parse/text/ItemLabelDefinition.d.ts +1 -1
  173. package/dist/parse/text/ItemsetLabelDefinition.d.ts +2 -2
  174. package/dist/parse/text/abstract/TextElementDefinition.d.ts +1 -1
  175. package/dist/parse/xpath/semantic-analysis.d.ts +1 -3
  176. package/dist/solid.js +7247 -5813
  177. package/dist/solid.js.map +1 -1
  178. package/package.json +15 -12
  179. package/src/client/BaseNode.ts +9 -4
  180. package/src/client/BaseValueNode.ts +8 -4
  181. package/src/client/GroupNode.ts +1 -0
  182. package/src/client/InputNode.ts +38 -2
  183. package/src/client/ModelValueNode.ts +1 -0
  184. package/src/client/NoteNode.ts +43 -7
  185. package/src/client/RangeNode.ts +51 -0
  186. package/src/client/RankNode.ts +54 -0
  187. package/src/client/RootNode.ts +30 -16
  188. package/src/client/SelectNode.ts +53 -26
  189. package/src/client/SubtreeNode.ts +1 -0
  190. package/src/client/TriggerNode.ts +12 -6
  191. package/src/client/constants.ts +12 -14
  192. package/src/client/form/CreateFormInstance.ts +19 -0
  193. package/src/client/form/EditFormInstance.ts +93 -0
  194. package/src/client/form/FormInstance.ts +114 -0
  195. package/src/client/form/FormInstanceConfig.ts +18 -0
  196. package/src/client/form/FormResource.ts +1 -0
  197. package/src/client/form/LoadForm.ts +92 -0
  198. package/src/client/form/LoadFormResult.ts +103 -0
  199. package/src/client/form/RestoreFormInstance.ts +14 -0
  200. package/src/client/hierarchy.ts +7 -8
  201. package/src/client/index.ts +47 -29
  202. package/src/client/node-types.ts +3 -5
  203. package/src/client/repeat/BaseRepeatRangeNode.ts +3 -4
  204. package/src/client/repeat/RepeatInstanceNode.ts +4 -8
  205. package/src/client/repeat/RepeatRangeControlledNode.ts +2 -2
  206. package/src/client/repeat/RepeatRangeUncontrolledNode.ts +2 -2
  207. package/src/client/resources.ts +2 -2
  208. package/src/client/serialization/InstanceData.ts +16 -0
  209. package/src/client/serialization/InstanceFile.ts +9 -0
  210. package/src/client/serialization/InstancePayload.ts +126 -0
  211. package/src/client/serialization/InstancePayloadOptions.ts +28 -0
  212. package/src/client/serialization/InstanceState.ts +14 -0
  213. package/src/client/submission/{SubmissionDefinition.ts → SubmissionMeta.ts} +1 -1
  214. package/src/client/unsupported/UnsupportedControlNode.ts +2 -6
  215. package/src/entrypoints/FormInstance.ts +55 -0
  216. package/src/entrypoints/FormResult/BaseFormResult.ts +40 -0
  217. package/src/entrypoints/FormResult/BaseInstantiableFormResult.ts +109 -0
  218. package/src/entrypoints/FormResult/FormFailureResult.ts +44 -0
  219. package/src/entrypoints/FormResult/FormSuccessResult.ts +25 -0
  220. package/src/entrypoints/FormResult/FormWarningResult.ts +25 -0
  221. package/src/entrypoints/createInstance.ts +23 -0
  222. package/src/entrypoints/editInstance.ts +24 -0
  223. package/src/entrypoints/index.ts +4 -0
  224. package/src/entrypoints/loadForm.ts +154 -0
  225. package/src/entrypoints/restoreInstance.ts +27 -0
  226. package/src/error/LoadFormFailureError.ts +114 -0
  227. package/src/error/MalformedInstanceDataError.ts +3 -0
  228. package/src/error/RankMissingValueError.ts +5 -0
  229. package/src/error/RankValueTypeError.ts +13 -0
  230. package/src/error/SelectValueTypeError.ts +22 -0
  231. package/src/error/TemplatedNodeAttributeSerializationError.ts +24 -0
  232. package/src/error/XFormsSpecViolationError.ts +1 -0
  233. package/src/index.ts +2 -56
  234. package/src/instance/Group.ts +17 -15
  235. package/src/instance/InputControl.ts +58 -12
  236. package/src/instance/ModelValue.ts +19 -11
  237. package/src/instance/Note.ts +40 -64
  238. package/src/instance/PrimaryInstance.ts +70 -31
  239. package/src/instance/RangeControl.ts +119 -0
  240. package/src/instance/RankControl.ts +208 -0
  241. package/src/instance/Root.ts +21 -31
  242. package/src/instance/SelectControl.ts +228 -0
  243. package/src/instance/Subtree.ts +17 -15
  244. package/src/instance/TriggerControl.ts +50 -80
  245. package/src/instance/abstract/DescendantNode.ts +13 -8
  246. package/src/instance/abstract/InstanceNode.ts +19 -7
  247. package/src/instance/abstract/ValueNode.ts +14 -15
  248. package/src/instance/children/DescendantNodeInitOptions.ts +35 -0
  249. package/src/instance/children/buildChildren.ts +206 -0
  250. package/src/instance/children/childrenInitOptions.ts +117 -0
  251. package/src/instance/children/normalizeChildInitOptions.ts +332 -0
  252. package/src/instance/hierarchy.ts +21 -16
  253. package/src/instance/input/InitialInstanceState.ts +108 -0
  254. package/src/instance/input/InstanceAttachmentMap.ts +142 -0
  255. package/src/instance/internal-api/InstanceConfig.ts +3 -10
  256. package/src/instance/internal-api/InstanceValueContext.ts +11 -1
  257. package/src/instance/internal-api/serialization/ClientReactiveSerializableInstance.ts +20 -0
  258. package/src/instance/internal-api/serialization/ClientReactiveSerializableLeafNode.ts +43 -0
  259. package/src/instance/internal-api/serialization/ClientReactiveSerializableParentNode.ts +26 -0
  260. package/src/instance/internal-api/serialization/ClientReactiveSerializableTemplatedNode.ts +24 -0
  261. package/src/instance/internal-api/serialization/ClientReactiveSerializableValueNode.ts +28 -0
  262. package/src/instance/repeat/BaseRepeatRange.ts +21 -24
  263. package/src/instance/repeat/RepeatInstance.ts +27 -19
  264. package/src/instance/repeat/RepeatRangeControlled.ts +90 -17
  265. package/src/instance/repeat/RepeatRangeUncontrolled.ts +10 -9
  266. package/src/instance/resource.ts +18 -2
  267. package/src/instance/unsupported/UploadControl.ts +116 -5
  268. package/src/integration/xpath/EngineXPathEvaluator.ts +2 -2
  269. package/src/integration/xpath/adapter/kind.ts +1 -28
  270. package/src/integration/xpath/adapter/names.ts +66 -17
  271. package/src/integration/xpath/adapter/traversal.ts +12 -11
  272. package/src/integration/xpath/static-dom/StaticAttribute.ts +16 -7
  273. package/src/integration/xpath/static-dom/StaticDocument.ts +17 -18
  274. package/src/integration/xpath/static-dom/StaticElement.ts +211 -52
  275. package/src/integration/xpath/static-dom/StaticNode.ts +1 -1
  276. package/src/integration/xpath/static-dom/StaticParentNode.ts +22 -0
  277. package/src/integration/xpath/static-dom/staticNodeName.ts +20 -0
  278. package/src/lib/client-reactivity/instance-state/createNodeRangeInstanceState.ts +17 -0
  279. package/src/lib/client-reactivity/instance-state/createParentNodeInstanceState.ts +22 -0
  280. package/src/lib/client-reactivity/instance-state/createPrimaryInstanceState.ts +12 -0
  281. package/src/lib/client-reactivity/instance-state/createRootInstanceState.ts +19 -0
  282. package/src/lib/client-reactivity/instance-state/createTemplatedNodeInstanceState.ts +31 -0
  283. package/src/lib/client-reactivity/instance-state/createValueNodeInstanceState.ts +21 -0
  284. package/src/lib/client-reactivity/instance-state/prepareInstancePayload.ts +173 -0
  285. package/src/lib/codecs/Geopoint/Geopoint.ts +150 -0
  286. package/src/lib/codecs/Geopoint/GeopointValueCodec.ts +20 -0
  287. package/src/lib/codecs/NoteCodec.ts +32 -0
  288. package/src/lib/codecs/RangeCodec.ts +65 -0
  289. package/src/lib/codecs/TempUnsupportedControlCodec.ts +32 -0
  290. package/src/lib/codecs/TriggerCodec.ts +64 -0
  291. package/src/lib/codecs/ValueArrayCodec.ts +42 -0
  292. package/src/lib/codecs/ValueCodec.ts +2 -2
  293. package/src/lib/codecs/getNoteCodec.ts +27 -0
  294. package/src/lib/codecs/getSelectCodec.ts +27 -0
  295. package/src/lib/codecs/getSharedValueCodec.ts +5 -3
  296. package/src/lib/codecs/items/BaseItemCodec.ts +20 -0
  297. package/src/lib/codecs/items/MultipleValueItemCodec.ts +28 -0
  298. package/src/lib/codecs/items/SingleValueItemCodec.ts +67 -0
  299. package/src/lib/dom/query.ts +1 -2
  300. package/src/lib/names/NamespaceDeclaration.ts +106 -0
  301. package/src/lib/names/NamespaceDeclarationMap.ts +228 -0
  302. package/src/lib/names/NamespaceURL.ts +44 -0
  303. package/src/lib/names/QualifiedName.ts +170 -0
  304. package/src/lib/names/UnprefixedXFormsName.ts +12 -0
  305. package/src/lib/number-parsers.ts +25 -0
  306. package/src/lib/reactivity/createInstanceValueState.ts +69 -43
  307. package/src/lib/reactivity/{createSelectItems.ts → createItemCollection.ts} +41 -36
  308. package/src/lib/xml-serialization.ts +76 -9
  309. package/src/parse/XFormDOM.ts +141 -21
  310. package/src/parse/XFormDefinition.ts +1 -4
  311. package/src/parse/body/BodyDefinition.ts +4 -4
  312. package/src/parse/body/appearance/rangeAppearanceParser.ts +11 -0
  313. package/src/parse/body/control/InputControlDefinition.ts +9 -0
  314. package/src/parse/body/control/{select/ItemDefinition.ts → ItemDefinition.ts} +8 -6
  315. package/src/parse/body/control/{select/ItemsetDefinition.ts → ItemsetDefinition.ts} +11 -9
  316. package/src/parse/body/control/RangeControlDefinition.ts +91 -6
  317. package/src/parse/body/control/RankControlDefinition.ts +25 -7
  318. package/src/parse/body/control/{select/SelectDefinition.ts → SelectControlDefinition.ts} +9 -9
  319. package/src/parse/expression/ItemsetNodesetExpression.ts +1 -1
  320. package/src/parse/expression/ItemsetValueExpression.ts +1 -1
  321. package/src/parse/model/BindDefinition.ts +4 -0
  322. package/src/parse/model/BindPreloadDefinition.ts +100 -0
  323. package/src/parse/model/DescendentNodeDefinition.ts +7 -25
  324. package/src/parse/model/ItextTranslationsDefinition.ts +79 -0
  325. package/src/parse/model/LeafNodeDefinition.ts +13 -8
  326. package/src/parse/model/ModelDefinition.ts +36 -3
  327. package/src/parse/model/NodeDefinition.ts +38 -85
  328. package/src/parse/model/NoteNodeDefinition.ts +12 -10
  329. package/src/parse/model/RangeNodeDefinition.ts +119 -0
  330. package/src/parse/model/RepeatDefinition.ts +382 -0
  331. package/src/parse/model/RootAttributeDefinition.ts +44 -0
  332. package/src/parse/model/RootAttributeMap.ts +49 -0
  333. package/src/parse/model/RootDefinition.ts +42 -43
  334. package/src/parse/model/SecondaryInstance/SecondaryInstancesDefinition.ts +23 -2
  335. package/src/parse/model/SecondaryInstance/assertSecondaryInstanceDefinition.ts +14 -0
  336. package/src/parse/model/SecondaryInstance/defineSecondaryInstance.ts +32 -0
  337. package/src/parse/model/SecondaryInstance/sources/BlankSecondaryInstanceSource.ts +3 -24
  338. package/src/parse/model/SecondaryInstance/sources/CSVExternalSecondaryInstance.ts +33 -86
  339. package/src/parse/model/SecondaryInstance/sources/GeoJSONExternalSecondaryInstance.ts +64 -136
  340. package/src/parse/model/SecondaryInstance/sources/InternalSecondaryInstanceSource.ts +9 -7
  341. package/src/parse/model/SecondaryInstance/sources/SecondaryInstanceSource.ts +1 -1
  342. package/src/parse/model/SecondaryInstance/sources/XMLExternalSecondaryInstanceSource.ts +7 -7
  343. package/src/parse/model/{FormSubmissionDefinition.ts → SubmissionDefinition.ts} +2 -2
  344. package/src/parse/model/SubtreeDefinition.ts +15 -16
  345. package/src/parse/model/nodeDefinitionMap.ts +34 -0
  346. package/src/parse/shared/parseInstanceXML.ts +79 -0
  347. package/src/parse/shared/parseStaticDocumentFromDOMSubtree.ts +46 -131
  348. package/src/parse/text/ItemLabelDefinition.ts +1 -1
  349. package/src/parse/text/ItemsetLabelDefinition.ts +2 -2
  350. package/src/parse/text/abstract/TextElementDefinition.ts +1 -1
  351. package/src/parse/xpath/semantic-analysis.ts +4 -3
  352. package/dist/client/EngineConfig.d.ts +0 -79
  353. package/dist/client/submission/SubmissionData.d.ts +0 -7
  354. package/dist/client/submission/SubmissionInstanceFile.d.ts +0 -6
  355. package/dist/client/submission/SubmissionOptions.d.ts +0 -23
  356. package/dist/client/submission/SubmissionResult.d.ts +0 -91
  357. package/dist/client/submission/SubmissionState.d.ts +0 -12
  358. package/dist/client/unsupported/RangeNode.d.ts +0 -9
  359. package/dist/client/unsupported/RankNode.d.ts +0 -9
  360. package/dist/instance/SelectField.d.ts +0 -58
  361. package/dist/instance/abstract/UnsupportedControl.d.ts +0 -53
  362. package/dist/instance/index.d.ts +0 -8
  363. package/dist/instance/internal-api/ValueContext.d.ts +0 -23
  364. package/dist/instance/internal-api/submission/ClientReactiveSubmittableInstance.d.ts +0 -14
  365. package/dist/instance/internal-api/submission/ClientReactiveSubmittableLeafNode.d.ts +0 -31
  366. package/dist/instance/internal-api/submission/ClientReactiveSubmittableParentNode.d.ts +0 -18
  367. package/dist/instance/internal-api/submission/ClientReactiveSubmittableValueNode.d.ts +0 -17
  368. package/dist/instance/unsupported/RangeControl.d.ts +0 -6
  369. package/dist/instance/unsupported/RankControl.d.ts +0 -6
  370. package/dist/integration/xpath/static-dom/StaticNamedNode.d.ts +0 -17
  371. package/dist/lib/client-reactivity/submission/createInstanceSubmissionState.d.ts +0 -3
  372. package/dist/lib/client-reactivity/submission/createLeafNodeSubmissionState.d.ts +0 -3
  373. package/dist/lib/client-reactivity/submission/createNodeRangeSubmissionState.d.ts +0 -4
  374. package/dist/lib/client-reactivity/submission/createParentNodeSubmissionState.d.ts +0 -4
  375. package/dist/lib/client-reactivity/submission/createValueNodeSubmissionState.d.ts +0 -3
  376. package/dist/lib/client-reactivity/submission/prepareSubmission.d.ts +0 -8
  377. package/dist/lib/reactivity/createSelectItems.d.ts +0 -16
  378. package/dist/lib/reactivity/createValueState.d.ts +0 -40
  379. package/dist/parse/body/control/select/ItemDefinition.d.ts +0 -13
  380. package/dist/parse/body/control/select/ItemsetDefinition.d.ts +0 -17
  381. package/dist/parse/body/control/select/ItemsetNodesetContext.d.ts +0 -9
  382. package/dist/parse/model/ItextTranslation/ItextTranslationDefinition.d.ts +0 -4
  383. package/dist/parse/model/ItextTranslation/ItextTranslationRootDefinition.d.ts +0 -8
  384. package/dist/parse/model/ItextTranslation/ItextTranslationsDefinition.d.ts +0 -8
  385. package/dist/parse/model/RepeatInstanceDefinition.d.ts +0 -14
  386. package/dist/parse/model/RepeatRangeDefinition.d.ts +0 -29
  387. package/dist/parse/model/RepeatTemplateDefinition.d.ts +0 -28
  388. package/dist/parse/model/SecondaryInstance/SecondaryInstanceDefinition.d.ts +0 -4
  389. package/dist/parse/model/SecondaryInstance/SecondaryInstanceRootDefinition.d.ts +0 -7
  390. package/src/client/EngineConfig.ts +0 -84
  391. package/src/client/submission/SubmissionData.ts +0 -12
  392. package/src/client/submission/SubmissionInstanceFile.ts +0 -9
  393. package/src/client/submission/SubmissionOptions.ts +0 -28
  394. package/src/client/submission/SubmissionResult.ts +0 -124
  395. package/src/client/submission/SubmissionState.ts +0 -14
  396. package/src/client/unsupported/RangeNode.ts +0 -14
  397. package/src/client/unsupported/RankNode.ts +0 -14
  398. package/src/instance/SelectField.ts +0 -263
  399. package/src/instance/abstract/UnsupportedControl.ts +0 -174
  400. package/src/instance/children.ts +0 -158
  401. package/src/instance/index.ts +0 -55
  402. package/src/instance/internal-api/ValueContext.ts +0 -28
  403. package/src/instance/internal-api/submission/ClientReactiveSubmittableInstance.ts +0 -20
  404. package/src/instance/internal-api/submission/ClientReactiveSubmittableLeafNode.ts +0 -42
  405. package/src/instance/internal-api/submission/ClientReactiveSubmittableParentNode.ts +0 -25
  406. package/src/instance/internal-api/submission/ClientReactiveSubmittableValueNode.ts +0 -23
  407. package/src/instance/unsupported/RangeControl.ts +0 -9
  408. package/src/instance/unsupported/RankControl.ts +0 -9
  409. package/src/integration/xpath/static-dom/StaticNamedNode.ts +0 -45
  410. package/src/lib/client-reactivity/submission/createInstanceSubmissionState.ts +0 -12
  411. package/src/lib/client-reactivity/submission/createLeafNodeSubmissionState.ts +0 -20
  412. package/src/lib/client-reactivity/submission/createNodeRangeSubmissionState.ts +0 -17
  413. package/src/lib/client-reactivity/submission/createParentNodeSubmissionState.ts +0 -22
  414. package/src/lib/client-reactivity/submission/createValueNodeSubmissionState.ts +0 -21
  415. package/src/lib/client-reactivity/submission/prepareSubmission.ts +0 -172
  416. package/src/lib/reactivity/createValueState.ts +0 -200
  417. package/src/parse/body/control/select/ItemsetNodesetContext.ts +0 -21
  418. package/src/parse/model/ItextTranslation/ItextTranslationDefinition.ts +0 -4
  419. package/src/parse/model/ItextTranslation/ItextTranslationRootDefinition.ts +0 -41
  420. package/src/parse/model/ItextTranslation/ItextTranslationsDefinition.ts +0 -31
  421. package/src/parse/model/RepeatInstanceDefinition.ts +0 -34
  422. package/src/parse/model/RepeatRangeDefinition.ts +0 -94
  423. package/src/parse/model/RepeatTemplateDefinition.ts +0 -145
  424. package/src/parse/model/SecondaryInstance/SecondaryInstanceDefinition.ts +0 -4
  425. package/src/parse/model/SecondaryInstance/SecondaryInstanceRootDefinition.ts +0 -12
@@ -1,82 +1,78 @@
1
+ import type { StaticElement } from '../../integration/xpath/static-dom/StaticElement.ts';
2
+ import { NamespaceDeclarationMap } from '../../lib/names/NamespaceDeclarationMap.ts';
3
+ import { QualifiedName } from '../../lib/names/QualifiedName.ts';
1
4
  import type { BodyClassList } from '../body/BodyDefinition.ts';
2
5
  import type { XFormDefinition } from '../XFormDefinition.ts';
3
- import type { BindDefinition } from './BindDefinition.ts';
4
- import type { FormSubmissionDefinition } from './FormSubmissionDefinition.ts';
5
6
  import { LeafNodeDefinition } from './LeafNodeDefinition.ts';
6
7
  import type { ModelDefinition } from './ModelDefinition.ts';
7
- import type {
8
- ChildNodeDefinition,
9
- NodeDefinition,
10
- ParentNodeDefinition,
11
- } from './NodeDefinition.ts';
8
+ import type { ChildNodeDefinition, ParentNodeDefinition } from './NodeDefinition.ts';
9
+ import { NodeDefinition } from './NodeDefinition.ts';
12
10
  import { NoteNodeDefinition } from './NoteNodeDefinition.ts';
13
- import { RepeatRangeDefinition } from './RepeatRangeDefinition.ts';
11
+ import { RangeNodeDefinition } from './RangeNodeDefinition.ts';
12
+ import { RepeatDefinition } from './RepeatDefinition.ts';
13
+ import { RootAttributeMap } from './RootAttributeMap.ts';
14
+ import type { SubmissionDefinition } from './SubmissionDefinition.ts';
14
15
  import { SubtreeDefinition } from './SubtreeDefinition.ts';
15
16
 
16
- export class RootDefinition implements NodeDefinition<'root'> {
17
+ export class RootDefinition extends NodeDefinition<'root'> {
17
18
  readonly type = 'root';
18
- readonly bind: BindDefinition;
19
- readonly nodeset: string;
20
- readonly nodeName: string;
19
+ readonly qualifiedName: QualifiedName;
21
20
  readonly bodyElement = null;
22
21
  readonly root = this;
23
22
  readonly parent = null;
23
+ readonly template: StaticElement;
24
+ readonly namespaceDeclarations: NamespaceDeclarationMap;
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
  ) {
36
+ const template = model.instance.root;
37
+ const qualifiedName = template.qualifiedName;
38
+ const nodeName = qualifiedName.getPrefixedName();
39
+
37
40
  // TODO: theoretically the pertinent step in the bind's `nodeset` *could* be
38
41
  // namespaced. It also may make more sense to determine the root nodeset
39
42
  // earlier (i.e. in the appropriate definition class).
40
- //
41
- // TODO: while it's unlikely a form actually defines a <bind> for the root,
42
- // if it did, bind nodesets are not yet normalized, so `/root` may currently
43
- // be defined as `/ root` (or even `/ *` or any other valid expression
44
- // resolving to the root).
45
- const { primaryInstanceRoot } = form.xformDOM;
46
- const { localName: rootNodeName } = primaryInstanceRoot;
47
-
48
- this.nodeName = rootNodeName;
49
-
50
- const nodeset = `/${rootNodeName}`;
43
+ const nodeset = `/${nodeName}`;
51
44
  const bind = model.binds.get(nodeset);
52
45
 
53
46
  if (bind == null) {
54
47
  throw new Error('Missing root node bind definition');
55
48
  }
56
49
 
57
- this.bind = bind;
58
- this.nodeset = nodeset;
59
- this.node = primaryInstanceRoot;
60
- this.children = this.buildSubtree(this);
50
+ super(bind);
51
+
52
+ this.qualifiedName = qualifiedName;
53
+ this.template = template;
54
+ this.attributes = RootAttributeMap.from(this, template);
55
+ this.namespaceDeclarations = new NamespaceDeclarationMap(this);
56
+ this.children = this.buildSubtree(this, template);
61
57
  }
62
58
 
63
- buildSubtree(parent: ParentNodeDefinition): readonly ChildNodeDefinition[] {
59
+ buildSubtree(parent: ParentNodeDefinition, node: StaticElement): readonly ChildNodeDefinition[] {
64
60
  const { form, model } = this;
65
61
  const { body } = form;
66
62
  const { binds } = model;
67
- const { bind: parentBind, node } = parent;
63
+ const { bind: parentBind } = parent;
68
64
  const { nodeset: parentNodeset } = parentBind;
69
65
 
70
- const childrenByName = new Map<string, [Element, ...Element[]]>();
66
+ const childrenByName = new Map<string, [StaticElement, ...StaticElement[]]>();
71
67
 
72
- for (const child of node.children) {
73
- const { localName } = child;
68
+ for (const child of node.childElements) {
69
+ const nodeName = child.qualifiedName.getPrefixedName();
74
70
 
75
- let elements = childrenByName.get(localName);
71
+ let elements = childrenByName.get(nodeName);
76
72
 
77
73
  if (elements == null) {
78
74
  elements = [child];
79
- childrenByName.set(localName, elements);
75
+ childrenByName.set(nodeName, elements);
80
76
  } else {
81
77
  // TODO: check if previous element exists, was it previous element
82
78
  // sibling. Highly likely this should otherwise fail!
@@ -84,14 +80,14 @@ export class RootDefinition implements NodeDefinition<'root'> {
84
80
  }
85
81
  }
86
82
 
87
- return Array.from(childrenByName).map(([localName, children]) => {
88
- const nodeset = `${parentNodeset}/${localName}`;
83
+ return Array.from(childrenByName).map(([nodeName, children]) => {
84
+ const nodeset = `${parentNodeset}/${nodeName}`;
89
85
  const bind = binds.getOrCreateBindDefinition(nodeset);
90
86
  const bodyElement = body.getBodyElement(nodeset);
91
87
  const [firstChild, ...restChildren] = children;
92
88
 
93
89
  if (bodyElement?.type === 'repeat') {
94
- return RepeatRangeDefinition.from(parent, bind, bodyElement, children);
90
+ return RepeatDefinition.from(parent, bind, bodyElement, children);
95
91
  }
96
92
 
97
93
  if (restChildren.length) {
@@ -99,9 +95,12 @@ export class RootDefinition implements NodeDefinition<'root'> {
99
95
  }
100
96
 
101
97
  const element = firstChild;
102
- const isLeafNode = element.childElementCount === 0;
103
98
 
104
- if (isLeafNode) {
99
+ if (element.isLeafElement()) {
100
+ if (bodyElement?.type === 'range') {
101
+ return RangeNodeDefinition.from(parent, bind, bodyElement, element);
102
+ }
103
+
105
104
  return (
106
105
  NoteNodeDefinition.from(parent, bind, bodyElement, element) ??
107
106
  new LeafNodeDefinition(parent, bind, bodyElement, element)
@@ -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
+ };
@@ -1,10 +1,7 @@
1
- import { XFORMS_NAMESPACE_URI } from '@getodk/common/constants/xmlns.ts';
2
1
  import type { JRResourceURL } from '@getodk/common/jr-resources/JRResourceURL.ts';
3
- import type { StaticNode } from '../../../../integration/xpath/static-dom/StaticNode.ts';
4
- import { parseStaticDocumentFromDOMSubtree } from '../../../shared/parseStaticDocumentFromDOMSubtree.ts';
5
2
  import type { DOMSecondaryInstanceElement } from '../../../XFormDOM.ts';
6
- import { SecondaryInstanceDefinition } from '../SecondaryInstanceDefinition.ts';
7
- import { SecondaryInstanceRootDefinition } from '../SecondaryInstanceRootDefinition.ts';
3
+ import { defineSecondaryInstance } from '../defineSecondaryInstance.ts';
4
+ import type { SecondaryInstanceDefinition } from '../SecondaryInstancesDefinition.ts';
8
5
  import { SecondaryInstanceSource } from './SecondaryInstanceSource.ts';
9
6
 
10
7
  export class BlankSecondaryInstanceSource extends SecondaryInstanceSource<'blank'> {
@@ -16,25 +13,7 @@ export class BlankSecondaryInstanceSource extends SecondaryInstanceSource<'blank
16
13
  super('blank', instanceId, resourceURL, domElement);
17
14
  }
18
15
 
19
- /**
20
- * @todo there is really no sense in using the DOM for this, other than it was
21
- * quicker/more ergonomic than constructing the requisite {@link StaticNode}
22
- * structures directly. Pretty good sign those constructor signatures could
23
- * use some TLC!
24
- */
25
16
  parseDefinition(): SecondaryInstanceDefinition {
26
- const xmlDocument = this.domElement.ownerDocument.implementation.createDocument(
27
- XFORMS_NAMESPACE_URI,
28
- 'instance'
29
- );
30
- const instanceElement = xmlDocument.documentElement;
31
-
32
- instanceElement.setAttribute('id', this.instanceId);
33
-
34
- return parseStaticDocumentFromDOMSubtree(
35
- SecondaryInstanceDefinition,
36
- SecondaryInstanceRootDefinition,
37
- instanceElement
38
- );
17
+ return defineSecondaryInstance(this.instanceId, '');
39
18
  }
40
19
  }
@@ -1,12 +1,9 @@
1
- import { XFORMS_NAMESPACE_URI } from '@getodk/common/constants/xmlns.ts';
2
1
  import type { JRResourceURL } from '@getodk/common/jr-resources/JRResourceURL.ts';
3
2
  import * as papa from 'papaparse';
4
3
  import { ErrorProductionDesignPendingError } from '../../../../error/ErrorProductionDesignPendingError.ts';
5
- import { StaticAttribute } from '../../../../integration/xpath/static-dom/StaticAttribute.ts';
6
- import { StaticElement } from '../../../../integration/xpath/static-dom/StaticElement.ts';
7
- import { StaticText } from '../../../../integration/xpath/static-dom/StaticText.ts';
8
- import { SecondaryInstanceDefinition } from '../SecondaryInstanceDefinition.ts';
9
- import { SecondaryInstanceRootDefinition } from '../SecondaryInstanceRootDefinition.ts';
4
+ import type { StaticElementOptions } from '../../../../integration/xpath/static-dom/StaticElement.ts';
5
+ import { defineSecondaryInstance } from '../defineSecondaryInstance.ts';
6
+ import type { SecondaryInstanceDefinition } from '../SecondaryInstancesDefinition.ts';
10
7
  import { ExternalSecondaryInstanceSource } from './ExternalSecondaryInstanceSource.ts';
11
8
 
12
9
  type CSVColumn = string;
@@ -88,89 +85,39 @@ interface CSVExternalSecondaryInstanceItemColumn {
88
85
 
89
86
  type CSVExternalSecondaryInstanceItem = readonly CSVExternalSecondaryInstanceItemColumn[];
90
87
 
91
- class CSVExternalSecondaryInstanceColumnElement extends StaticElement {
92
- constructor(parent: StaticElement, column: CSVExternalSecondaryInstanceItemColumn) {
93
- const { columnName, cellValue } = column;
94
-
95
- super(
96
- parent,
97
- () => [],
98
- (self) => [new StaticText(self, cellValue)],
99
- {
100
- namespaceURI: XFORMS_NAMESPACE_URI,
101
- localName: columnName,
102
- }
103
- );
104
- }
105
- }
88
+ const columnChildOption = (
89
+ column: CSVExternalSecondaryInstanceItemColumn
90
+ ): StaticElementOptions => {
91
+ const { columnName, cellValue } = column;
106
92
 
107
- class CSVExternalSecondaryInstanceItemElement extends StaticElement {
108
- constructor(parent: StaticElement, item: CSVExternalSecondaryInstanceItem) {
109
- super(
110
- parent,
111
- () => [],
112
- (self) => {
113
- return item.map((column) => {
114
- return new CSVExternalSecondaryInstanceColumnElement(self, column);
115
- });
116
- },
117
- {
118
- namespaceURI: XFORMS_NAMESPACE_URI,
119
- localName: 'item',
120
- }
121
- );
122
- }
123
- }
93
+ return {
94
+ name: columnName,
95
+ children: [cellValue],
96
+ };
97
+ };
124
98
 
125
- class CSVExternalSecondaryInstanceRootElement extends StaticElement {
126
- constructor(parent: StaticElement, items: readonly CSVExternalSecondaryInstanceItem[]) {
127
- super(
128
- parent,
129
- () => [],
130
- (self) => {
131
- return items.map((item) => {
132
- return new CSVExternalSecondaryInstanceItemElement(self, item);
133
- });
134
- },
135
- {
136
- namespaceURI: XFORMS_NAMESPACE_URI,
137
- localName: 'root',
138
- }
139
- );
140
- }
141
- }
99
+ const itemChildOption = (item: CSVExternalSecondaryInstanceItem): StaticElementOptions => {
100
+ return {
101
+ name: 'item',
102
+ children: item.map(columnChildOption),
103
+ };
104
+ };
142
105
 
143
- class CSVExternalSecondaryInstanceDocumentElement extends SecondaryInstanceRootDefinition {
144
- constructor(
145
- instanceId: string,
146
- parent: CSVExternalSecondaryInstanceDefinition,
147
- items: readonly CSVExternalSecondaryInstanceItem[]
148
- ) {
149
- super(
150
- parent,
151
- (self) => [
152
- new StaticAttribute(self, {
153
- namespaceURI: XFORMS_NAMESPACE_URI,
154
- localName: 'id',
155
- value: instanceId,
156
- }),
157
- ],
158
- (self) => [new CSVExternalSecondaryInstanceRootElement(self, items)],
159
- {
160
- namespaceURI: XFORMS_NAMESPACE_URI,
161
- localName: 'instance',
162
- }
163
- );
164
- }
165
- }
106
+ const rootChildOption = (
107
+ items: readonly CSVExternalSecondaryInstanceItem[]
108
+ ): StaticElementOptions => {
109
+ return {
110
+ name: 'root',
111
+ children: items.map(itemChildOption),
112
+ };
113
+ };
166
114
 
167
- class CSVExternalSecondaryInstanceDefinition extends SecondaryInstanceDefinition {
168
- constructor(instanceId: string, items: readonly CSVExternalSecondaryInstanceItem[]) {
169
- super((self) => {
170
- return new CSVExternalSecondaryInstanceDocumentElement(instanceId, self, items);
171
- });
172
- }
173
- }
115
+ const csvExternalSecondaryInstanceDefinition = (
116
+ instanceId: string,
117
+ items: readonly CSVExternalSecondaryInstanceItem[]
118
+ ): SecondaryInstanceDefinition => {
119
+ return defineSecondaryInstance(instanceId, rootChildOption(items));
120
+ };
174
121
 
175
122
  export class CSVExternalSecondaryInstanceSource extends ExternalSecondaryInstanceSource<'csv'> {
176
123
  /**
@@ -283,6 +230,6 @@ export class CSVExternalSecondaryInstanceSource extends ExternalSecondaryInstanc
283
230
  });
284
231
  const items = this.toItems(columns, rows);
285
232
 
286
- return new CSVExternalSecondaryInstanceDefinition(this.instanceId, items);
233
+ return csvExternalSecondaryInstanceDefinition(this.instanceId, items);
287
234
  }
288
235
  }
@@ -1,4 +1,3 @@
1
- import { XFORMS_NAMESPACE_URI } from '@getodk/common/constants/xmlns.ts';
2
1
  import { UnreachableError } from '@getodk/common/lib/error/UnreachableError.ts';
3
2
  import { assertUnknownArray } from '@getodk/common/lib/type-assertions/assertUnknownArray.ts';
4
3
  import type { UnknownObject } from '@getodk/common/lib/type-assertions/assertUnknownObject.ts';
@@ -12,11 +11,9 @@ import type {
12
11
  FeatureCollection as GeoJSONFeatureCollection,
13
12
  } from 'geojson';
14
13
  import { ErrorProductionDesignPendingError } from '../../../../error/ErrorProductionDesignPendingError.ts';
15
- import { StaticAttribute } from '../../../../integration/xpath/static-dom/StaticAttribute.ts';
16
- import { StaticElement } from '../../../../integration/xpath/static-dom/StaticElement.ts';
17
- import { StaticText } from '../../../../integration/xpath/static-dom/StaticText.ts';
18
- import { SecondaryInstanceDefinition } from '../SecondaryInstanceDefinition.ts';
19
- import { SecondaryInstanceRootDefinition } from '../SecondaryInstanceRootDefinition.ts';
14
+ import type { StaticElementOptions } from '../../../../integration/xpath/static-dom/StaticElement.ts';
15
+ import { defineSecondaryInstance } from '../defineSecondaryInstance.ts';
16
+ import type { SecondaryInstanceDefinition } from '../SecondaryInstancesDefinition.ts';
20
17
  import { ExternalSecondaryInstanceSource } from './ExternalSecondaryInstanceSource.ts';
21
18
 
22
19
  const FEATURE_COLLECTION = 'FeatureCollection';
@@ -252,155 +249,86 @@ const serializeCoordinates = (coordinates: LongLatCoordinates): SerializedCoordi
252
249
  return `${latitude} ${longitude} 0 0`;
253
250
  };
254
251
 
255
- class GeoJSONSecondaryInstanceFeatureGeometryElement extends StaticElement {
256
- static from(
257
- parent: StaticElement,
258
- feature: Feature
259
- ): GeoJSONSecondaryInstanceFeatureGeometryElement {
260
- const { geometry } = feature;
252
+ const geometryValues = (geometry: SupportedGeometry): readonly string[] => {
253
+ switch (geometry.type) {
254
+ case 'LineString':
255
+ return geometry.coordinates.map(serializeCoordinates);
261
256
 
262
- switch (geometry.type) {
263
- case 'LineString':
264
- return new this(parent, geometry.coordinates);
257
+ case 'Point':
258
+ return [serializeCoordinates(geometry.coordinates)];
265
259
 
266
- case 'Point':
267
- return new this(parent, [geometry.coordinates]);
260
+ case 'Polygon': {
261
+ const [coordinates = []] = geometry.coordinates;
268
262
 
269
- case 'Polygon':
270
- return new this(parent, geometry.coordinates[0] ?? []);
271
-
272
- default:
273
- throw new UnreachableError(geometry);
263
+ return coordinates.map(serializeCoordinates);
274
264
  }
275
- }
276
265
 
277
- constructor(parent: StaticElement, points: readonly LongLatCoordinates[]) {
278
- const values = points.map(serializeCoordinates);
279
- const value = values.join('; ');
280
-
281
- super(
282
- parent,
283
- () => [],
284
- (self) => [new StaticText(self, value)],
285
- {
286
- namespaceURI: XFORMS_NAMESPACE_URI,
287
- localName: 'geometry',
288
- }
289
- );
266
+ default:
267
+ throw new UnreachableError(geometry);
290
268
  }
291
- }
269
+ };
292
270
 
293
- class GeoJSONSecondaryInstanceFeaturePropertyElement extends StaticElement {
294
- static *buildPropertyElements(
295
- parent: StaticElement,
296
- feature: Feature
297
- ): Iterable<GeoJSONSecondaryInstanceFeaturePropertyElement> {
298
- const { properties } = feature;
271
+ const geometryChildElementOption = (feature: Feature): StaticElementOptions => {
272
+ const { geometry } = feature;
273
+ const values = geometryValues(geometry);
274
+ const value = values.join('; ');
299
275
 
300
- if (properties == null) {
301
- return [];
302
- }
276
+ return {
277
+ name: 'geometry',
278
+ children: [value],
279
+ };
280
+ };
303
281
 
304
- const { id: propertiesId, ...nonIdProperties } = properties;
305
- const { id = propertiesId } = feature;
282
+ const propertyChildOption = (propertyName: string, propertyValue: string): StaticElementOptions => {
283
+ return {
284
+ name: propertyName,
285
+ children: [propertyValue],
286
+ };
287
+ };
306
288
 
307
- if (id !== undefined) {
308
- yield new this(parent, 'id', String(id));
309
- }
289
+ function* propertyChildOptions(feature: Feature): Iterable<StaticElementOptions> {
290
+ const { properties } = feature;
310
291
 
311
- for (const [propertyName, propertyValue] of Object.entries(nonIdProperties)) {
312
- yield new this(parent, propertyName, String(propertyValue));
313
- }
292
+ if (properties == null) {
293
+ return [];
314
294
  }
315
295
 
316
- constructor(parent: StaticElement, propertyName: string, propertyValue: string) {
317
- super(
318
- parent,
319
- () => [],
320
- (self) => [new StaticText(self, propertyValue)],
321
- {
322
- namespaceURI: XFORMS_NAMESPACE_URI,
323
- localName: propertyName,
324
- }
325
- );
326
- }
327
- }
296
+ const { id: propertiesId, ...nonIdProperties } = properties;
297
+ const { id = propertiesId } = feature;
328
298
 
329
- class GeoJSONSecondaryInstanceFeatureItemElement extends StaticElement {
330
- constructor(parent: StaticElement, feature: Feature) {
331
- super(
332
- parent,
333
- () => [],
334
- (self) => {
335
- const geometry = GeoJSONSecondaryInstanceFeatureGeometryElement.from(self, feature);
336
- const properties = GeoJSONSecondaryInstanceFeaturePropertyElement.buildPropertyElements(
337
- self,
338
- feature
339
- );
340
-
341
- return [geometry, ...properties];
342
- },
343
- {
344
- namespaceURI: XFORMS_NAMESPACE_URI,
345
- localName: 'item',
346
- }
347
- );
299
+ if (id !== undefined) {
300
+ // eslint-disable-next-line @typescript-eslint/no-base-to-string -- Intentional fallback, we don't know what this is and it could be any permutation of JSON
301
+ yield propertyChildOption('id', String(id));
348
302
  }
349
- }
350
303
 
351
- class GeoJSONSecondaryInstanceRootElement extends StaticElement {
352
- constructor(parent: StaticElement, featureCollection: FeatureCollection) {
353
- super(
354
- parent,
355
- () => [],
356
- (self) => {
357
- return featureCollection.features.map((feature) => {
358
- return new GeoJSONSecondaryInstanceFeatureItemElement(self, feature);
359
- });
360
- },
361
- {
362
- namespaceURI: XFORMS_NAMESPACE_URI,
363
- localName: 'root',
364
- }
365
- );
304
+ for (const [propertyName, propertyValue] of Object.entries(nonIdProperties)) {
305
+ yield propertyChildOption(propertyName, String(propertyValue));
366
306
  }
367
307
  }
368
308
 
369
- class GeoJSONExternalSecondaryInstanceDocumentElement extends SecondaryInstanceRootDefinition {
370
- constructor(
371
- instanceId: string,
372
- parent: GeoJSONExternalSecondaryInstanceDefinition,
373
- featureCollection: FeatureCollection
374
- ) {
375
- super(
376
- parent,
377
- (self) => [
378
- new StaticAttribute(self, {
379
- namespaceURI: XFORMS_NAMESPACE_URI,
380
- localName: 'id',
381
- value: instanceId,
382
- }),
383
- ],
384
- (self) => [new GeoJSONSecondaryInstanceRootElement(self, featureCollection)],
385
- {
386
- namespaceURI: XFORMS_NAMESPACE_URI,
387
- localName: 'instance',
388
- }
389
- );
390
- }
391
- }
309
+ const itemChildOption = (feature: Feature): StaticElementOptions => {
310
+ const geometry = geometryChildElementOption(feature);
311
+ const properties = propertyChildOptions(feature);
392
312
 
393
- class GeoJSONExternalSecondaryInstanceDefinition extends SecondaryInstanceDefinition {
394
- constructor(instanceId: string, featureCollection: FeatureCollection) {
395
- super((self) => {
396
- return new GeoJSONExternalSecondaryInstanceDocumentElement(
397
- instanceId,
398
- self,
399
- featureCollection
400
- );
401
- });
402
- }
403
- }
313
+ return {
314
+ name: 'item',
315
+ children: [geometry, ...properties],
316
+ };
317
+ };
318
+
319
+ const rootChildOption = (featureCollection: FeatureCollection): StaticElementOptions => {
320
+ return {
321
+ name: 'root',
322
+ children: featureCollection.features.map(itemChildOption),
323
+ };
324
+ };
325
+
326
+ const geoJSONExternalSecondaryInstanceDefinition = (
327
+ instanceId: string,
328
+ featureCollection: FeatureCollection
329
+ ): SecondaryInstanceDefinition => {
330
+ return defineSecondaryInstance(instanceId, rootChildOption(featureCollection));
331
+ };
404
332
 
405
333
  export class GeoJSONExternalSecondaryInstanceSource extends ExternalSecondaryInstanceSource<'geojson'> {
406
334
  parseDefinition(): SecondaryInstanceDefinition {
@@ -409,6 +337,6 @@ export class GeoJSONExternalSecondaryInstanceSource extends ExternalSecondaryIns
409
337
 
410
338
  assertFeatureCollection(value);
411
339
 
412
- return new GeoJSONExternalSecondaryInstanceDefinition(this.instanceId, value);
340
+ return geoJSONExternalSecondaryInstanceDefinition(this.instanceId, value);
413
341
  }
414
342
  }