@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
@@ -0,0 +1,44 @@
1
+ import type { AnyFunction } from '@getodk/common/types/helpers.js';
2
+ import type { CreateFormInstance } from '../../client/form/CreateFormInstance.ts';
3
+ import type { EditFormInstance } from '../../client/form/EditFormInstance.ts';
4
+ import type {
5
+ FailedLoadFormResultMethod,
6
+ LoadFormFailureResult,
7
+ LoadFormWarnings,
8
+ } from '../../client/form/LoadFormResult.ts';
9
+ import type { RestoreFormInstance } from '../../client/form/RestoreFormInstance.ts';
10
+ import { LoadFormFailureError } from '../../error/LoadFormFailureError.ts';
11
+ import { BaseFormResult } from './BaseFormResult.ts';
12
+
13
+ interface FormFailureOptions {
14
+ readonly error: LoadFormFailureError;
15
+ readonly warnings: LoadFormWarnings | null;
16
+ }
17
+
18
+ const failedFormResultMethodFactory = <T extends AnyFunction>(
19
+ cause: LoadFormFailureError
20
+ ): FailedLoadFormResultMethod<T> => {
21
+ return () => {
22
+ throw new Error(cause.message, { cause });
23
+ };
24
+ };
25
+
26
+ export class FormFailureResult extends BaseFormResult<'failure'> implements LoadFormFailureResult {
27
+ readonly createInstance: FailedLoadFormResultMethod<CreateFormInstance>;
28
+ readonly editInstance: FailedLoadFormResultMethod<EditFormInstance>;
29
+ readonly restoreInstance: FailedLoadFormResultMethod<RestoreFormInstance>;
30
+
31
+ constructor(options: FormFailureOptions) {
32
+ const { error, warnings } = options;
33
+
34
+ super({
35
+ status: 'failure',
36
+ warnings,
37
+ error,
38
+ });
39
+
40
+ this.createInstance = failedFormResultMethodFactory(error);
41
+ this.editInstance = failedFormResultMethodFactory(error);
42
+ this.restoreInstance = failedFormResultMethodFactory(error);
43
+ }
44
+ }
@@ -0,0 +1,25 @@
1
+ import type { LoadFormSuccessResult } from '../../client/index.ts';
2
+ import type { BasePrimaryInstanceOptions } from '../../instance/PrimaryInstance.ts';
3
+ import type { FormResource } from '../../instance/resource.ts';
4
+ import type { ReactiveScope } from '../../lib/reactivity/scope.ts';
5
+ import { BaseInstantiableFormResult } from './BaseInstantiableFormResult.ts';
6
+
7
+ export interface FormSuccessResultOptions {
8
+ readonly warnings: null;
9
+ readonly error: null;
10
+ readonly scope: ReactiveScope;
11
+ readonly formResource: FormResource;
12
+ readonly instanceOptions: BasePrimaryInstanceOptions;
13
+ }
14
+
15
+ export class FormSuccessResult
16
+ extends BaseInstantiableFormResult<'success'>
17
+ implements LoadFormSuccessResult
18
+ {
19
+ constructor(options: FormSuccessResultOptions) {
20
+ super({
21
+ status: 'success',
22
+ ...options,
23
+ });
24
+ }
25
+ }
@@ -0,0 +1,25 @@
1
+ import type { LoadFormWarningResult, LoadFormWarnings } from '../../client/form/LoadFormResult.ts';
2
+ import type { BasePrimaryInstanceOptions } from '../../instance/PrimaryInstance.ts';
3
+ import type { FormResource } from '../../instance/resource.ts';
4
+ import type { ReactiveScope } from '../../lib/reactivity/scope.ts';
5
+ import { BaseInstantiableFormResult } from './BaseInstantiableFormResult.ts';
6
+
7
+ export interface FormWarningResultOptions {
8
+ readonly warnings: LoadFormWarnings;
9
+ readonly error: null;
10
+ readonly scope: ReactiveScope;
11
+ readonly formResource: FormResource;
12
+ readonly instanceOptions: BasePrimaryInstanceOptions;
13
+ }
14
+
15
+ export class FormWarningResult
16
+ extends BaseInstantiableFormResult<'warning'>
17
+ implements LoadFormWarningResult
18
+ {
19
+ constructor(options: FormWarningResultOptions) {
20
+ super({
21
+ status: 'warning',
22
+ ...options,
23
+ });
24
+ }
25
+ }
@@ -0,0 +1,23 @@
1
+ import type { CreatedFormInstance } from '../client/form/CreateFormInstance.ts';
2
+ import type { FormInstanceConfig } from '../client/form/FormInstanceConfig.ts';
3
+ import type { LoadFormOptions } from '../client/form/LoadForm.ts';
4
+ import type { FormResource } from '../instance/resource.ts';
5
+ import { loadForm } from './loadForm.ts';
6
+
7
+ export interface CreateInstanceOptions {
8
+ readonly form?: LoadFormOptions;
9
+ readonly instance?: FormInstanceConfig;
10
+ }
11
+
12
+ export const createInstance = async (
13
+ formResource: FormResource,
14
+ options?: CreateInstanceOptions
15
+ ): Promise<CreatedFormInstance> => {
16
+ const form = await loadForm(formResource, options?.form);
17
+
18
+ if (form.status === 'failure') {
19
+ throw form.error;
20
+ }
21
+
22
+ return form.createInstance(options?.instance);
23
+ };
@@ -0,0 +1,24 @@
1
+ import type { EditedFormInstance, EditFormInstanceInput } from '../client/form/EditFormInstance.ts';
2
+ import type { FormInstanceConfig } from '../client/form/FormInstanceConfig.ts';
3
+ import type { LoadFormOptions } from '../client/form/LoadForm.ts';
4
+ import type { FormResource } from '../instance/resource.ts';
5
+ import { loadForm } from './loadForm.ts';
6
+
7
+ export interface EditInstanceOptions {
8
+ readonly form?: LoadFormOptions;
9
+ readonly instance?: FormInstanceConfig;
10
+ }
11
+
12
+ export const editInstance = async (
13
+ formResource: FormResource,
14
+ input: EditFormInstanceInput,
15
+ options?: EditInstanceOptions
16
+ ): Promise<EditedFormInstance> => {
17
+ const form = await loadForm(formResource, options?.form);
18
+
19
+ if (form.status === 'failure') {
20
+ throw form.error;
21
+ }
22
+
23
+ return form.editInstance(input, options?.instance);
24
+ };
@@ -0,0 +1,4 @@
1
+ export * from './createInstance.ts';
2
+ export * from './editInstance.ts';
3
+ export * from './loadForm.ts';
4
+ export * from './restoreInstance.ts';
@@ -0,0 +1,154 @@
1
+ import type { Owner } from 'solid-js';
2
+ import { getOwner } from 'solid-js';
3
+ import { MISSING_RESOURCE_BEHAVIOR } from '../client/constants.ts';
4
+ import type { FormResource } from '../client/form/FormResource.ts';
5
+ import type { LoadForm, LoadFormOptions } from '../client/form/LoadForm.ts';
6
+ import type { LoadFormResult } from '../client/form/LoadFormResult.ts';
7
+ import { LoadFormFailureError } from '../error/LoadFormFailureError.ts';
8
+ import { retrieveFormDefinition } from '../instance/resource.ts';
9
+ import type { ReactiveScope } from '../lib/reactivity/scope.ts';
10
+ import { createReactiveScope } from '../lib/reactivity/scope.ts';
11
+ import { XFormDOM } from '../parse/XFormDOM.ts';
12
+ import { XFormDefinition } from '../parse/XFormDefinition.ts';
13
+ import { SecondaryInstancesDefinition } from '../parse/model/SecondaryInstance/SecondaryInstancesDefinition.ts';
14
+ import { FormFailureResult } from './FormResult/FormFailureResult.ts';
15
+ import { FormSuccessResult } from './FormResult/FormSuccessResult.ts';
16
+
17
+ /**
18
+ * Creates a {@link ReactiveScope | reactive scope} from which all form
19
+ * instances derive, and:
20
+ *
21
+ * - if a client loads a form within a Solid reactive context, the scope will be
22
+ * disposed along with the client's reactive context; OR
23
+ * - if a client loads a form outside a Solid reactive context (typically: if a
24
+ * client does not use Solid reactivity), the scope will disposed if and when
25
+ * the engine drops access to the loaded form
26
+ *
27
+ * **IMPORTANT:** this **MUST** be called synchronously. If it is called in an
28
+ * `async` function, it **MUST** be called before any `await` expression; if it
29
+ * is called in any other flow with mixed synchrony, it must be called before
30
+ * yielding to the event loop. Failing to do this will cause the engine to lose
31
+ * access to a client's Solid reactive context, potentially leaking form
32
+ * reactivity indefinitely.
33
+ */
34
+ const createPotentiallyClientOwnedReactiveScope = (): ReactiveScope => {
35
+ /**
36
+ * A {@link clientOwner | client owner} is the owner of a client's Solid
37
+ * reactive context, if one exists. If none exists, the {@link ReactiveScope}
38
+ * is fully owned by the engine.
39
+ */
40
+ const clientOwner: Owner | null = getOwner();
41
+
42
+ return createReactiveScope({ owner: clientOwner });
43
+ };
44
+
45
+ type GlobalFetch = typeof globalThis.fetch;
46
+
47
+ type UnboundGlobalFetch = (this: void, ...args: Parameters<GlobalFetch>) => ReturnType<GlobalFetch>;
48
+
49
+ /**
50
+ * @see {@link https://github.com/getodk/web-forms/pull/281}
51
+ */
52
+ let unboundGlobalFetch: UnboundGlobalFetch;
53
+
54
+ if (typeof globalThis.fetch === 'function') {
55
+ unboundGlobalFetch = (...args) => {
56
+ return globalThis.fetch(...args);
57
+ };
58
+ } else {
59
+ unboundGlobalFetch = () => {
60
+ throw new Error('fetch is not supported in this environment');
61
+ };
62
+ }
63
+
64
+ interface ResolvedOptions extends Required<LoadFormOptions> {}
65
+
66
+ /**
67
+ * Resolves {@link FormResultLoadOptions} from options directly passed by a
68
+ * client (if passed at all).
69
+ *
70
+ * Note that this function exists to be more resilient than the static types
71
+ * would technically require, i.e. anticipating any kind of nullish value where
72
+ * option properties are typed only as optional. This is an acknowledgement that
73
+ * the nuances of nullishness are a footgun in untyped JavaScript, and
74
+ * nested-optional semantics are a particularly likely source of mistakes in
75
+ * client, and especially host application, integrations.
76
+ */
77
+ const resolveOptions = (options?: LoadFormOptions): ResolvedOptions => {
78
+ return {
79
+ fetchFormDefinition: options?.fetchFormDefinition ?? unboundGlobalFetch,
80
+ fetchFormAttachment: options?.fetchFormAttachment ?? unboundGlobalFetch,
81
+ missingResourceBehavior: options?.missingResourceBehavior ?? MISSING_RESOURCE_BEHAVIOR.DEFAULT,
82
+ };
83
+ };
84
+
85
+ /**
86
+ * **IMPORTANT:** This function is defined separately from, and to be called by,
87
+ * the {@link loadForm} entrypoint to ensure we satisfy the synchrony
88
+ * requirements of {@link createPotentiallyClientOwnedReactiveScope}.
89
+ */
90
+ const loadFormResult = async (
91
+ scope: ReactiveScope,
92
+ formResource: FormResource,
93
+ options: ResolvedOptions
94
+ ): Promise<LoadFormResult> => {
95
+ const { fetchFormDefinition, fetchFormAttachment, missingResourceBehavior } = options;
96
+
97
+ // TODO: Currently, **all** of the intermediate calls in this `try` block
98
+ // may throw! Handling that fact at the source would provide a much more
99
+ // specific `LoadFormFailureResult`, and address performance regressions
100
+ // inherent to such a broad/mixed use of `try`/`catch`.
101
+ //
102
+ // Addressing this is deferred for now, to limit scope.
103
+ try {
104
+ const sourceXML = await retrieveFormDefinition(formResource, {
105
+ fetchFormDefinition,
106
+ });
107
+ const xformDOM = XFormDOM.from(sourceXML);
108
+ const { model } = new XFormDefinition(xformDOM);
109
+ const secondaryInstances = await SecondaryInstancesDefinition.load(xformDOM, {
110
+ fetchResource: fetchFormAttachment,
111
+ missingResourceBehavior,
112
+ });
113
+ const instanceOptions = {
114
+ scope,
115
+ model,
116
+ secondaryInstances,
117
+ };
118
+
119
+ return new FormSuccessResult({
120
+ warnings: null,
121
+ error: null,
122
+ scope,
123
+ formResource,
124
+ instanceOptions,
125
+ });
126
+ } catch (caught) {
127
+ let cause: Error;
128
+
129
+ if (caught instanceof Error) {
130
+ cause = caught;
131
+ } else {
132
+ cause = new Error('Unknown form load error', { cause: caught });
133
+ }
134
+
135
+ const error = new LoadFormFailureError(formResource, [cause]);
136
+
137
+ return new FormFailureResult({
138
+ warnings: null,
139
+ error,
140
+ });
141
+ }
142
+ };
143
+
144
+ export const loadForm = (
145
+ formResource: FormResource,
146
+ options?: LoadFormOptions
147
+ ): Promise<LoadFormResult> => {
148
+ const scope = createPotentiallyClientOwnedReactiveScope();
149
+ const resolvedOptions = resolveOptions(options);
150
+
151
+ return loadFormResult(scope, formResource, resolvedOptions);
152
+ };
153
+
154
+ loadForm satisfies LoadForm;
@@ -0,0 +1,27 @@
1
+ import type { FormInstanceConfig } from '../client/form/FormInstanceConfig.ts';
2
+ import type { LoadFormOptions } from '../client/form/LoadForm.ts';
3
+ import type {
4
+ RestoredFormInstance,
5
+ RestoreFormInstanceInput,
6
+ } from '../client/form/RestoreFormInstance.ts';
7
+ import type { FormResource } from '../instance/resource.ts';
8
+ import { loadForm } from './loadForm.ts';
9
+
10
+ export interface RestoreInstanceOptions {
11
+ readonly form?: LoadFormOptions;
12
+ readonly instance?: FormInstanceConfig;
13
+ }
14
+
15
+ export const restoreInstance = async (
16
+ formResource: FormResource,
17
+ input: RestoreFormInstanceInput,
18
+ options?: RestoreInstanceOptions
19
+ ): Promise<RestoredFormInstance> => {
20
+ const form = await loadForm(formResource, options?.form);
21
+
22
+ if (form.status === 'failure') {
23
+ throw form.error;
24
+ }
25
+
26
+ return form.restoreInstance(input, options?.instance);
27
+ };
@@ -0,0 +1,114 @@
1
+ import type { UnknownObject } from '@getodk/common/lib/type-assertions/assertUnknownObject.ts';
2
+ import type { Primitive } from '@getodk/common/types/Primitive.ts';
3
+ import type { FormResource } from '../client/form/FormResource.ts';
4
+
5
+ // prettier-ignore
6
+ type PartiallyKnownType<T> =
7
+ // eslint-disable-next-line @typescript-eslint/sort-type-constituents
8
+ | T
9
+ | UnknownObject
10
+ | Primitive;
11
+
12
+ /**
13
+ * A {@link Blob}, which _may be_ a {@link File}.
14
+ *
15
+ * Extends {@link Blob} with optional properties corresponding to {@link File}'s
16
+ * own extensions of the same interface, allowing inspection without an
17
+ * unnecessary type cast, and without unnecessary runtime/type reconciliation.
18
+ *
19
+ * @todo There's almost certainly no reason that this couldn't be a part of the
20
+ * client-facing {@link FormResource} union type. It's kept internal here for
21
+ * now, in case that could cause confusion in client integrations.
22
+ */
23
+ interface MaybeFile extends Blob {
24
+ readonly lastModified?: PartiallyKnownType<number>;
25
+ readonly name?: PartiallyKnownType<string>;
26
+ readonly webkitRelativePath?: PartiallyKnownType<string>;
27
+ }
28
+
29
+ const blobDescription = (resource: MaybeFile): string => {
30
+ const { name } = resource;
31
+
32
+ if (typeof name === 'string') {
33
+ return name;
34
+ }
35
+
36
+ let commonConstructorName: 'Blob' | 'File';
37
+
38
+ if (resource instanceof File) {
39
+ commonConstructorName = 'File';
40
+ } else {
41
+ commonConstructorName = 'Blob';
42
+ }
43
+
44
+ return `Unknown ${commonConstructorName} data`;
45
+ };
46
+
47
+ interface FormResourceMetadata {
48
+ readonly description: string;
49
+ readonly rawData: string | null;
50
+ }
51
+
52
+ const formResourceMetadata = (resource: FormResource): FormResourceMetadata => {
53
+ if (resource instanceof Blob) {
54
+ return {
55
+ description: blobDescription(resource),
56
+ rawData: null,
57
+ };
58
+ }
59
+
60
+ if (resource instanceof URL) {
61
+ return {
62
+ description: resource.href,
63
+ rawData: null,
64
+ };
65
+ }
66
+
67
+ return {
68
+ description: 'Raw string data',
69
+ rawData: resource,
70
+ };
71
+ };
72
+
73
+ /**
74
+ * @todo This is a placeholder class, given a name so it can be referenced in
75
+ * client interfaces for form loading. It is pending design of errors (broadly)
76
+ * and modeling of form loading errors (specifically).
77
+ */
78
+ export class LoadFormFailureError extends AggregateError {
79
+ constructor(resource: FormResource, errors: readonly Error[]) {
80
+ const { description, rawData } = formResourceMetadata(resource);
81
+ const messageLines: string[] = [
82
+ `Failed to load form resource: ${description}`,
83
+ '\n',
84
+
85
+ ...errors.map((error) => {
86
+ const aggregatedMessage = error.message;
87
+
88
+ if (aggregatedMessage == null) {
89
+ return '- Unknown error';
90
+ }
91
+
92
+ return `- ${aggregatedMessage}`;
93
+ }),
94
+ ];
95
+
96
+ if (rawData != null) {
97
+ messageLines.push('\n- - -\n', 'Raw resource data:', rawData);
98
+ }
99
+
100
+ const message = messageLines.join('\n');
101
+
102
+ super(errors, message);
103
+
104
+ const [head, ...tail] = errors;
105
+
106
+ if (head != null && tail.length === 0) {
107
+ const { stack } = head;
108
+
109
+ if (typeof stack === 'string') {
110
+ this.stack = stack;
111
+ }
112
+ }
113
+ }
114
+ }
@@ -0,0 +1,3 @@
1
+ import { ErrorProductionDesignPendingError } from './ErrorProductionDesignPendingError.ts';
2
+
3
+ export class MalformedInstanceDataError extends ErrorProductionDesignPendingError {}
@@ -0,0 +1,5 @@
1
+ export class RankMissingValueError extends Error {
2
+ constructor(message: string) {
3
+ super(message);
4
+ }
5
+ }
@@ -0,0 +1,13 @@
1
+ import { XFormsSpecViolationError } from './XFormsSpecViolationError.ts';
2
+ import type { RankDefinition } from '../client/RankNode.ts';
3
+ import type { UnsupportedBaseItemValueType } from '../lib/codecs/items/BaseItemCodec.ts';
4
+
5
+ export class RankValueTypeError extends XFormsSpecViolationError {
6
+ constructor(definition: RankDefinition<UnsupportedBaseItemValueType>) {
7
+ const { valueType } = definition;
8
+
9
+ super(
10
+ `Ranks of type ${valueType} are not currently supported. If this functionality would be useful for your form, your feedback is welcome!`
11
+ );
12
+ }
13
+ }
@@ -0,0 +1,22 @@
1
+ import type { SelectDefinition } from '../client/SelectNode.ts';
2
+ import type { UnsupportedBaseItemValueType } from '../lib/codecs/items/BaseItemCodec.ts';
3
+ import { XFormsSpecViolationError } from './XFormsSpecViolationError.ts';
4
+
5
+ /**
6
+ * @todo It would be good to have a standardized way to use specific types of
7
+ * errors as a prompt for feedback. There is currently a feedback link presented
8
+ * by `@getodk/web-forms`, which is conditionally displayed (condition is
9
+ * evidently controlled by a
10
+ * {@link https://vuejs.org/api/sfc-script-setup#defineoptions | Vue component option}).
11
+ *
12
+ * @see {@link https://github.com/getodk/web-forms/issues/276}
13
+ */
14
+ export class SelectValueTypeError extends XFormsSpecViolationError {
15
+ constructor(definition: SelectDefinition<UnsupportedBaseItemValueType>) {
16
+ const { valueType } = definition;
17
+
18
+ super(
19
+ `Selects of type ${valueType} are not currently supported. If this functionality would be useful for your form, your feedback is welcome!`
20
+ );
21
+ }
22
+ }
@@ -0,0 +1,24 @@
1
+ /**
2
+ * This error class is intended as a common point of reference for all of the
3
+ * related interfaces and implementation where we've deferred two concerns:
4
+ *
5
+ * 1. Support for attributes on instance nodes (which may be bound in a form's
6
+ * model and/or may be expected to preserve model-defined defaults)
7
+ * 2. Present lack of logic to treat a `jr:template` attribute as a special
8
+ * case: whereas in the general case we would expect to pass through a
9
+ * form/model-defined attribute, we expect to specifically **omit**
10
+ * `jr:template` from repeat instances derived from any of form's
11
+ * explicitly-defined repeat templates
12
+ *
13
+ * Addressing #1 is (now) a prerequisite to addressing #2, and it is also a
14
+ * prerequisite for #2's unaddressed status to _become meaningfully observable
15
+ * and problematic_.
16
+ *
17
+ * By introducing this error at a point where a change in #1's status is likely
18
+ * to be implicated, we're also likely to be reminded to address #2 in tandem.
19
+ */
20
+ export class TemplatedNodeAttributeSerializationError extends Error {
21
+ constructor() {
22
+ super('Template attribute omission not implemented');
23
+ }
24
+ }
@@ -0,0 +1 @@
1
+ export abstract class XFormsSpecViolationError extends Error {}
package/src/index.ts CHANGED
@@ -1,56 +1,2 @@
1
- import type { InitializeForm } from './index.ts';
2
- import { initializeForm as engine__initializeForm } from './instance/index.ts';
3
-
4
- export const initializeForm: InitializeForm = engine__initializeForm;
5
-
6
- export type * from './client/constants.ts';
7
- export * as constants from './client/constants.ts';
8
- export type * from './client/EngineConfig.ts';
9
- export type * from './client/FormLanguage.ts';
10
- export type * from './client/GroupNode.ts';
11
- export type {
12
- AnyChildNode,
13
- AnyControlNode,
14
- AnyLeafNode,
15
- AnyNode,
16
- AnyParentNode,
17
- AnyUnsupportedControlNode,
18
- GeneralChildNode,
19
- GeneralParentNode,
20
- RepeatRangeNode,
21
- } from './client/hierarchy.ts';
22
- export type * from './client/index.ts';
23
- export type * from './client/InputNode.ts';
24
- export type * from './client/ModelValueNode.ts';
25
- export type * from './client/NoteNode.ts';
26
- export type * from './client/OpaqueReactiveObjectFactory.ts';
27
- export type * from './client/repeat/RepeatInstanceNode.ts';
28
- export type * from './client/repeat/RepeatRangeControlledNode.ts';
29
- export type * from './client/repeat/RepeatRangeUncontrolledNode.ts';
30
- export type * from './client/resources.ts';
31
- export type * from './client/RootNode.ts';
32
- export type * from './client/SelectNode.ts';
33
- export type * from './client/submission/SubmissionData.ts';
34
- export type * from './client/submission/SubmissionDefinition.ts';
35
- export type * from './client/submission/SubmissionInstanceFile.ts';
36
- export type * from './client/submission/SubmissionOptions.ts';
37
- export type * from './client/submission/SubmissionResult.ts';
38
- export type * from './client/submission/SubmissionState.ts';
39
- export type * from './client/SubtreeNode.ts';
40
- export type * from './client/TextRange.ts';
41
- export type * from './client/TriggerNode.ts';
42
- export type * from './client/unsupported/RangeNode.ts';
43
- export type * from './client/unsupported/RankNode.ts';
44
- export type * from './client/unsupported/UploadNode.ts';
45
- export type * from './client/validation.ts';
46
- export type * from './client/ValueType.ts';
47
-
48
- // TODO: notwithstanding potential conflicts with parallel work on `web-forms`
49
- // (former `ui-vue`), these are the last remaining references **outside of
50
- // `xforms-engine`** to anything besides /client/* and the `initializeForm`
51
- // entrypoint implementation. We'll refine the various `definition` types in due
52
- // time.
53
- export type {
54
- AnySelectDefinition,
55
- SelectDefinition,
56
- } from './parse/body/control/select/SelectDefinition.ts';
1
+ export * from './client/index.ts';
2
+ export * from './entrypoints/index.ts';
@@ -2,11 +2,12 @@ import { XPathNodeKindKey } from '@getodk/xpath';
2
2
  import type { Accessor } from 'solid-js';
3
3
  import type { GroupDefinition, GroupNode, GroupNodeAppearances } from '../client/GroupNode.ts';
4
4
  import type { FormNodeID } from '../client/identity.ts';
5
- import type { SubmissionState } from '../client/submission/SubmissionState.ts';
5
+ import type { InstanceState } from '../client/serialization/InstanceState.ts';
6
6
  import type { TextRange } from '../client/TextRange.ts';
7
7
  import type { AncestorNodeValidationState } from '../client/validation.ts';
8
8
  import type { XFormsXPathElement } from '../integration/xpath/adapter/XFormsXPathNode.ts';
9
- import { createParentNodeSubmissionState } from '../lib/client-reactivity/submission/createParentNodeSubmissionState.ts';
9
+ import type { StaticElement } from '../integration/xpath/static-dom/StaticElement.ts';
10
+ import { createParentNodeInstanceState } from '../lib/client-reactivity/instance-state/createParentNodeInstanceState.ts';
10
11
  import type { ChildrenState } from '../lib/reactivity/createChildrenState.ts';
11
12
  import { createChildrenState } from '../lib/reactivity/createChildrenState.ts';
12
13
  import type { MaterializedChildren } from '../lib/reactivity/materializeCurrentStateChildren.ts';
@@ -19,10 +20,10 @@ import { createNodeLabel } from '../lib/reactivity/text/createNodeLabel.ts';
19
20
  import { createAggregatedViolations } from '../lib/reactivity/validation/createAggregatedViolations.ts';
20
21
  import type { DescendantNodeSharedStateSpec } from './abstract/DescendantNode.ts';
21
22
  import { DescendantNode } from './abstract/DescendantNode.ts';
22
- import { buildChildren } from './children.ts';
23
+ import { buildChildren } from './children/buildChildren.ts';
23
24
  import type { GeneralChildNode, GeneralParentNode } from './hierarchy.ts';
24
25
  import type { EvaluationContext } from './internal-api/EvaluationContext.ts';
25
- import type { ClientReactiveSubmittableParentNode } from './internal-api/submission/ClientReactiveSubmittableParentNode.ts';
26
+ import type { ClientReactiveSerializableParentNode } from './internal-api/serialization/ClientReactiveSerializableParentNode.ts';
26
27
 
27
28
  // prettier-ignore
28
29
  interface GroupStateSpec extends DescendantNodeSharedStateSpec {
@@ -39,7 +40,7 @@ export class Group
39
40
  GroupNode,
40
41
  XFormsXPathElement,
41
42
  EvaluationContext,
42
- ClientReactiveSubmittableParentNode<GeneralChildNode>
43
+ ClientReactiveSerializableParentNode<GeneralChildNode>
43
44
  {
44
45
  private readonly childrenState: ChildrenState<GeneralChildNode>;
45
46
 
@@ -52,12 +53,17 @@ export class Group
52
53
  // GroupNode
53
54
  readonly nodeType = 'group';
54
55
  readonly appearances: GroupNodeAppearances;
56
+ readonly nodeOptions = null;
55
57
  readonly currentState: MaterializedChildren<CurrentState<GroupStateSpec>, GeneralChildNode>;
56
58
  readonly validationState: AncestorNodeValidationState;
57
- readonly submissionState: SubmissionState;
59
+ readonly instanceState: InstanceState;
58
60
 
59
- constructor(parent: GeneralParentNode, definition: GroupDefinition) {
60
- super(parent, definition);
61
+ constructor(
62
+ parent: GeneralParentNode,
63
+ instanceNode: StaticElement | null,
64
+ definition: GroupDefinition
65
+ ) {
66
+ super(parent, instanceNode, definition);
61
67
 
62
68
  this.appearances = definition.bodyElement.appearances;
63
69
 
@@ -65,10 +71,6 @@ export class Group
65
71
 
66
72
  this.childrenState = childrenState;
67
73
 
68
- const sharedStateOptions = {
69
- clientStateFactory: this.engineConfig.stateFactory,
70
- };
71
-
72
74
  const state = createSharedNodeState(
73
75
  this.scope,
74
76
  {
@@ -83,7 +85,7 @@ export class Group
83
85
  valueOptions: null,
84
86
  value: null,
85
87
  },
86
- sharedStateOptions
88
+ this.instanceConfig
87
89
  );
88
90
 
89
91
  this.state = state;
@@ -95,8 +97,8 @@ export class Group
95
97
  );
96
98
 
97
99
  childrenState.setChildren(buildChildren(this));
98
- this.validationState = createAggregatedViolations(this, sharedStateOptions);
99
- this.submissionState = createParentNodeSubmissionState(this);
100
+ this.validationState = createAggregatedViolations(this, this.instanceConfig);
101
+ this.instanceState = createParentNodeInstanceState(this);
100
102
  }
101
103
 
102
104
  getChildren(): readonly GeneralChildNode[] {