@getodk/xforms-engine 0.6.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 (296) hide show
  1. package/dist/client/BaseNode.d.ts +4 -4
  2. package/dist/client/BaseValueNode.d.ts +7 -3
  3. package/dist/client/RootNode.d.ts +20 -16
  4. package/dist/client/constants.d.ts +11 -12
  5. package/dist/client/form/CreateFormInstance.d.ts +14 -0
  6. package/dist/client/form/EditFormInstance.d.ts +62 -0
  7. package/dist/client/form/FormInstance.d.ts +104 -0
  8. package/dist/client/form/FormInstanceConfig.d.ts +17 -0
  9. package/dist/client/form/FormResource.d.ts +1 -0
  10. package/dist/client/form/LoadForm.d.ts +79 -0
  11. package/dist/client/form/LoadFormResult.d.ts +67 -0
  12. package/dist/client/form/RestoreFormInstance.d.ts +8 -0
  13. package/dist/client/index.d.ts +37 -11
  14. package/dist/client/node-types.d.ts +2 -2
  15. package/dist/client/repeat/BaseRepeatRangeNode.d.ts +3 -4
  16. package/dist/client/repeat/RepeatInstanceNode.d.ts +4 -5
  17. package/dist/client/repeat/RepeatRangeControlledNode.d.ts +2 -2
  18. package/dist/client/repeat/RepeatRangeUncontrolledNode.d.ts +2 -2
  19. package/dist/client/resources.d.ts +1 -1
  20. package/dist/client/serialization/InstanceData.d.ts +12 -0
  21. package/dist/client/serialization/InstanceFile.d.ts +6 -0
  22. package/dist/client/serialization/InstancePayload.d.ts +93 -0
  23. package/dist/client/serialization/InstancePayloadOptions.d.ts +23 -0
  24. package/dist/client/serialization/InstanceState.d.ts +12 -0
  25. package/dist/client/submission/{SubmissionDefinition.d.ts → SubmissionMeta.d.ts} +1 -1
  26. package/dist/entrypoints/FormInstance.d.ts +20 -0
  27. package/dist/entrypoints/FormResult/BaseFormResult.d.ts +22 -0
  28. package/dist/entrypoints/FormResult/BaseInstantiableFormResult.d.ts +25 -0
  29. package/dist/entrypoints/FormResult/FormFailureResult.d.ts +17 -0
  30. package/dist/entrypoints/FormResult/FormSuccessResult.d.ts +15 -0
  31. package/dist/entrypoints/FormResult/FormWarningResult.d.ts +15 -0
  32. package/dist/entrypoints/createInstance.d.ts +9 -0
  33. package/dist/entrypoints/editInstance.d.ts +9 -0
  34. package/dist/entrypoints/index.d.ts +4 -0
  35. package/dist/entrypoints/loadForm.d.ts +4 -0
  36. package/dist/entrypoints/restoreInstance.d.ts +9 -0
  37. package/dist/error/LoadFormFailureError.d.ts +9 -0
  38. package/dist/error/MalformedInstanceDataError.d.ts +3 -0
  39. package/dist/error/TemplatedNodeAttributeSerializationError.d.ts +22 -0
  40. package/dist/index.d.ts +2 -33
  41. package/dist/index.js +1915 -1419
  42. package/dist/index.js.map +1 -1
  43. package/dist/instance/Group.d.ts +6 -5
  44. package/dist/instance/InputControl.d.ts +5 -4
  45. package/dist/instance/ModelValue.d.ts +5 -4
  46. package/dist/instance/Note.d.ts +4 -3
  47. package/dist/instance/PrimaryInstance.d.ts +35 -8
  48. package/dist/instance/RangeControl.d.ts +5 -4
  49. package/dist/instance/RankControl.d.ts +6 -5
  50. package/dist/instance/Root.d.ts +7 -9
  51. package/dist/instance/SelectControl.d.ts +4 -3
  52. package/dist/instance/Subtree.d.ts +6 -5
  53. package/dist/instance/TriggerControl.d.ts +4 -3
  54. package/dist/instance/abstract/DescendantNode.d.ts +10 -1
  55. package/dist/instance/abstract/InstanceNode.d.ts +7 -4
  56. package/dist/instance/abstract/ValueNode.d.ts +7 -5
  57. package/dist/instance/children/DescendantNodeInitOptions.d.ts +32 -0
  58. package/dist/instance/{children.d.ts → children/buildChildren.d.ts} +1 -1
  59. package/dist/instance/children/childrenInitOptions.d.ts +9 -0
  60. package/dist/instance/children/normalizeChildInitOptions.d.ts +2 -0
  61. package/dist/instance/input/InitialInstanceState.d.ts +13 -0
  62. package/dist/instance/input/InstanceAttachmentMap.d.ts +19 -0
  63. package/dist/instance/internal-api/InstanceConfig.d.ts +2 -9
  64. package/dist/instance/internal-api/InstanceValueContext.d.ts +8 -1
  65. package/dist/instance/internal-api/serialization/ClientReactiveSerializableInstance.d.ts +14 -0
  66. package/dist/instance/internal-api/serialization/ClientReactiveSerializableLeafNode.d.ts +32 -0
  67. package/dist/instance/internal-api/serialization/ClientReactiveSerializableParentNode.d.ts +18 -0
  68. package/dist/instance/internal-api/serialization/ClientReactiveSerializableTemplatedNode.d.ts +13 -0
  69. package/dist/instance/internal-api/serialization/ClientReactiveSerializableValueNode.d.ts +21 -0
  70. package/dist/instance/repeat/BaseRepeatRange.d.ts +10 -8
  71. package/dist/instance/repeat/RepeatInstance.d.ts +10 -7
  72. package/dist/instance/repeat/RepeatRangeControlled.d.ts +27 -3
  73. package/dist/instance/repeat/RepeatRangeUncontrolled.d.ts +4 -3
  74. package/dist/instance/resource.d.ts +5 -1
  75. package/dist/instance/unsupported/UploadControl.d.ts +32 -4
  76. package/dist/integration/xpath/EngineXPathEvaluator.d.ts +2 -2
  77. package/dist/integration/xpath/adapter/kind.d.ts +4 -10
  78. package/dist/integration/xpath/static-dom/StaticAttribute.d.ts +4 -5
  79. package/dist/integration/xpath/static-dom/StaticDocument.d.ts +13 -10
  80. package/dist/integration/xpath/static-dom/StaticElement.d.ts +21 -22
  81. package/dist/integration/xpath/static-dom/StaticNode.d.ts +1 -1
  82. package/dist/integration/xpath/static-dom/StaticParentNode.d.ts +13 -0
  83. package/dist/integration/xpath/static-dom/staticNodeName.d.ts +3 -0
  84. package/dist/lib/client-reactivity/instance-state/createNodeRangeInstanceState.d.ts +4 -0
  85. package/dist/lib/client-reactivity/instance-state/createParentNodeInstanceState.d.ts +4 -0
  86. package/dist/lib/client-reactivity/instance-state/createPrimaryInstanceState.d.ts +3 -0
  87. package/dist/lib/client-reactivity/instance-state/createRootInstanceState.d.ts +3 -0
  88. package/dist/lib/client-reactivity/instance-state/createTemplatedNodeInstanceState.d.ts +6 -0
  89. package/dist/lib/client-reactivity/instance-state/createValueNodeInstanceState.d.ts +3 -0
  90. package/dist/lib/client-reactivity/instance-state/prepareInstancePayload.d.ts +8 -0
  91. package/dist/lib/codecs/TempUnsupportedControlCodec.d.ts +7 -0
  92. package/dist/lib/names/UnprefixedXFormsName.d.ts +4 -0
  93. package/dist/lib/reactivity/createInstanceValueState.d.ts +2 -27
  94. package/dist/parse/XFormDOM.d.ts +1 -1
  95. package/dist/parse/model/BindDefinition.d.ts +1 -1
  96. package/dist/parse/model/ItextTranslationsDefinition.d.ts +18 -0
  97. package/dist/parse/model/LeafNodeDefinition.d.ts +4 -5
  98. package/dist/parse/model/ModelBindMap.d.ts +1 -1
  99. package/dist/parse/model/ModelDefinition.d.ts +9 -2
  100. package/dist/parse/model/NodeDefinition.d.ts +18 -30
  101. package/dist/parse/model/NoteNodeDefinition.d.ts +3 -2
  102. package/dist/parse/model/RangeNodeDefinition.d.ts +2 -1
  103. package/dist/parse/model/RepeatDefinition.d.ts +62 -0
  104. package/dist/parse/model/RootAttributeDefinition.d.ts +1 -4
  105. package/dist/parse/model/RootAttributeMap.d.ts +2 -1
  106. package/dist/parse/model/RootDefinition.d.ts +7 -8
  107. package/dist/parse/model/SecondaryInstance/SecondaryInstancesDefinition.d.ts +15 -2
  108. package/dist/parse/model/SecondaryInstance/assertSecondaryInstanceDefinition.d.ts +5 -0
  109. package/dist/parse/model/SecondaryInstance/defineSecondaryInstance.d.ts +5 -0
  110. package/dist/parse/model/SecondaryInstance/sources/BlankSecondaryInstanceSource.d.ts +1 -7
  111. package/dist/parse/model/SecondaryInstance/sources/CSVExternalSecondaryInstance.d.ts +1 -1
  112. package/dist/parse/model/SecondaryInstance/sources/GeoJSONExternalSecondaryInstance.d.ts +1 -1
  113. package/dist/parse/model/SecondaryInstance/sources/InternalSecondaryInstanceSource.d.ts +1 -1
  114. package/dist/parse/model/SecondaryInstance/sources/SecondaryInstanceSource.d.ts +1 -1
  115. package/dist/parse/model/SecondaryInstance/sources/XMLExternalSecondaryInstanceSource.d.ts +1 -1
  116. package/dist/parse/model/{FormSubmissionDefinition.d.ts → SubmissionDefinition.d.ts} +2 -2
  117. package/dist/parse/model/SubtreeDefinition.d.ts +4 -5
  118. package/dist/parse/model/nodeDefinitionMap.d.ts +5 -0
  119. package/dist/parse/shared/parseInstanceXML.d.ts +21 -0
  120. package/dist/parse/shared/parseStaticDocumentFromDOMSubtree.d.ts +4 -21
  121. package/dist/solid.js +1709 -1213
  122. package/dist/solid.js.map +1 -1
  123. package/package.json +1 -1
  124. package/src/client/BaseNode.ts +4 -4
  125. package/src/client/BaseValueNode.ts +7 -3
  126. package/src/client/RootNode.ts +27 -19
  127. package/src/client/constants.ts +12 -14
  128. package/src/client/form/CreateFormInstance.ts +19 -0
  129. package/src/client/form/EditFormInstance.ts +93 -0
  130. package/src/client/form/FormInstance.ts +114 -0
  131. package/src/client/form/FormInstanceConfig.ts +18 -0
  132. package/src/client/form/FormResource.ts +1 -0
  133. package/src/client/form/LoadForm.ts +92 -0
  134. package/src/client/form/LoadFormResult.ts +103 -0
  135. package/src/client/form/RestoreFormInstance.ts +14 -0
  136. package/src/client/index.ts +47 -29
  137. package/src/client/node-types.ts +2 -4
  138. package/src/client/repeat/BaseRepeatRangeNode.ts +3 -4
  139. package/src/client/repeat/RepeatInstanceNode.ts +4 -8
  140. package/src/client/repeat/RepeatRangeControlledNode.ts +2 -2
  141. package/src/client/repeat/RepeatRangeUncontrolledNode.ts +2 -2
  142. package/src/client/resources.ts +2 -2
  143. package/src/client/serialization/InstanceData.ts +16 -0
  144. package/src/client/serialization/InstanceFile.ts +9 -0
  145. package/src/client/serialization/InstancePayload.ts +126 -0
  146. package/src/client/serialization/InstancePayloadOptions.ts +28 -0
  147. package/src/client/serialization/InstanceState.ts +14 -0
  148. package/src/client/submission/{SubmissionDefinition.ts → SubmissionMeta.ts} +1 -1
  149. package/src/entrypoints/FormInstance.ts +55 -0
  150. package/src/entrypoints/FormResult/BaseFormResult.ts +40 -0
  151. package/src/entrypoints/FormResult/BaseInstantiableFormResult.ts +109 -0
  152. package/src/entrypoints/FormResult/FormFailureResult.ts +44 -0
  153. package/src/entrypoints/FormResult/FormSuccessResult.ts +25 -0
  154. package/src/entrypoints/FormResult/FormWarningResult.ts +25 -0
  155. package/src/entrypoints/createInstance.ts +23 -0
  156. package/src/entrypoints/editInstance.ts +24 -0
  157. package/src/entrypoints/index.ts +4 -0
  158. package/src/entrypoints/loadForm.ts +154 -0
  159. package/src/entrypoints/restoreInstance.ts +27 -0
  160. package/src/error/LoadFormFailureError.ts +114 -0
  161. package/src/error/MalformedInstanceDataError.ts +3 -0
  162. package/src/error/TemplatedNodeAttributeSerializationError.ts +24 -0
  163. package/src/index.ts +2 -46
  164. package/src/instance/Group.ts +16 -15
  165. package/src/instance/InputControl.ts +17 -11
  166. package/src/instance/ModelValue.ts +17 -11
  167. package/src/instance/Note.ts +10 -9
  168. package/src/instance/PrimaryInstance.ts +69 -31
  169. package/src/instance/RangeControl.ts +17 -11
  170. package/src/instance/RankControl.ts +28 -19
  171. package/src/instance/Root.ts +20 -31
  172. package/src/instance/SelectControl.ts +21 -12
  173. package/src/instance/Subtree.ts +16 -15
  174. package/src/instance/TriggerControl.ts +21 -12
  175. package/src/instance/abstract/DescendantNode.ts +12 -2
  176. package/src/instance/abstract/InstanceNode.ts +9 -5
  177. package/src/instance/abstract/ValueNode.ts +11 -13
  178. package/src/instance/children/DescendantNodeInitOptions.ts +35 -0
  179. package/src/instance/{children.ts → children/buildChildren.ts} +55 -48
  180. package/src/instance/children/childrenInitOptions.ts +117 -0
  181. package/src/instance/children/normalizeChildInitOptions.ts +332 -0
  182. package/src/instance/input/InitialInstanceState.ts +108 -0
  183. package/src/instance/input/InstanceAttachmentMap.ts +142 -0
  184. package/src/instance/internal-api/InstanceConfig.ts +3 -10
  185. package/src/instance/internal-api/InstanceValueContext.ts +9 -1
  186. package/src/instance/internal-api/serialization/ClientReactiveSerializableInstance.ts +20 -0
  187. package/src/instance/internal-api/serialization/ClientReactiveSerializableLeafNode.ts +43 -0
  188. package/src/instance/internal-api/serialization/ClientReactiveSerializableParentNode.ts +26 -0
  189. package/src/instance/internal-api/serialization/ClientReactiveSerializableTemplatedNode.ts +24 -0
  190. package/src/instance/internal-api/serialization/ClientReactiveSerializableValueNode.ts +28 -0
  191. package/src/instance/repeat/BaseRepeatRange.ts +19 -24
  192. package/src/instance/repeat/RepeatInstance.ts +26 -19
  193. package/src/instance/repeat/RepeatRangeControlled.ts +90 -17
  194. package/src/instance/repeat/RepeatRangeUncontrolled.ts +10 -9
  195. package/src/instance/resource.ts +14 -1
  196. package/src/instance/unsupported/UploadControl.ts +116 -5
  197. package/src/integration/xpath/EngineXPathEvaluator.ts +2 -2
  198. package/src/integration/xpath/adapter/kind.ts +1 -28
  199. package/src/integration/xpath/adapter/traversal.ts +2 -2
  200. package/src/integration/xpath/static-dom/StaticAttribute.ts +6 -5
  201. package/src/integration/xpath/static-dom/StaticDocument.ts +17 -16
  202. package/src/integration/xpath/static-dom/StaticElement.ts +196 -50
  203. package/src/integration/xpath/static-dom/StaticNode.ts +1 -1
  204. package/src/integration/xpath/static-dom/StaticParentNode.ts +22 -0
  205. package/src/integration/xpath/static-dom/staticNodeName.ts +20 -0
  206. package/src/lib/client-reactivity/instance-state/createNodeRangeInstanceState.ts +17 -0
  207. package/src/lib/client-reactivity/instance-state/createParentNodeInstanceState.ts +22 -0
  208. package/src/lib/client-reactivity/instance-state/createPrimaryInstanceState.ts +12 -0
  209. package/src/lib/client-reactivity/{submission/createRootSubmissionState.ts → instance-state/createRootInstanceState.ts} +4 -4
  210. package/src/lib/client-reactivity/instance-state/createTemplatedNodeInstanceState.ts +31 -0
  211. package/src/lib/client-reactivity/instance-state/createValueNodeInstanceState.ts +21 -0
  212. package/src/lib/client-reactivity/instance-state/prepareInstancePayload.ts +173 -0
  213. package/src/lib/codecs/TempUnsupportedControlCodec.ts +32 -0
  214. package/src/lib/names/UnprefixedXFormsName.ts +12 -0
  215. package/src/lib/reactivity/createInstanceValueState.ts +27 -51
  216. package/src/parse/model/ItextTranslationsDefinition.ts +79 -0
  217. package/src/parse/model/LeafNodeDefinition.ts +3 -5
  218. package/src/parse/model/ModelDefinition.ts +36 -3
  219. package/src/parse/model/NodeDefinition.ts +19 -45
  220. package/src/parse/model/NoteNodeDefinition.ts +4 -3
  221. package/src/parse/model/RangeNodeDefinition.ts +3 -2
  222. package/src/parse/model/RepeatDefinition.ts +382 -0
  223. package/src/parse/model/RootAttributeDefinition.ts +6 -7
  224. package/src/parse/model/RootAttributeMap.ts +15 -10
  225. package/src/parse/model/RootDefinition.ts +17 -19
  226. package/src/parse/model/SecondaryInstance/SecondaryInstancesDefinition.ts +23 -2
  227. package/src/parse/model/SecondaryInstance/assertSecondaryInstanceDefinition.ts +14 -0
  228. package/src/parse/model/SecondaryInstance/defineSecondaryInstance.ts +32 -0
  229. package/src/parse/model/SecondaryInstance/sources/BlankSecondaryInstanceSource.ts +3 -24
  230. package/src/parse/model/SecondaryInstance/sources/CSVExternalSecondaryInstance.ts +33 -86
  231. package/src/parse/model/SecondaryInstance/sources/GeoJSONExternalSecondaryInstance.ts +64 -137
  232. package/src/parse/model/SecondaryInstance/sources/InternalSecondaryInstanceSource.ts +9 -7
  233. package/src/parse/model/SecondaryInstance/sources/SecondaryInstanceSource.ts +1 -1
  234. package/src/parse/model/SecondaryInstance/sources/XMLExternalSecondaryInstanceSource.ts +7 -7
  235. package/src/parse/model/{FormSubmissionDefinition.ts → SubmissionDefinition.ts} +2 -2
  236. package/src/parse/model/SubtreeDefinition.ts +4 -5
  237. package/src/parse/model/nodeDefinitionMap.ts +34 -0
  238. package/src/parse/shared/parseInstanceXML.ts +79 -0
  239. package/src/parse/shared/parseStaticDocumentFromDOMSubtree.ts +45 -130
  240. package/dist/client/EngineConfig.d.ts +0 -79
  241. package/dist/client/submission/SubmissionData.d.ts +0 -7
  242. package/dist/client/submission/SubmissionInstanceFile.d.ts +0 -6
  243. package/dist/client/submission/SubmissionOptions.d.ts +0 -23
  244. package/dist/client/submission/SubmissionResult.d.ts +0 -91
  245. package/dist/client/submission/SubmissionState.d.ts +0 -12
  246. package/dist/instance/abstract/UnsupportedControl.d.ts +0 -54
  247. package/dist/instance/index.d.ts +0 -8
  248. package/dist/instance/internal-api/ValueContext.d.ts +0 -23
  249. package/dist/instance/internal-api/submission/ClientReactiveSubmittableInstance.d.ts +0 -14
  250. package/dist/instance/internal-api/submission/ClientReactiveSubmittableLeafNode.d.ts +0 -32
  251. package/dist/instance/internal-api/submission/ClientReactiveSubmittableParentNode.d.ts +0 -19
  252. package/dist/instance/internal-api/submission/ClientReactiveSubmittableValueNode.d.ts +0 -18
  253. package/dist/lib/client-reactivity/submission/createInstanceSubmissionState.d.ts +0 -3
  254. package/dist/lib/client-reactivity/submission/createLeafNodeSubmissionState.d.ts +0 -3
  255. package/dist/lib/client-reactivity/submission/createNodeRangeSubmissionState.d.ts +0 -4
  256. package/dist/lib/client-reactivity/submission/createParentNodeSubmissionState.d.ts +0 -4
  257. package/dist/lib/client-reactivity/submission/createRootSubmissionState.d.ts +0 -3
  258. package/dist/lib/client-reactivity/submission/createValueNodeSubmissionState.d.ts +0 -3
  259. package/dist/lib/client-reactivity/submission/prepareSubmission.d.ts +0 -8
  260. package/dist/lib/reactivity/createValueState.d.ts +0 -40
  261. package/dist/parse/model/ItextTranslation/ItextTranslationDefinition.d.ts +0 -4
  262. package/dist/parse/model/ItextTranslation/ItextTranslationRootDefinition.d.ts +0 -9
  263. package/dist/parse/model/ItextTranslation/ItextTranslationsDefinition.d.ts +0 -8
  264. package/dist/parse/model/RepeatInstanceDefinition.d.ts +0 -17
  265. package/dist/parse/model/RepeatRangeDefinition.d.ts +0 -32
  266. package/dist/parse/model/RepeatTemplateDefinition.d.ts +0 -31
  267. package/dist/parse/model/SecondaryInstance/SecondaryInstanceDefinition.d.ts +0 -4
  268. package/dist/parse/model/SecondaryInstance/SecondaryInstanceRootDefinition.d.ts +0 -7
  269. package/src/client/EngineConfig.ts +0 -84
  270. package/src/client/submission/SubmissionData.ts +0 -12
  271. package/src/client/submission/SubmissionInstanceFile.ts +0 -9
  272. package/src/client/submission/SubmissionOptions.ts +0 -28
  273. package/src/client/submission/SubmissionResult.ts +0 -124
  274. package/src/client/submission/SubmissionState.ts +0 -14
  275. package/src/instance/abstract/UnsupportedControl.ts +0 -175
  276. package/src/instance/index.ts +0 -55
  277. package/src/instance/internal-api/ValueContext.ts +0 -28
  278. package/src/instance/internal-api/submission/ClientReactiveSubmittableInstance.ts +0 -20
  279. package/src/instance/internal-api/submission/ClientReactiveSubmittableLeafNode.ts +0 -43
  280. package/src/instance/internal-api/submission/ClientReactiveSubmittableParentNode.ts +0 -26
  281. package/src/instance/internal-api/submission/ClientReactiveSubmittableValueNode.ts +0 -24
  282. package/src/lib/client-reactivity/submission/createInstanceSubmissionState.ts +0 -12
  283. package/src/lib/client-reactivity/submission/createLeafNodeSubmissionState.ts +0 -20
  284. package/src/lib/client-reactivity/submission/createNodeRangeSubmissionState.ts +0 -17
  285. package/src/lib/client-reactivity/submission/createParentNodeSubmissionState.ts +0 -22
  286. package/src/lib/client-reactivity/submission/createValueNodeSubmissionState.ts +0 -21
  287. package/src/lib/client-reactivity/submission/prepareSubmission.ts +0 -172
  288. package/src/lib/reactivity/createValueState.ts +0 -200
  289. package/src/parse/model/ItextTranslation/ItextTranslationDefinition.ts +0 -4
  290. package/src/parse/model/ItextTranslation/ItextTranslationRootDefinition.ts +0 -42
  291. package/src/parse/model/ItextTranslation/ItextTranslationsDefinition.ts +0 -31
  292. package/src/parse/model/RepeatInstanceDefinition.ts +0 -38
  293. package/src/parse/model/RepeatRangeDefinition.ts +0 -98
  294. package/src/parse/model/RepeatTemplateDefinition.ts +0 -149
  295. package/src/parse/model/SecondaryInstance/SecondaryInstanceDefinition.ts +0 -4
  296. package/src/parse/model/SecondaryInstance/SecondaryInstanceRootDefinition.ts +0 -12
@@ -12,6 +12,7 @@ import type { TextRange } from '../client/TextRange.ts';
12
12
  import type { ValueType } from '../client/ValueType.ts';
13
13
  import { SelectValueTypeError } from '../error/SelectValueTypeError.ts';
14
14
  import type { XFormsXPathElement } from '../integration/xpath/adapter/XFormsXPathNode.ts';
15
+ import type { StaticLeafElement } from '../integration/xpath/static-dom/StaticElement.ts';
15
16
  import { getSelectCodec } from '../lib/codecs/getSelectCodec.ts';
16
17
  import { createItemCollection } from '../lib/reactivity/createItemCollection.ts';
17
18
  import type { CurrentState } from '../lib/reactivity/node-state/createCurrentState.ts';
@@ -28,7 +29,7 @@ import { ValueNode } from './abstract/ValueNode.ts';
28
29
  import type { GeneralParentNode } from './hierarchy.ts';
29
30
  import type { EvaluationContext } from './internal-api/EvaluationContext.ts';
30
31
  import type { ValidationContext } from './internal-api/ValidationContext.ts';
31
- import type { ClientReactiveSubmittableValueNode } from './internal-api/submission/ClientReactiveSubmittableValueNode.ts';
32
+ import type { ClientReactiveSerializableValueNode } from './internal-api/serialization/ClientReactiveSerializableValueNode.ts';
32
33
 
33
34
  export type AnySelectDefinition = {
34
35
  [V in ValueType]: SelectDefinition<V>;
@@ -59,13 +60,21 @@ export class SelectControl
59
60
  XFormsXPathElement,
60
61
  EvaluationContext,
61
62
  ValidationContext,
62
- ClientReactiveSubmittableValueNode
63
+ ClientReactiveSerializableValueNode
63
64
  {
64
- static from(parent: GeneralParentNode, definition: SelectDefinition): SelectControl;
65
- static from(parent: GeneralParentNode, definition: AnySelectDefinition): SelectControl {
65
+ static from(
66
+ parent: GeneralParentNode,
67
+ instanceNode: StaticLeafElement | null,
68
+ definition: SelectDefinition
69
+ ): SelectControl;
70
+ static from(
71
+ parent: GeneralParentNode,
72
+ instanceNode: StaticLeafElement | null,
73
+ definition: AnySelectDefinition
74
+ ): SelectControl {
66
75
  assertSupportedSelectValueType(definition);
67
76
 
68
- return new this(parent, definition);
77
+ return new this(parent, instanceNode, definition);
69
78
  }
70
79
 
71
80
  private readonly mapOptionsByValue: Accessor<SelectItemMap>;
@@ -86,10 +95,14 @@ export class SelectControl
86
95
  readonly nodeOptions = null;
87
96
  readonly currentState: CurrentState<SelectControlStateSpec>;
88
97
 
89
- private constructor(parent: GeneralParentNode, definition: SelectDefinition<'string'>) {
98
+ private constructor(
99
+ parent: GeneralParentNode,
100
+ instanceNode: StaticLeafElement | null,
101
+ definition: SelectDefinition<'string'>
102
+ ) {
90
103
  const codec = getSelectCodec(definition);
91
104
 
92
- super(parent, definition, codec);
105
+ super(parent, instanceNode, definition, codec);
93
106
 
94
107
  this.appearances = definition.bodyElement.appearances;
95
108
  this.selectType = definition.bodyElement.type;
@@ -123,10 +136,6 @@ export class SelectControl
123
136
  });
124
137
  });
125
138
 
126
- const sharedStateOptions = {
127
- clientStateFactory: this.engineConfig.stateFactory,
128
- };
129
-
130
139
  const state = createSharedNodeState(
131
140
  this.scope,
132
141
  {
@@ -142,7 +151,7 @@ export class SelectControl
142
151
  value: valueState,
143
152
  instanceValue: this.getInstanceValue,
144
153
  },
145
- sharedStateOptions
154
+ this.instanceConfig
146
155
  );
147
156
 
148
157
  this.state = state;
@@ -1,11 +1,12 @@
1
1
  import { XPathNodeKindKey } from '@getodk/xpath';
2
2
  import type { Accessor } from 'solid-js';
3
3
  import type { FormNodeID } from '../client/identity.ts';
4
- import type { SubmissionState } from '../client/submission/SubmissionState.ts';
4
+ import type { InstanceState } from '../client/serialization/InstanceState.ts';
5
5
  import type { SubtreeDefinition, SubtreeNode } from '../client/SubtreeNode.ts';
6
6
  import type { AncestorNodeValidationState } from '../client/validation.ts';
7
7
  import type { XFormsXPathElement } from '../integration/xpath/adapter/XFormsXPathNode.ts';
8
- import { createParentNodeSubmissionState } from '../lib/client-reactivity/submission/createParentNodeSubmissionState.ts';
8
+ import type { StaticElement } from '../integration/xpath/static-dom/StaticElement.ts';
9
+ import { createParentNodeInstanceState } from '../lib/client-reactivity/instance-state/createParentNodeInstanceState.ts';
9
10
  import type { ChildrenState } from '../lib/reactivity/createChildrenState.ts';
10
11
  import { createChildrenState } from '../lib/reactivity/createChildrenState.ts';
11
12
  import type { MaterializedChildren } from '../lib/reactivity/materializeCurrentStateChildren.ts';
@@ -17,10 +18,10 @@ import { createSharedNodeState } from '../lib/reactivity/node-state/createShared
17
18
  import { createAggregatedViolations } from '../lib/reactivity/validation/createAggregatedViolations.ts';
18
19
  import type { DescendantNodeSharedStateSpec } from './abstract/DescendantNode.ts';
19
20
  import { DescendantNode } from './abstract/DescendantNode.ts';
20
- import { buildChildren } from './children.ts';
21
+ import { buildChildren } from './children/buildChildren.ts';
21
22
  import type { GeneralChildNode, GeneralParentNode } from './hierarchy.ts';
22
23
  import type { EvaluationContext } from './internal-api/EvaluationContext.ts';
23
- import type { ClientReactiveSubmittableParentNode } from './internal-api/submission/ClientReactiveSubmittableParentNode.ts';
24
+ import type { ClientReactiveSerializableParentNode } from './internal-api/serialization/ClientReactiveSerializableParentNode.ts';
24
25
 
25
26
  interface SubtreeStateSpec extends DescendantNodeSharedStateSpec {
26
27
  readonly label: null;
@@ -36,7 +37,7 @@ export class Subtree
36
37
  SubtreeNode,
37
38
  XFormsXPathElement,
38
39
  EvaluationContext,
39
- ClientReactiveSubmittableParentNode<GeneralChildNode>
40
+ ClientReactiveSerializableParentNode<GeneralChildNode>
40
41
  {
41
42
  private readonly childrenState: ChildrenState<GeneralChildNode>;
42
43
 
@@ -52,19 +53,19 @@ export class Subtree
52
53
  readonly nodeOptions = null;
53
54
  readonly currentState: MaterializedChildren<CurrentState<SubtreeStateSpec>, GeneralChildNode>;
54
55
  readonly validationState: AncestorNodeValidationState;
55
- readonly submissionState: SubmissionState;
56
+ readonly instanceState: InstanceState;
56
57
 
57
- constructor(parent: GeneralParentNode, definition: SubtreeDefinition) {
58
- super(parent, definition);
58
+ constructor(
59
+ parent: GeneralParentNode,
60
+ instanceNode: StaticElement | null,
61
+ definition: SubtreeDefinition
62
+ ) {
63
+ super(parent, instanceNode, definition);
59
64
 
60
65
  const childrenState = createChildrenState<Subtree, GeneralChildNode>(this);
61
66
 
62
67
  this.childrenState = childrenState;
63
68
 
64
- const sharedStateOptions = {
65
- clientStateFactory: this.engineConfig.stateFactory,
66
- };
67
-
68
69
  const state = createSharedNodeState(
69
70
  this.scope,
70
71
  {
@@ -79,7 +80,7 @@ export class Subtree
79
80
  valueOptions: null,
80
81
  value: null,
81
82
  },
82
- sharedStateOptions
83
+ this.instanceConfig
83
84
  );
84
85
 
85
86
  this.state = state;
@@ -91,8 +92,8 @@ export class Subtree
91
92
  );
92
93
 
93
94
  childrenState.setChildren(buildChildren(this));
94
- this.validationState = createAggregatedViolations(this, sharedStateOptions);
95
- this.submissionState = createParentNodeSubmissionState(this);
95
+ this.validationState = createAggregatedViolations(this, this.instanceConfig);
96
+ this.instanceState = createParentNodeInstanceState(this);
96
97
  }
97
98
 
98
99
  getChildren(): readonly GeneralChildNode[] {
@@ -5,6 +5,7 @@ import type { TriggerNode, TriggerNodeDefinition } from '../client/TriggerNode.t
5
5
  import type { ValueType } from '../client/ValueType.ts';
6
6
  import { ErrorProductionDesignPendingError } from '../error/ErrorProductionDesignPendingError.ts';
7
7
  import type { XFormsXPathElement } from '../integration/xpath/adapter/XFormsXPathNode.ts';
8
+ import type { StaticLeafElement } from '../integration/xpath/static-dom/StaticElement.ts';
8
9
  import type { TriggerInputValue, TriggerRuntimeValue } from '../lib/codecs/TriggerCodec.ts';
9
10
  import { TriggerCodec } from '../lib/codecs/TriggerCodec.ts';
10
11
  import type { CurrentState } from '../lib/reactivity/node-state/createCurrentState.ts';
@@ -19,7 +20,7 @@ import { ValueNode, type ValueNodeStateSpec } from './abstract/ValueNode.ts';
19
20
  import type { GeneralParentNode } from './hierarchy.ts';
20
21
  import type { EvaluationContext } from './internal-api/EvaluationContext.ts';
21
22
  import type { ValidationContext } from './internal-api/ValidationContext.ts';
22
- import type { ClientReactiveSubmittableValueNode } from './internal-api/submission/ClientReactiveSubmittableValueNode.ts';
23
+ import type { ClientReactiveSerializableValueNode } from './internal-api/serialization/ClientReactiveSerializableValueNode.ts';
23
24
 
24
25
  interface TriggerControlStateSpec extends ValueNodeStateSpec<TriggerRuntimeValue> {
25
26
  readonly label: Accessor<TextRange<'label'> | null>;
@@ -45,17 +46,25 @@ export class TriggerControl
45
46
  XFormsXPathElement,
46
47
  EvaluationContext,
47
48
  ValidationContext,
48
- ClientReactiveSubmittableValueNode
49
+ ClientReactiveSerializableValueNode
49
50
  {
50
- static from(parent: GeneralParentNode, definition: TriggerNodeDefinition): TriggerControl;
51
- static from(parent: GeneralParentNode, definition: AnyTriggerNodeDefinition): TriggerControl {
51
+ static from(
52
+ parent: GeneralParentNode,
53
+ instanceNode: StaticLeafElement | null,
54
+ definition: TriggerNodeDefinition
55
+ ): TriggerControl;
56
+ static from(
57
+ parent: GeneralParentNode,
58
+ instanceNode: StaticLeafElement | null,
59
+ definition: AnyTriggerNodeDefinition
60
+ ): TriggerControl {
52
61
  if (definition.valueType !== 'string') {
53
62
  throw new ErrorProductionDesignPendingError(
54
63
  `Unsupported trigger value type: ${definition.valueType}`
55
64
  );
56
65
  }
57
66
 
58
- return new this(parent, definition);
67
+ return new this(parent, instanceNode, definition);
59
68
  }
60
69
 
61
70
  // XFormsXPathElement
@@ -71,15 +80,15 @@ export class TriggerControl
71
80
  readonly nodeOptions = null;
72
81
  readonly currentState: CurrentState<TriggerControlStateSpec>;
73
82
 
74
- private constructor(parent: GeneralParentNode, definition: TriggerNodeDefinition<'string'>) {
75
- super(parent, definition, codec);
83
+ private constructor(
84
+ parent: GeneralParentNode,
85
+ instanceNode: StaticLeafElement | null,
86
+ definition: TriggerNodeDefinition<'string'>
87
+ ) {
88
+ super(parent, instanceNode, definition, codec);
76
89
 
77
90
  this.appearances = definition.bodyElement.appearances;
78
91
 
79
- const sharedStateOptions = {
80
- clientStateFactory: this.engineConfig.stateFactory,
81
- };
82
-
83
92
  const state = createSharedNodeState(
84
93
  this.scope,
85
94
  {
@@ -95,7 +104,7 @@ export class TriggerControl
95
104
  value: this.valueState,
96
105
  instanceValue: this.getInstanceValue,
97
106
  },
98
- sharedStateOptions
107
+ this.instanceConfig
99
108
  );
100
109
 
101
110
  this.state = state;
@@ -11,9 +11,11 @@ import type {
11
11
  } from '../../integration/xpath/adapter/XFormsXPathNode.ts';
12
12
  import { XFORMS_XPATH_NODE_RANGE_KIND } from '../../integration/xpath/adapter/XFormsXPathNode.ts';
13
13
  import type { EngineXPathEvaluator } from '../../integration/xpath/EngineXPathEvaluator.ts';
14
+ import type { StaticElement } from '../../integration/xpath/static-dom/StaticElement.ts';
14
15
  import { createComputedExpression } from '../../lib/reactivity/createComputedExpression.ts';
15
16
  import type { ReactiveScope } from '../../lib/reactivity/scope.ts';
16
17
  import type { AnyNodeDefinition } from '../../parse/model/NodeDefinition.ts';
18
+ import type { DescendantNodeInitOptions } from '../children/DescendantNodeInitOptions.ts';
17
19
  import type { AnyChildNode, AnyParentNode, RepeatRange } from '../hierarchy.ts';
18
20
  import type { EvaluationContext } from '../internal-api/EvaluationContext.ts';
19
21
  import type { RepeatInstance } from '../repeat/RepeatInstance.ts';
@@ -50,6 +52,13 @@ interface DescendantNodeOptions {
50
52
  readonly computeReference?: Accessor<string>;
51
53
  }
52
54
 
55
+ /**
56
+ * @todo Unify constructor signatures of {@link DescendantNode} and its
57
+ * subclasses, which will simplify the branchy logic of child node construction
58
+ * and minimize internal churn as common themes evolve. A good starting point is
59
+ * beginning to form in {@link DescendantNodeInitOptions} (not to be confused
60
+ * with the current module-local {@link DescendantNodeOptions}).
61
+ */
53
62
  export abstract class DescendantNode<
54
63
  Definition extends DescendantNodeDefinition,
55
64
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
@@ -128,10 +137,11 @@ export abstract class DescendantNode<
128
137
 
129
138
  constructor(
130
139
  override readonly parent: Parent,
140
+ override readonly instanceNode: StaticElement | null,
131
141
  override readonly definition: Definition,
132
142
  options?: DescendantNodeOptions
133
143
  ) {
134
- super(parent.engineConfig, parent, definition, options);
144
+ super(parent.instanceConfig, parent, instanceNode, definition, options);
135
145
 
136
146
  if (this.isRoot()) {
137
147
  this.root = this;
@@ -142,7 +152,7 @@ export abstract class DescendantNode<
142
152
  const { evaluator } = parent;
143
153
 
144
154
  // See notes on property declaration
145
- if (definition.type === 'repeat-range') {
155
+ if (definition.type === 'repeat') {
146
156
  this[XPathNodeKindKey] = XFORMS_XPATH_NODE_RANGE_KIND;
147
157
  } else {
148
158
  this[XPathNodeKindKey] = 'element';
@@ -4,7 +4,7 @@ import type { BaseNode } from '../../client/BaseNode.ts';
4
4
  import type { NodeAppearances } from '../../client/NodeAppearances.ts';
5
5
  import type { FormNodeID } from '../../client/identity.ts';
6
6
  import type { InstanceNodeType as ClientInstanceNodeType } from '../../client/node-types.ts';
7
- import type { SubmissionState } from '../../client/submission/SubmissionState.ts';
7
+ import type { InstanceState } from '../../client/serialization/InstanceState.ts';
8
8
  import type { NodeValidationState } from '../../client/validation.ts';
9
9
  import type { ActiveLanguage, TextRange } from '../../index.ts';
10
10
  import type { EngineXPathEvaluator } from '../../integration/xpath/EngineXPathEvaluator.ts';
@@ -13,6 +13,8 @@ import type {
13
13
  XFormsXPathPrimaryInstanceNodeKind,
14
14
  } from '../../integration/xpath/adapter/XFormsXPathNode.ts';
15
15
  import type { PrimaryInstanceXPathNode } from '../../integration/xpath/adapter/kind.ts';
16
+ import type { StaticDocument } from '../../integration/xpath/static-dom/StaticDocument.ts';
17
+ import type { StaticElement } from '../../integration/xpath/static-dom/StaticElement.ts';
16
18
  import type { MaterializedChildren } from '../../lib/reactivity/materializeCurrentStateChildren.ts';
17
19
  import type { CurrentState } from '../../lib/reactivity/node-state/createCurrentState.ts';
18
20
  import type { EngineState } from '../../lib/reactivity/node-state/createEngineState.ts';
@@ -20,6 +22,7 @@ import type { SharedNodeState } from '../../lib/reactivity/node-state/createShar
20
22
  import type { ReactiveScope } from '../../lib/reactivity/scope.ts';
21
23
  import { createReactiveScope } from '../../lib/reactivity/scope.ts';
22
24
  import type { SimpleAtomicState } from '../../lib/reactivity/types.ts';
25
+ import { createUniqueId } from '../../lib/unique-id.ts';
23
26
  import type { AnyNodeDefinition } from '../../parse/model/NodeDefinition.ts';
24
27
  import type { PrimaryInstance } from '../PrimaryInstance.ts';
25
28
  import type { Root } from '../Root.ts';
@@ -148,7 +151,7 @@ export abstract class InstanceNode<
148
151
 
149
152
  abstract readonly validationState: NodeValidationState;
150
153
 
151
- abstract readonly submissionState: SubmissionState;
154
+ abstract readonly instanceState: InstanceState;
152
155
 
153
156
  // EvaluationContext: instance-global/shared
154
157
  abstract readonly evaluator: EngineXPathEvaluator;
@@ -186,8 +189,9 @@ export abstract class InstanceNode<
186
189
  this as AnyInstanceNode as PrimaryInstanceXPathNode;
187
190
 
188
191
  constructor(
189
- readonly engineConfig: InstanceConfig,
192
+ readonly instanceConfig: InstanceConfig,
190
193
  readonly parent: Parent,
194
+ readonly instanceNode: StaticDocument | StaticElement | null,
191
195
  readonly definition: Definition,
192
196
  options?: InstanceNodeOptions
193
197
  ) {
@@ -208,8 +212,8 @@ export abstract class InstanceNode<
208
212
  this.computeReference = options?.computeReference ?? this.computeChildStepReference;
209
213
 
210
214
  this.scope = options?.scope ?? createReactiveScope();
211
- this.engineConfig = engineConfig;
212
- this.nodeId = nodeID(engineConfig.createUniqueId());
215
+ this.instanceConfig = instanceConfig;
216
+ this.nodeId = nodeID(createUniqueId());
213
217
  this.definition = definition;
214
218
  }
215
219
 
@@ -2,11 +2,12 @@ import { XPathNodeKindKey } from '@getodk/xpath';
2
2
  import type { Accessor } from 'solid-js';
3
3
  import type { BaseValueNode } from '../../client/BaseValueNode.ts';
4
4
  import type { LeafNodeType as ValueNodeType } from '../../client/node-types.ts';
5
- import type { SubmissionState } from '../../client/submission/SubmissionState.ts';
5
+ import type { InstanceState } from '../../client/serialization/InstanceState.ts';
6
6
  import type { AnyViolation, LeafNodeValidationState } from '../../client/validation.ts';
7
7
  import type { ValueType } from '../../client/ValueType.ts';
8
8
  import type { XFormsXPathElement } from '../../integration/xpath/adapter/XFormsXPathNode.ts';
9
- import { createValueNodeSubmissionState } from '../../lib/client-reactivity/submission/createValueNodeSubmissionState.ts';
9
+ import type { StaticLeafElement } from '../../integration/xpath/static-dom/StaticElement.ts';
10
+ import { createValueNodeInstanceState } from '../../lib/client-reactivity/instance-state/createValueNodeInstanceState.ts';
10
11
  import type {
11
12
  RuntimeValueSetter,
12
13
  RuntimeValueState,
@@ -26,7 +27,7 @@ import type {
26
27
  DecodeInstanceValue,
27
28
  InstanceValueContext,
28
29
  } from '../internal-api/InstanceValueContext.ts';
29
- import type { ClientReactiveSubmittableValueNode } from '../internal-api/submission/ClientReactiveSubmittableValueNode.ts';
30
+ import type { ClientReactiveSerializableValueNode } from '../internal-api/serialization/ClientReactiveSerializableValueNode.ts';
30
31
  import type { ValidationContext } from '../internal-api/ValidationContext.ts';
31
32
  import type { DescendantNodeStateSpec } from './DescendantNode.ts';
32
33
  import { DescendantNode } from './DescendantNode.ts';
@@ -52,7 +53,7 @@ export abstract class ValueNode<
52
53
  EvaluationContext,
53
54
  InstanceValueContext,
54
55
  ValidationContext,
55
- ClientReactiveSubmittableValueNode
56
+ ClientReactiveSerializableValueNode
56
57
  {
57
58
  protected readonly validation: SharedValidationState;
58
59
  protected readonly getInstanceValue: Accessor<string>;
@@ -80,21 +81,20 @@ export abstract class ValueNode<
80
81
  return this.validation.currentState;
81
82
  }
82
83
 
83
- readonly submissionState: SubmissionState;
84
+ readonly instanceState: InstanceState;
84
85
 
85
86
  constructor(
86
87
  parent: GeneralParentNode,
88
+ override readonly instanceNode: StaticLeafElement | null,
87
89
  definition: Definition,
88
90
  codec: ValueCodec<V, RuntimeValue, RuntimeInputValue>
89
91
  ) {
90
- super(parent, definition);
92
+ super(parent, instanceNode, definition);
91
93
 
92
94
  this.valueType = definition.valueType;
93
95
  this.decodeInstanceValue = codec.decodeInstanceValue;
94
96
 
95
- const instanceValueState = createInstanceValueState(this, {
96
- initialValueSource: 'FORM_DEFAULT',
97
- });
97
+ const instanceValueState = createInstanceValueState(this);
98
98
  const valueState = codec.createRuntimeValueState(instanceValueState);
99
99
 
100
100
  const [getInstanceValue] = instanceValueState;
@@ -106,10 +106,8 @@ export abstract class ValueNode<
106
106
  return this.getInstanceValue();
107
107
  };
108
108
  this.valueState = valueState;
109
- this.validation = createValidationState(this, {
110
- clientStateFactory: this.engineConfig.stateFactory,
111
- });
112
- this.submissionState = createValueNodeSubmissionState(this);
109
+ this.validation = createValidationState(this, this.instanceConfig);
110
+ this.instanceState = createValueNodeInstanceState(this);
113
111
  }
114
112
 
115
113
  // ValidationContext
@@ -0,0 +1,35 @@
1
+ import type { StaticElement } from '../../integration/xpath/static-dom/StaticElement.ts';
2
+ import type { ChildNodeDefinition } from '../../parse/model/NodeDefinition.ts';
3
+ import type { DescendantNode } from '../abstract/DescendantNode.ts';
4
+ import type { childrenInitOptions } from './childrenInitOptions.ts';
5
+
6
+ /**
7
+ * @todo We could pretty significantly simplify downstream child node
8
+ * construction logic, if we break this down into a tagged union (essentially
9
+ * moving the branchy type refinement aspects up the stack, probably trimming
10
+ * the construction logic itself down to a switch statement). At which point,
11
+ * it'd also probably be easier to reason about each of those constructors
12
+ * accepting input exactly as it's represented as a member of this hypothetical
13
+ * tagged union. Something like this:
14
+ *
15
+ * - Revise each concrete {@link DescendantNode} class to accept an options-like
16
+ * object suitable for its construction, each respectively defined by an
17
+ * interface whose name is consistent with that node
18
+ * - Update this type to be a union of those interfaces
19
+ * - Implement that in {@link childrenInitOptions}
20
+ * - Update downstream construction to switch over whatever narrows the union
21
+ * - Bonus points: revise each concrete {@link DescendantNode} to use a common
22
+ * constructor API (i.e. a static `from` method, since several such classes
23
+ * already have private constructors). Then downstream isn't even a switch
24
+ * statement, it's just a lookup table.
25
+ *
26
+ * @todo As of this commit, and as now mentioned on {@link DescendantNode}, and
27
+ * as discussed in
28
+ * {@link https://github.com/getodk/web-forms/pull/352#discussion_r2008237762}:
29
+ * this interface is intended as an intermediate step toward these goals.
30
+ */
31
+ export interface DescendantNodeInitOptions {
32
+ readonly childNodeset: string;
33
+ readonly definition: ChildNodeDefinition;
34
+ readonly instanceNodes: readonly StaticElement[];
35
+ }
@@ -1,34 +1,35 @@
1
1
  import { UnreachableError } from '@getodk/common/lib/error/UnreachableError.ts';
2
- import type { GroupDefinition } from '../client/GroupNode.ts';
3
- import type { InputDefinition } from '../client/InputNode.ts';
4
- import type { ModelValueDefinition } from '../client/ModelValueNode.ts';
5
- import type { SelectDefinition } from '../client/SelectNode.ts';
6
- import type { SubtreeDefinition } from '../client/SubtreeNode.ts';
7
- import type { TriggerNodeDefinition } from '../client/TriggerNode.ts';
8
- import type { RankDefinition } from '../client/RankNode.ts';
9
- import type { UploadNodeDefinition } from '../client/unsupported/UploadNode.ts';
10
- import { ErrorProductionDesignPendingError } from '../error/ErrorProductionDesignPendingError.ts';
11
- import type { LeafNodeDefinition } from '../parse/model/LeafNodeDefinition.ts';
12
- import { NoteNodeDefinition } from '../parse/model/NoteNodeDefinition.ts';
2
+ import type { GroupDefinition } from '../../client/GroupNode.ts';
3
+ import type { InputDefinition } from '../../client/InputNode.ts';
4
+ import type { ModelValueDefinition } from '../../client/ModelValueNode.ts';
5
+ import type { RankDefinition } from '../../client/RankNode.ts';
6
+ import type { SelectDefinition } from '../../client/SelectNode.ts';
7
+ import type { SubtreeDefinition } from '../../client/SubtreeNode.ts';
8
+ import type { TriggerNodeDefinition } from '../../client/TriggerNode.ts';
9
+ import type { UploadNodeDefinition } from '../../client/unsupported/UploadNode.ts';
10
+ import { ErrorProductionDesignPendingError } from '../../error/ErrorProductionDesignPendingError.ts';
11
+ import type { LeafNodeDefinition } from '../../parse/model/LeafNodeDefinition.ts';
12
+ import { NoteNodeDefinition } from '../../parse/model/NoteNodeDefinition.ts';
13
13
  import type {
14
14
  AnyRangeNodeDefinition,
15
15
  RangeLeafNodeDefinition,
16
- } from '../parse/model/RangeNodeDefinition.ts';
17
- import { RangeNodeDefinition } from '../parse/model/RangeNodeDefinition.ts';
18
- import type { SubtreeDefinition as ModelSubtreeDefinition } from '../parse/model/SubtreeDefinition.ts';
19
- import { Group } from './Group.ts';
20
- import type { GeneralChildNode, GeneralParentNode } from './hierarchy.ts';
21
- import { InputControl } from './InputControl.ts';
22
- import { ModelValue } from './ModelValue.ts';
23
- import { Note } from './Note.ts';
24
- import { RangeControl } from './RangeControl.ts';
25
- import { RepeatRangeControlled } from './repeat/RepeatRangeControlled.ts';
26
- import { RepeatRangeUncontrolled } from './repeat/RepeatRangeUncontrolled.ts';
27
- import { SelectControl } from './SelectControl.ts';
28
- import { Subtree } from './Subtree.ts';
29
- import { TriggerControl } from './TriggerControl.ts';
30
- import { RankControl } from './RankControl.ts';
31
- import { UploadControl } from './unsupported/UploadControl.ts';
16
+ } from '../../parse/model/RangeNodeDefinition.ts';
17
+ import { RangeNodeDefinition } from '../../parse/model/RangeNodeDefinition.ts';
18
+ import type { SubtreeDefinition as ModelSubtreeDefinition } from '../../parse/model/SubtreeDefinition.ts';
19
+ import { Group } from '../Group.ts';
20
+ import type { GeneralChildNode, GeneralParentNode } from '../hierarchy.ts';
21
+ import { InputControl } from '../InputControl.ts';
22
+ import { ModelValue } from '../ModelValue.ts';
23
+ import { Note } from '../Note.ts';
24
+ import { RangeControl } from '../RangeControl.ts';
25
+ import { RankControl } from '../RankControl.ts';
26
+ import { RepeatRangeControlled } from '../repeat/RepeatRangeControlled.ts';
27
+ import { RepeatRangeUncontrolled } from '../repeat/RepeatRangeUncontrolled.ts';
28
+ import { SelectControl } from '../SelectControl.ts';
29
+ import { Subtree } from '../Subtree.ts';
30
+ import { TriggerControl } from '../TriggerControl.ts';
31
+ import { UploadControl } from '../unsupported/UploadControl.ts';
32
+ import { childrenInitOptions } from './childrenInitOptions.ts';
32
33
 
33
34
  const isSubtreeDefinition = (
34
35
  definition: ModelSubtreeDefinition
@@ -127,72 +128,78 @@ const isUploadNodeDefinition = (
127
128
  };
128
129
 
129
130
  export const buildChildren = (parent: GeneralParentNode): GeneralChildNode[] => {
130
- const { children } = parent.definition;
131
+ const { children } = childrenInitOptions(parent);
131
132
 
132
- return children.map((child): GeneralChildNode => {
133
- switch (child.type) {
133
+ return children.map(({ instanceNodes, definition }): GeneralChildNode => {
134
+ const [instanceNode = null] = instanceNodes;
135
+
136
+ switch (definition.type) {
134
137
  case 'subtree': {
135
- if (isSubtreeDefinition(child)) {
136
- return new Subtree(parent, child);
138
+ if (isSubtreeDefinition(definition)) {
139
+ return new Subtree(parent, instanceNode, definition);
137
140
  }
138
141
 
139
142
  // TODO: it'd be good to be able to do without this type assertion. The
140
143
  // only distinction between the types is whether `bodyElement` is
141
144
  // `null`, but for some reason that's insufficient to narrow the union.
142
- return new Group(parent, child as GroupDefinition);
145
+ return new Group(parent, instanceNode, definition as GroupDefinition);
143
146
  }
144
147
 
145
- case 'repeat-range': {
146
- if (child.isControlled()) {
147
- return new RepeatRangeControlled(parent, child);
148
+ case 'repeat': {
149
+ if (definition.isControlled()) {
150
+ return new RepeatRangeControlled(parent, instanceNodes, definition);
148
151
  }
149
152
 
150
- return new RepeatRangeUncontrolled(parent, child);
153
+ return new RepeatRangeUncontrolled(parent, instanceNodes, definition);
151
154
  }
152
155
 
153
156
  case 'leaf-node': {
154
- if (child instanceof NoteNodeDefinition) {
155
- return new Note(parent, child);
157
+ if (instanceNode != null && !instanceNode.isLeafElement()) {
158
+ throw new ErrorProductionDesignPendingError();
159
+ }
160
+
161
+ if (definition instanceof NoteNodeDefinition) {
162
+ return new Note(parent, instanceNode, definition);
156
163
  }
157
164
 
158
165
  // More specific type helps with narrowing below
159
- const leafChild: AnyLeafNodeDefinition = child;
166
+ const leafChild: AnyLeafNodeDefinition = definition;
160
167
 
161
168
  if (isModelValueDefinition(leafChild)) {
162
- return ModelValue.from(parent, leafChild);
169
+ return ModelValue.from(parent, instanceNode, leafChild);
163
170
  }
164
171
 
165
172
  if (isInputDefinition(leafChild)) {
166
- return InputControl.from(parent, leafChild);
173
+ return InputControl.from(parent, instanceNode, leafChild);
167
174
  }
168
175
 
169
176
  if (isSelectDefinition(leafChild)) {
170
- return SelectControl.from(parent, leafChild);
177
+ return SelectControl.from(parent, instanceNode, leafChild);
171
178
  }
172
179
 
173
180
  if (isRankDefinition(leafChild)) {
174
- return RankControl.from(parent, leafChild);
181
+ return RankControl.from(parent, instanceNode, leafChild);
175
182
  }
176
183
 
177
184
  if (isTriggerNodeDefinition(leafChild)) {
178
- return TriggerControl.from(parent, leafChild);
185
+ return TriggerControl.from(parent, instanceNode, leafChild);
179
186
  }
180
187
 
181
188
  if (isRangeLeafNodeDefinition(leafChild)) {
182
189
  assertRangeNodeDefinition(leafChild);
183
190
 
184
- return RangeControl.from(parent, leafChild);
191
+ return RangeControl.from(parent, instanceNode, leafChild);
185
192
  }
186
193
 
187
194
  if (isUploadNodeDefinition(leafChild)) {
188
- return new UploadControl(parent, leafChild);
195
+ return new UploadControl(parent, instanceNode, leafChild);
189
196
  }
190
197
 
191
198
  throw new UnreachableError(leafChild);
192
199
  }
193
200
 
194
201
  default: {
195
- throw new UnreachableError(child);
202
+ throw new UnreachableError(definition);
196
203
  }
197
204
  }
198
205
  });