@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
@@ -4,9 +4,10 @@ import type { Accessor } from 'solid-js';
4
4
  import { untrack } from 'solid-js';
5
5
  import type { RepeatRangeNode } from '../../client/hierarchy.ts';
6
6
  import type { FormNodeID } from '../../client/identity.ts';
7
+ import type { AnyRepeatDefinition } from '../../client/index.ts';
7
8
  import type { NodeAppearances } from '../../client/NodeAppearances.ts';
8
9
  import type { BaseRepeatRangeNode } from '../../client/repeat/BaseRepeatRangeNode.ts';
9
- import type { SubmissionState } from '../../client/submission/SubmissionState.ts';
10
+ import type { InstanceState } from '../../client/serialization/InstanceState.ts';
10
11
  import type { TextRange } from '../../client/TextRange.ts';
11
12
  import type { AncestorNodeValidationState } from '../../client/validation.ts';
12
13
  import type {
@@ -14,7 +15,8 @@ import type {
14
15
  XFormsXPathNodeRangeKind,
15
16
  } from '../../integration/xpath/adapter/XFormsXPathNode.ts';
16
17
  import { XFORMS_XPATH_NODE_RANGE_KIND } from '../../integration/xpath/adapter/XFormsXPathNode.ts';
17
- import { createNodeRangeSubmissionState } from '../../lib/client-reactivity/submission/createNodeRangeSubmissionState.ts';
18
+ import type { StaticElement } from '../../integration/xpath/static-dom/StaticElement.ts';
19
+ import { createNodeRangeInstanceState } from '../../lib/client-reactivity/instance-state/createNodeRangeInstanceState.ts';
18
20
  import type { ChildrenState } from '../../lib/reactivity/createChildrenState.ts';
19
21
  import { createChildrenState } from '../../lib/reactivity/createChildrenState.ts';
20
22
  import type { MaterializedChildren } from '../../lib/reactivity/materializeCurrentStateChildren.ts';
@@ -24,10 +26,7 @@ import type { EngineState } from '../../lib/reactivity/node-state/createEngineSt
24
26
  import type { SharedNodeState } from '../../lib/reactivity/node-state/createSharedNodeState.ts';
25
27
  import { createSharedNodeState } from '../../lib/reactivity/node-state/createSharedNodeState.ts';
26
28
  import { createNodeLabel } from '../../lib/reactivity/text/createNodeLabel.ts';
27
- import type {
28
- AnyRepeatRangeDefinition,
29
- ControlledRepeatRangeDefinition,
30
- } from '../../parse/model/RepeatRangeDefinition.ts';
29
+ import type { ControlledRepeatDefinition } from '../../parse/model/RepeatDefinition.ts';
31
30
  import type {
32
31
  AnyDescendantNode,
33
32
  DescendantNodeSharedStateSpec,
@@ -35,8 +34,8 @@ import type {
35
34
  import { DescendantNode } from '../abstract/DescendantNode.ts';
36
35
  import type { GeneralParentNode, RepeatRange } from '../hierarchy.ts';
37
36
  import type { EvaluationContext } from '../internal-api/EvaluationContext.ts';
38
- import type { ClientReactiveSubmittableParentNode } from '../internal-api/submission/ClientReactiveSubmittableParentNode.ts';
39
- import { RepeatInstance, type RepeatDefinition } from './RepeatInstance.ts';
37
+ import type { ClientReactiveSerializableParentNode } from '../internal-api/serialization/ClientReactiveSerializableParentNode.ts';
38
+ import { RepeatInstance } from './RepeatInstance.ts';
40
39
 
41
40
  interface RepeatRangeStateSpec extends DescendantNodeSharedStateSpec {
42
41
  readonly hint: null;
@@ -47,18 +46,18 @@ interface RepeatRangeStateSpec extends DescendantNodeSharedStateSpec {
47
46
  }
48
47
 
49
48
  // prettier-ignore
50
- type BaseRepeatRangeNodeType<Definition extends AnyRepeatRangeDefinition> =
51
- Definition extends ControlledRepeatRangeDefinition
49
+ type BaseRepeatRangeNodeType<Definition extends AnyRepeatDefinition> =
50
+ Definition extends ControlledRepeatDefinition
52
51
  ? 'repeat-range:controlled'
53
52
  : 'repeat-range:uncontrolled';
54
53
 
55
- export abstract class BaseRepeatRange<Definition extends AnyRepeatRangeDefinition>
54
+ export abstract class BaseRepeatRange<Definition extends AnyRepeatDefinition>
56
55
  extends DescendantNode<Definition, RepeatRangeStateSpec, GeneralParentNode, RepeatInstance>
57
56
  implements
58
57
  BaseRepeatRangeNode,
59
58
  XFormsXPathNodeRange,
60
59
  EvaluationContext,
61
- ClientReactiveSubmittableParentNode<RepeatInstance>
60
+ ClientReactiveSerializableParentNode<RepeatInstance>
62
61
  {
63
62
  protected readonly childrenState: ChildrenState<RepeatInstance>;
64
63
 
@@ -143,14 +142,16 @@ export abstract class BaseRepeatRange<Definition extends AnyRepeatRangeDefinitio
143
142
  */
144
143
  abstract override readonly appearances: NodeAppearances<Definition>;
145
144
 
145
+ readonly nodeOptions = null;
146
+
146
147
  readonly currentState: MaterializedChildren<CurrentState<RepeatRangeStateSpec>, RepeatInstance>;
147
148
 
148
149
  abstract override readonly validationState: AncestorNodeValidationState;
149
150
 
150
- readonly submissionState: SubmissionState;
151
+ readonly instanceState: InstanceState;
151
152
 
152
153
  constructor(parent: GeneralParentNode, definition: Definition) {
153
- super(parent, definition);
154
+ super(parent, definition.template, definition);
154
155
 
155
156
  const repeatRange = this as AnyDescendantNode as RepeatRange;
156
157
 
@@ -158,10 +159,6 @@ export abstract class BaseRepeatRange<Definition extends AnyRepeatRangeDefinitio
158
159
 
159
160
  this.childrenState = childrenState;
160
161
 
161
- const sharedStateOptions = {
162
- clientStateFactory: this.engineConfig.stateFactory,
163
- };
164
-
165
162
  const state = createSharedNodeState(
166
163
  this.scope,
167
164
  {
@@ -176,7 +173,7 @@ export abstract class BaseRepeatRange<Definition extends AnyRepeatRangeDefinitio
176
173
  valueOptions: null,
177
174
  value: null,
178
175
  },
179
- sharedStateOptions
176
+ this.instanceConfig
180
177
  );
181
178
 
182
179
  this.state = state;
@@ -186,7 +183,7 @@ export abstract class BaseRepeatRange<Definition extends AnyRepeatRangeDefinitio
186
183
  state.currentState,
187
184
  childrenState
188
185
  );
189
- this.submissionState = createNodeRangeSubmissionState(this);
186
+ this.instanceState = createNodeRangeInstanceState(this);
190
187
  }
191
188
 
192
189
  protected getLastIndex(): number {
@@ -199,7 +196,7 @@ export abstract class BaseRepeatRange<Definition extends AnyRepeatRangeDefinitio
199
196
 
200
197
  private createChildren(
201
198
  afterIndex: number,
202
- definitions: readonly RepeatDefinition[]
199
+ instanceNodes: readonly StaticElement[]
203
200
  ): readonly RepeatInstance[] {
204
201
  return this.scope.runTask(() => {
205
202
  let initialPrecedingInstance: RepeatInstance | null;
@@ -218,7 +215,7 @@ export abstract class BaseRepeatRange<Definition extends AnyRepeatRangeDefinitio
218
215
 
219
216
  const repeatRange = this as AnyDescendantNode as RepeatRange;
220
217
 
221
- return definitions.reduce<RepeatInstance[]>((acc, definition) => {
218
+ return instanceNodes.reduce<RepeatInstance[]>((acc, definition) => {
222
219
  const precedingInstance = acc[acc.length - 1] ?? initialPrecedingInstance;
223
220
  const newInstance = new RepeatInstance(repeatRange, definition, {
224
221
  precedingInstance,
@@ -233,11 +230,11 @@ export abstract class BaseRepeatRange<Definition extends AnyRepeatRangeDefinitio
233
230
 
234
231
  protected addChildren(
235
232
  afterIndex: number,
236
- definitions: readonly RepeatDefinition[]
233
+ instanceNodes: readonly StaticElement[]
237
234
  ): readonly RepeatInstance[] {
238
235
  return this.scope.runTask(() => {
239
236
  const initialIndex = afterIndex + 1;
240
- const newInstances = this.createChildren(afterIndex, definitions);
237
+ const newInstances = this.createChildren(afterIndex, instanceNodes);
241
238
 
242
239
  return this.childrenState.setChildren((currentInstances) => {
243
240
  return insertAtIndex(currentInstances, initialIndex, newInstances);
@@ -3,15 +3,17 @@ import type { Accessor } from 'solid-js';
3
3
  import { createComputed, createSignal, on } from 'solid-js';
4
4
  import type { FormNodeID } from '../../client/identity.ts';
5
5
  import type {
6
- RepeatDefinition,
6
+ AnyRepeatDefinition,
7
7
  RepeatInstanceNode,
8
8
  RepeatInstanceNodeAppearances,
9
9
  } from '../../client/repeat/RepeatInstanceNode.ts';
10
- import type { SubmissionState } from '../../client/submission/SubmissionState.ts';
10
+ import type { InstanceState } from '../../client/serialization/InstanceState.ts';
11
11
  import type { TextRange } from '../../client/TextRange.ts';
12
12
  import type { AncestorNodeValidationState } from '../../client/validation.ts';
13
+ import type { TemplatedNodeAttributeSerializationError } from '../../error/TemplatedNodeAttributeSerializationError.ts';
13
14
  import type { XFormsXPathElement } from '../../integration/xpath/adapter/XFormsXPathNode.ts';
14
- import { createParentNodeSubmissionState } from '../../lib/client-reactivity/submission/createParentNodeSubmissionState.ts';
15
+ import type { StaticElement } from '../../integration/xpath/static-dom/StaticElement.ts';
16
+ import { createTemplatedNodeInstanceState } from '../../lib/client-reactivity/instance-state/createTemplatedNodeInstanceState.ts';
15
17
  import type { ChildrenState } from '../../lib/reactivity/createChildrenState.ts';
16
18
  import { createChildrenState } from '../../lib/reactivity/createChildrenState.ts';
17
19
  import type { MaterializedChildren } from '../../lib/reactivity/materializeCurrentStateChildren.ts';
@@ -24,16 +26,18 @@ import { createNodeLabel } from '../../lib/reactivity/text/createNodeLabel.ts';
24
26
  import { createAggregatedViolations } from '../../lib/reactivity/validation/createAggregatedViolations.ts';
25
27
  import type { DescendantNodeSharedStateSpec } from '../abstract/DescendantNode.ts';
26
28
  import { DescendantNode } from '../abstract/DescendantNode.ts';
27
- import { buildChildren } from '../children.ts';
29
+ import { buildChildren } from '../children/buildChildren.ts';
28
30
  import type { GeneralChildNode, RepeatRange } from '../hierarchy.ts';
29
31
  import type { EvaluationContext } from '../internal-api/EvaluationContext.ts';
30
- import type { ClientReactiveSubmittableParentNode } from '../internal-api/submission/ClientReactiveSubmittableParentNode.ts';
31
-
32
- export type { RepeatDefinition };
32
+ import type { ClientReactiveSerializableTemplatedNode } from '../internal-api/serialization/ClientReactiveSerializableTemplatedNode.ts';
33
33
 
34
34
  interface RepeatInstanceStateSpec extends DescendantNodeSharedStateSpec {
35
35
  readonly label: Accessor<TextRange<'label'> | null>;
36
36
  readonly hint: null;
37
+
38
+ /** @see {@link TemplatedNodeAttributeSerializationError} */
39
+ readonly attributes: null;
40
+
37
41
  readonly children: Accessor<readonly FormNodeID[]>;
38
42
  readonly valueOptions: null;
39
43
  readonly value: null;
@@ -44,12 +48,17 @@ interface RepeatInstanceOptions {
44
48
  }
45
49
 
46
50
  export class RepeatInstance
47
- extends DescendantNode<RepeatDefinition, RepeatInstanceStateSpec, RepeatRange, GeneralChildNode>
51
+ extends DescendantNode<
52
+ AnyRepeatDefinition,
53
+ RepeatInstanceStateSpec,
54
+ RepeatRange,
55
+ GeneralChildNode
56
+ >
48
57
  implements
49
58
  RepeatInstanceNode,
50
59
  XFormsXPathElement,
51
60
  EvaluationContext,
52
- ClientReactiveSubmittableParentNode<GeneralChildNode>
61
+ ClientReactiveSerializableTemplatedNode
53
62
  {
54
63
  private readonly childrenState: ChildrenState<GeneralChildNode>;
55
64
  private readonly currentIndex: Accessor<number>;
@@ -92,25 +101,27 @@ export class RepeatInstance
92
101
  * @see {@link RepeatRange.appearances}
93
102
  */
94
103
  readonly appearances: RepeatInstanceNodeAppearances;
104
+ readonly nodeOptions = null;
95
105
 
96
106
  readonly currentState: MaterializedChildren<
97
107
  CurrentState<RepeatInstanceStateSpec>,
98
108
  GeneralChildNode
99
109
  >;
100
110
  readonly validationState: AncestorNodeValidationState;
101
- readonly submissionState: SubmissionState;
111
+ readonly instanceState: InstanceState;
102
112
 
103
113
  constructor(
104
114
  override readonly parent: RepeatRange,
105
- definition: RepeatDefinition,
115
+ instanceNode: StaticElement | null,
106
116
  options: RepeatInstanceOptions
107
117
  ) {
118
+ const { definition } = parent;
108
119
  const { precedingInstance } = options;
109
120
  const precedingIndex = precedingInstance?.currentIndex ?? (() => -1);
110
121
  const initialIndex = precedingIndex() + 1;
111
122
  const [currentIndex, setCurrentIndex] = createSignal(initialIndex);
112
123
 
113
- super(parent, definition, {
124
+ super(parent, instanceNode, definition, {
114
125
  computeReference: (): string => {
115
126
  const currentPosition = currentIndex() + 1;
116
127
 
@@ -125,10 +136,6 @@ export class RepeatInstance
125
136
  this.childrenState = childrenState;
126
137
  this.currentIndex = currentIndex;
127
138
 
128
- const sharedStateOptions = {
129
- clientStateFactory: this.engineConfig.stateFactory,
130
- };
131
-
132
139
  const state = createSharedNodeState(
133
140
  this.scope,
134
141
  {
@@ -140,11 +147,12 @@ export class RepeatInstance
140
147
  // TODO: only-child <group><label>
141
148
  label: createNodeLabel(this, definition),
142
149
  hint: null,
150
+ attributes: null,
143
151
  children: childrenState.childIds,
144
152
  valueOptions: null,
145
153
  value: null,
146
154
  },
147
- sharedStateOptions
155
+ this.instanceConfig
148
156
  );
149
157
 
150
158
  this.state = state;
@@ -177,8 +185,8 @@ export class RepeatInstance
177
185
  });
178
186
 
179
187
  childrenState.setChildren(buildChildren(this));
180
- this.validationState = createAggregatedViolations(this, sharedStateOptions);
181
- this.submissionState = createParentNodeSubmissionState(this);
188
+ this.validationState = createAggregatedViolations(this, this.instanceConfig);
189
+ this.instanceState = createTemplatedNodeInstanceState(this);
182
190
  }
183
191
 
184
192
  getChildren(): readonly GeneralChildNode[] {
@@ -1,45 +1,69 @@
1
1
  import { createComputed } from 'solid-js';
2
+ import type { LoadFormWarnings } from '../../client/form/LoadFormResult.ts';
2
3
  import type { RepeatRangeNodeAppearances } from '../../client/repeat/BaseRepeatRangeNode.ts';
3
4
  import type { RepeatRangeControlledNode } from '../../client/repeat/RepeatRangeControlledNode.ts';
4
5
  import type { AncestorNodeValidationState } from '../../client/validation.ts';
5
6
  import type { XFormsXPathNodeRange } from '../../integration/xpath/adapter/XFormsXPathNode.ts';
7
+ import type { StaticElement } from '../../integration/xpath/static-dom/StaticElement.ts';
6
8
  import { createComputedExpression } from '../../lib/reactivity/createComputedExpression.ts';
7
9
  import { createAggregatedViolations } from '../../lib/reactivity/validation/createAggregatedViolations.ts';
8
- import type { ControlledRepeatRangeDefinition } from '../../parse/model/RepeatRangeDefinition.ts';
10
+ import type { ControlledRepeatDefinition } from '../../parse/model/RepeatDefinition.ts';
9
11
  import type { GeneralParentNode } from '../hierarchy.ts';
10
12
  import type { EvaluationContext } from '../internal-api/EvaluationContext.ts';
11
13
  import { BaseRepeatRange } from './BaseRepeatRange.ts';
12
- import type { RepeatDefinition } from './RepeatInstance.ts';
14
+
15
+ // prettier-ignore
16
+ type RepeatCountControlType =
17
+ | 'REPEAT_COUNT_CONTROL_DYNAMIC'
18
+ | 'REPEAT_COUNT_CONTROL_FIXED';
13
19
 
14
20
  export class RepeatRangeControlled
15
- extends BaseRepeatRange<ControlledRepeatRangeDefinition>
21
+ extends BaseRepeatRange<ControlledRepeatDefinition>
16
22
  implements RepeatRangeControlledNode, XFormsXPathNodeRange, EvaluationContext
17
23
  {
24
+ private readonly isInstanceCreation: boolean;
25
+ private readonly countControlType: RepeatCountControlType;
26
+
18
27
  // RepeatRangeControlledNode
19
28
  readonly nodeType = 'repeat-range:controlled';
20
29
  readonly appearances: RepeatRangeNodeAppearances;
21
30
  readonly validationState: AncestorNodeValidationState;
22
31
 
23
- constructor(parent: GeneralParentNode, definition: ControlledRepeatRangeDefinition) {
32
+ constructor(
33
+ parent: GeneralParentNode,
34
+ instanceNodes: readonly StaticElement[],
35
+ definition: ControlledRepeatDefinition
36
+ ) {
24
37
  super(parent, definition);
25
38
 
39
+ this.isInstanceCreation = parent.rootDocument.initializationMode === 'create';
26
40
  this.appearances = definition.bodyElement.appearances;
27
41
 
28
- this.initializeControlledChildrenState(definition);
42
+ if (definition.count.isConstantExpression()) {
43
+ this.countControlType = 'REPEAT_COUNT_CONTROL_FIXED';
44
+ } else {
45
+ this.countControlType = 'REPEAT_COUNT_CONTROL_DYNAMIC';
46
+ }
29
47
 
30
- this.validationState = createAggregatedViolations(this, {
31
- clientStateFactory: this.engineConfig.stateFactory,
32
- });
48
+ this.initializeControlledChildrenState(definition, instanceNodes);
49
+
50
+ this.validationState = createAggregatedViolations(this, this.instanceConfig);
33
51
  }
34
52
 
35
- private initializeControlledChildrenState(definition: ControlledRepeatRangeDefinition): void {
53
+ private initializeControlledChildrenState(
54
+ definition: ControlledRepeatDefinition,
55
+ instanceNodes: readonly StaticElement[]
56
+ ): void {
36
57
  this.scope.runTask(() => {
37
- const { count, instances, template } = definition;
58
+ const { count, template } = definition;
59
+ const repeatInstanceNodes = definition.omitTemplate(instanceNodes);
38
60
  const computeCount = createComputedExpression(this, count, {
39
61
  defaultValue: 0,
40
62
  });
41
63
 
42
- createComputed<number>((previousCount) => {
64
+ createComputed((previousCountComputation: number | null = null): number => {
65
+ const previousCount = previousCountComputation ?? 0;
66
+
43
67
  let currentCount = computeCount();
44
68
 
45
69
  if (Number.isFinite(currentCount) && currentCount < 0) {
@@ -58,17 +82,19 @@ export class RepeatRangeControlled
58
82
  return previousCount;
59
83
  }
60
84
 
85
+ this.warnDroppedInstanceNodes(repeatInstanceNodes, previousCountComputation, currentCount);
86
+
61
87
  if (currentCount > previousCount) {
62
88
  const delta = currentCount - previousCount;
63
- const definitions = Array<RepeatDefinition>(delta)
64
- .fill(template)
65
- .map((baseDefinition, index) => {
89
+ const inputNodes = Array(delta)
90
+ .fill(null)
91
+ .map((_, index) => {
66
92
  const instanceIndex = previousCount + index;
67
93
 
68
- return instances[instanceIndex] ?? baseDefinition;
94
+ return repeatInstanceNodes[instanceIndex] ?? template;
69
95
  });
70
96
 
71
- this.addChildren(previousCount - 1, definitions);
97
+ this.addChildren(previousCount - 1, inputNodes);
72
98
  } else {
73
99
  const delta = previousCount - currentCount;
74
100
 
@@ -76,7 +102,54 @@ export class RepeatRangeControlled
76
102
  }
77
103
 
78
104
  return currentCount;
79
- }, 0);
105
+ });
80
106
  });
81
107
  }
108
+
109
+ /**
110
+ * Note: we do not warn about dropping "excess" repeat instances...
111
+ *
112
+ * - ... after the instance is fully loaded: dropping repeat instances after
113
+ * that point is an expected behavior of _dynamically-controlled repeats_
114
+ * (i.e. those defined with `jr:count`), and it does not occur for
115
+ * _fixed-controlled repeats_ (i.e. defined with `jr:noAddRemove`);
116
+ *
117
+ * - ... for dynamic (`jr:count`) repeats _in newly created form instances_, i.e. instances whose input instance
118
+ * nodes are derived from the _form definition_: those form-defined repeat
119
+ * instances are not "dropped", instead they're retained in memory to be
120
+ * added as count is recomputed to a larger value.
121
+ *
122
+ * @todo ^ it is pretty likely that retain-in-memory behavior also applies to
123
+ * instance state which has been serialized and restored as well! In this way,
124
+ * it's possible we're not really "dropping" those nodes, only deferring their
125
+ * restoration. Is this what we want?
126
+ *
127
+ * @todo Design and produce {@link LoadFormWarnings | warnings} as values!
128
+ */
129
+ private warnDroppedInstanceNodes(
130
+ repeatInstanceNodes: readonly StaticElement[],
131
+ previousCountComputation: number | null,
132
+ initialCount: number
133
+ ): void {
134
+ // See this method's JSDoc notes for reasoning!
135
+ if (this.isInstanceCreation) {
136
+ return;
137
+ }
138
+
139
+ // See this method's JSDoc notes for reasoning!
140
+ const isInstanceLoad = previousCountComputation == null;
141
+
142
+ if (isInstanceLoad && this.countControlType === 'REPEAT_COUNT_CONTROL_DYNAMIC') {
143
+ return;
144
+ }
145
+
146
+ const droppedCount = repeatInstanceNodes.length - initialCount;
147
+
148
+ if (droppedCount > 0) {
149
+ // eslint-disable-next-line no-console
150
+ console.warn(
151
+ `Dropped ${droppedCount} repeat instances for repeat range ${this.contextReference()}`
152
+ );
153
+ }
154
+ }
82
155
  }
@@ -2,8 +2,9 @@ import type { RepeatRangeNodeAppearances } from '../../client/repeat/BaseRepeatR
2
2
  import type { RepeatRangeUncontrolledNode } from '../../client/repeat/RepeatRangeUncontrolledNode.ts';
3
3
  import type { AncestorNodeValidationState } from '../../client/validation.ts';
4
4
  import type { XFormsXPathNodeRange } from '../../integration/xpath/adapter/XFormsXPathNode.ts';
5
+ import type { StaticElement } from '../../integration/xpath/static-dom/StaticElement.ts';
5
6
  import { createAggregatedViolations } from '../../lib/reactivity/validation/createAggregatedViolations.ts';
6
- import type { UncontrolledRepeatRangeDefinition } from '../../parse/model/RepeatRangeDefinition.ts';
7
+ import type { UncontrolledRepeatDefinition } from '../../parse/model/RepeatDefinition.ts';
7
8
  import type { GeneralParentNode } from '../hierarchy.ts';
8
9
  import type { EvaluationContext } from '../internal-api/EvaluationContext.ts';
9
10
  import type { Root } from '../Root.ts';
@@ -11,7 +12,7 @@ import { BaseRepeatRange } from './BaseRepeatRange.ts';
11
12
  import { RepeatInstance } from './RepeatInstance.ts';
12
13
 
13
14
  export class RepeatRangeUncontrolled
14
- extends BaseRepeatRange<UncontrolledRepeatRangeDefinition>
15
+ extends BaseRepeatRange<UncontrolledRepeatDefinition>
15
16
  implements RepeatRangeUncontrolledNode, XFormsXPathNodeRange, EvaluationContext
16
17
  {
17
18
  // RepeatRangeUncontrolledNode
@@ -19,16 +20,16 @@ export class RepeatRangeUncontrolled
19
20
  readonly appearances: RepeatRangeNodeAppearances;
20
21
  readonly validationState: AncestorNodeValidationState;
21
22
 
22
- constructor(parent: GeneralParentNode, definition: UncontrolledRepeatRangeDefinition) {
23
+ constructor(
24
+ parent: GeneralParentNode,
25
+ instanceNodes: readonly StaticElement[],
26
+ definition: UncontrolledRepeatDefinition
27
+ ) {
23
28
  super(parent, definition);
24
29
 
25
30
  this.appearances = definition.bodyElement.appearances;
26
-
27
- this.addChildren(-1, definition.instances);
28
-
29
- this.validationState = createAggregatedViolations(this, {
30
- clientStateFactory: this.engineConfig.stateFactory,
31
- });
31
+ this.addChildren(-1, definition.omitTemplate(instanceNodes));
32
+ this.validationState = createAggregatedViolations(this, this.instanceConfig);
32
33
  }
33
34
 
34
35
  // RepeatRangeUncontrolledNode
@@ -1,6 +1,6 @@
1
1
  import { UnreachableError } from '@getodk/common/lib/error/UnreachableError.ts';
2
2
  import { getBlobText } from '@getodk/common/lib/web-compat/blob.ts';
3
- import type { FormResource } from '../client/index.ts';
3
+ import type { FormResource } from '../client/form/FormResource.ts';
4
4
  import type { FetchResource, FetchResourceResponse } from '../client/resources.ts';
5
5
 
6
6
  export type { FetchResource, FetchResourceResponse, FormResource };
@@ -10,7 +10,10 @@ export interface ResourceOptions {
10
10
  }
11
11
 
12
12
  const fetchTextFromURL = async (resource: URL, options: ResourceOptions): Promise<string> => {
13
- const response = await options.fetchResource(resource);
13
+ // destructuring prevents "Failed to execute 'fetch' on 'Window': Illegal invocation"
14
+ const { fetchResource } = options;
15
+
16
+ const response = await fetchResource(resource);
14
17
 
15
18
  return response.text();
16
19
  };
@@ -73,3 +76,16 @@ export const retrieveSourceXMLResource = async (
73
76
 
74
77
  return text;
75
78
  };
79
+
80
+ interface RetrieveFormDefinitionOptions {
81
+ readonly fetchFormDefinition: FetchResource;
82
+ }
83
+
84
+ export const retrieveFormDefinition = async (
85
+ resource: FormResource,
86
+ options: RetrieveFormDefinitionOptions
87
+ ): Promise<ResourceXML> => {
88
+ return retrieveSourceXMLResource(resource, {
89
+ fetchResource: options.fetchFormDefinition,
90
+ });
91
+ };
@@ -1,9 +1,120 @@
1
- import { UnsupportedControl } from '../abstract/UnsupportedControl.ts';
2
- import type { ValueContext } from '../internal-api/ValueContext.ts';
1
+ import { XPathNodeKindKey } from '@getodk/xpath';
2
+ import type { Accessor } from 'solid-js';
3
+ import type { TextRange } from '../../client/TextRange.ts';
4
+ import type { ValueType } from '../../client/ValueType.ts';
5
+ import type { UnsupportedControlNodeType } from '../../client/node-types.ts';
6
+ import type { UploadNode, UploadNodeDefinition } from '../../client/unsupported/UploadNode.ts';
7
+ import type { XFormsXPathElement } from '../../integration/xpath/adapter/XFormsXPathNode.ts';
8
+ import type { StaticLeafElement } from '../../integration/xpath/static-dom/StaticElement.ts';
9
+ import type {
10
+ TempUnsupportedInputValue,
11
+ TempUnsupportedRuntimeValue,
12
+ } from '../../lib/codecs/TempUnsupportedControlCodec.ts';
13
+ import { TempUnsupportedControlCodec } from '../../lib/codecs/TempUnsupportedControlCodec.ts';
14
+ import type { CurrentState } from '../../lib/reactivity/node-state/createCurrentState.ts';
15
+ import type { EngineState } from '../../lib/reactivity/node-state/createEngineState.ts';
16
+ import type { SharedNodeState } from '../../lib/reactivity/node-state/createSharedNodeState.ts';
17
+ import { createSharedNodeState } from '../../lib/reactivity/node-state/createSharedNodeState.ts';
18
+ import { createFieldHint } from '../../lib/reactivity/text/createFieldHint.ts';
19
+ import { createNodeLabel } from '../../lib/reactivity/text/createNodeLabel.ts';
20
+ import type { UnknownAppearanceDefinition } from '../../parse/body/appearance/unknownAppearanceParser.ts';
21
+ import { ValueNode, type ValueNodeStateSpec } from '../abstract/ValueNode.ts';
22
+ import type { GeneralParentNode } from '../hierarchy.ts';
23
+ import type { EvaluationContext } from '../internal-api/EvaluationContext.ts';
24
+ import type { ValidationContext } from '../internal-api/ValidationContext.ts';
25
+ import type { ClientReactiveSerializableValueNode } from '../internal-api/serialization/ClientReactiveSerializableValueNode.ts';
3
26
 
4
- export class UploadControl extends UnsupportedControl<'upload'> implements ValueContext<unknown> {
27
+ interface UploadControlStateSpec extends ValueNodeStateSpec<TempUnsupportedRuntimeValue> {
28
+ readonly label: Accessor<TextRange<'label'> | null>;
29
+ readonly hint: Accessor<TextRange<'hint'> | null>;
30
+ readonly valueOptions: null;
31
+ }
32
+
33
+ const codecs = {
34
+ string: new TempUnsupportedControlCodec('string'),
35
+ int: new TempUnsupportedControlCodec('int'),
36
+ decimal: new TempUnsupportedControlCodec('decimal'),
37
+ boolean: new TempUnsupportedControlCodec('boolean'),
38
+ date: new TempUnsupportedControlCodec('date'),
39
+ time: new TempUnsupportedControlCodec('time'),
40
+ dateTime: new TempUnsupportedControlCodec('dateTime'),
41
+ geopoint: new TempUnsupportedControlCodec('geopoint'),
42
+ geotrace: new TempUnsupportedControlCodec('geotrace'),
43
+ geoshape: new TempUnsupportedControlCodec('geoshape'),
44
+ binary: new TempUnsupportedControlCodec('binary'),
45
+ barcode: new TempUnsupportedControlCodec('barcode'),
46
+ intent: new TempUnsupportedControlCodec('intent'),
47
+ } as const;
48
+
49
+ class UnsupportedControlWriteError extends Error {
50
+ constructor(type: UnsupportedControlNodeType) {
51
+ super(`Cannot write state for node (type: ${type}) - not implemented`);
52
+ }
53
+ }
54
+
55
+ export class UploadControl
56
+ extends ValueNode<
57
+ ValueType,
58
+ UploadNodeDefinition,
59
+ TempUnsupportedRuntimeValue,
60
+ TempUnsupportedInputValue
61
+ >
62
+ implements
63
+ UploadNode,
64
+ XFormsXPathElement,
65
+ EvaluationContext,
66
+ ValidationContext,
67
+ ClientReactiveSerializableValueNode
68
+ {
69
+ // XFormsXPathElement
70
+ override readonly [XPathNodeKindKey] = 'element';
71
+
72
+ // InstanceNode
73
+ protected readonly state: SharedNodeState<UploadControlStateSpec>;
74
+ protected readonly engineState: EngineState<UploadControlStateSpec>;
75
+
76
+ // UploadNode
5
77
  readonly nodeType = 'upload';
78
+ readonly appearances: UnknownAppearanceDefinition;
79
+ readonly nodeOptions = null;
80
+ readonly currentState: CurrentState<UploadControlStateSpec>;
81
+
82
+ constructor(
83
+ parent: GeneralParentNode,
84
+ instanceNode: StaticLeafElement | null,
85
+ definition: UploadNodeDefinition
86
+ ) {
87
+ const codec = codecs[definition.valueType];
88
+
89
+ super(parent, instanceNode, definition, codec);
90
+
91
+ this.appearances = definition.bodyElement.appearances;
92
+
93
+ const state = createSharedNodeState(
94
+ this.scope,
95
+ {
96
+ reference: this.contextReference,
97
+ readonly: this.isReadonly,
98
+ relevant: this.isRelevant,
99
+ required: this.isRequired,
100
+
101
+ label: createNodeLabel(this, definition),
102
+ hint: createFieldHint(this, definition),
103
+ children: null,
104
+ valueOptions: null,
105
+ value: this.valueState,
106
+ instanceValue: this.getInstanceValue,
107
+ },
108
+ this.instanceConfig
109
+ );
110
+
111
+ this.state = state;
112
+ this.engineState = state.engineState;
113
+ this.currentState = state.currentState;
114
+ }
6
115
 
7
- // ValueContext
8
- readonly contextNode = this;
116
+ // UnsupportedControlNode
117
+ setValue(_: never): never {
118
+ throw new UnsupportedControlWriteError(this.nodeType);
119
+ }
9
120
  }
@@ -1,8 +1,8 @@
1
1
  import type { XFormsItextTranslationMap, XFormsSecondaryInstanceMap } from '@getodk/xpath';
2
2
  import { XFormsXPathEvaluator } from '@getodk/xpath';
3
3
  import type { PrimaryInstance } from '../../instance/PrimaryInstance.ts';
4
- import type { ItextTranslationRootDefinition } from '../../parse/model/ItextTranslation/ItextTranslationRootDefinition.ts';
5
- import type { SecondaryInstanceRootDefinition } from '../../parse/model/SecondaryInstance/SecondaryInstanceRootDefinition.ts';
4
+ import type { ItextTranslationRootDefinition } from '../../parse/model/ItextTranslationsDefinition.ts';
5
+ import type { SecondaryInstanceRootDefinition } from '../../parse/model/SecondaryInstance/SecondaryInstancesDefinition.ts';
6
6
  import { engineDOMAdapter } from './adapter/engineDOMAdapter.ts';
7
7
  import type { EngineXPathNode } from './adapter/kind.ts';
8
8