@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
@@ -1,172 +0,0 @@
1
- import { UnreachableError } from '@getodk/common/lib/error/UnreachableError.ts';
2
- import {
3
- SUBMISSION_INSTANCE_FILE_NAME,
4
- SUBMISSION_INSTANCE_FILE_TYPE,
5
- } from '../../../client/constants.ts';
6
- import type { SubmissionData } from '../../../client/submission/SubmissionData.ts';
7
- import type { SubmissionDefinition } from '../../../client/submission/SubmissionDefinition.ts';
8
- import type { SubmissionInstanceFile } from '../../../client/submission/SubmissionInstanceFile.ts';
9
- import type { SubmissionChunkedType } from '../../../client/submission/SubmissionOptions.ts';
10
- import type { SubmissionResult } from '../../../client/submission/SubmissionResult.ts';
11
- import type { DescendantNodeViolationReference } from '../../../client/validation.ts';
12
- import type { ClientReactiveSubmittableInstance } from '../../../instance/internal-api/submission/ClientReactiveSubmittableInstance.ts';
13
-
14
- class InstanceFile extends File implements SubmissionInstanceFile {
15
- override readonly name = SUBMISSION_INSTANCE_FILE_NAME;
16
- override readonly type = SUBMISSION_INSTANCE_FILE_TYPE;
17
-
18
- constructor(instanceRoot: ClientReactiveSubmittableInstance) {
19
- const { submissionXML } = instanceRoot.submissionState;
20
-
21
- super([submissionXML], SUBMISSION_INSTANCE_FILE_NAME, {
22
- type: SUBMISSION_INSTANCE_FILE_TYPE,
23
- });
24
- }
25
- }
26
-
27
- type AssertSubmissionData = (data: FormData) => asserts data is SubmissionData;
28
-
29
- const assertSubmissionData: AssertSubmissionData = (data) => {
30
- const instanceFile = data.get(SUBMISSION_INSTANCE_FILE_NAME);
31
-
32
- if (!(instanceFile instanceof InstanceFile)) {
33
- throw new Error(`Invalid SubmissionData`);
34
- }
35
- };
36
-
37
- class InstanceSubmissionData extends FormData {
38
- static from(instanceFile: InstanceFile, attachments: readonly File[]): SubmissionData {
39
- const data = new this(instanceFile, attachments);
40
-
41
- assertSubmissionData(data);
42
-
43
- return data;
44
- }
45
-
46
- private constructor(
47
- readonly instanceFile: InstanceFile,
48
- readonly attachments: readonly File[]
49
- ) {
50
- super();
51
-
52
- this.set(SUBMISSION_INSTANCE_FILE_NAME, instanceFile);
53
-
54
- attachments.forEach((attachment) => {
55
- const { name } = attachment;
56
-
57
- if (name === SUBMISSION_INSTANCE_FILE_NAME && attachment !== instanceFile) {
58
- throw new Error(
59
- `Failed to add conflicting attachment with name ${SUBMISSION_INSTANCE_FILE_NAME}`
60
- );
61
- }
62
-
63
- this.set(name, attachment);
64
- });
65
- }
66
- }
67
-
68
- interface PendingValidation {
69
- readonly status: 'pending';
70
- readonly violations: readonly DescendantNodeViolationReference[];
71
- }
72
-
73
- interface ReadyValidation {
74
- readonly status: 'ready';
75
- readonly violations: null;
76
- }
77
-
78
- type SubmissionInstanceStateValidation = PendingValidation | ReadyValidation;
79
-
80
- const validateSubmission = (
81
- instanceRoot: ClientReactiveSubmittableInstance
82
- ): SubmissionInstanceStateValidation => {
83
- const { violations } = instanceRoot.validationState;
84
-
85
- if (violations.length === 0) {
86
- return {
87
- status: 'ready',
88
- violations: null,
89
- };
90
- }
91
-
92
- return {
93
- status: 'pending',
94
- violations,
95
- };
96
- };
97
-
98
- const monolithicSubmissionResult = (
99
- validation: SubmissionInstanceStateValidation,
100
- definition: SubmissionDefinition,
101
- instanceFile: InstanceFile,
102
- attachments: readonly File[]
103
- ): SubmissionResult<'monolithic'> => {
104
- const data = InstanceSubmissionData.from(instanceFile, attachments);
105
-
106
- return {
107
- ...validation,
108
- definition,
109
- data,
110
- };
111
- };
112
-
113
- interface ChunkedSubmissionResultOptions {
114
- readonly maxSize: number;
115
- }
116
-
117
- const chunkedSubmissionResult = (
118
- validation: SubmissionInstanceStateValidation,
119
- definition: SubmissionDefinition,
120
- instanceFile: InstanceFile,
121
- attachments: readonly File[],
122
- options: ChunkedSubmissionResultOptions
123
- ): SubmissionResult<'chunked'> => {
124
- if (attachments.length > 0 || options.maxSize !== Infinity) {
125
- throw new Error('Submission chunking pending implementation');
126
- }
127
-
128
- const data = InstanceSubmissionData.from(instanceFile, attachments);
129
-
130
- return {
131
- ...validation,
132
- definition,
133
- data: [data],
134
- };
135
- };
136
-
137
- export interface PrepeareSubmissionOptions<ChunkedType extends SubmissionChunkedType> {
138
- readonly chunked: ChunkedType;
139
- readonly maxSize: number;
140
- }
141
-
142
- export const prepareSubmission = <ChunkedType extends SubmissionChunkedType>(
143
- instanceRoot: ClientReactiveSubmittableInstance,
144
- options: PrepeareSubmissionOptions<ChunkedType>
145
- ): SubmissionResult<ChunkedType> => {
146
- const validation = validateSubmission(instanceRoot);
147
- const definition = instanceRoot.definition.submission;
148
- const instanceFile = new InstanceFile(instanceRoot);
149
- const attachments: readonly File[] = [];
150
-
151
- switch (options.chunked) {
152
- case 'chunked':
153
- return chunkedSubmissionResult(
154
- validation,
155
- definition,
156
- instanceFile,
157
- attachments,
158
- options
159
- ) satisfies SubmissionResult<'chunked'> as SubmissionResult<ChunkedType>;
160
-
161
- case 'monolithic':
162
- return monolithicSubmissionResult(
163
- validation,
164
- definition,
165
- instanceFile,
166
- attachments
167
- ) satisfies SubmissionResult<'monolithic'> as SubmissionResult<ChunkedType>;
168
-
169
- default:
170
- throw new UnreachableError(options.chunked);
171
- }
172
- };
@@ -1,200 +0,0 @@
1
- import { createComputed, createMemo, createSignal, untrack, type Signal } from 'solid-js';
2
- import { ErrorProductionDesignPendingError } from '../../error/ErrorProductionDesignPendingError.ts';
3
- import type { ValueContext } from '../../instance/internal-api/ValueContext.ts';
4
- import type { BindComputationExpression } from '../../parse/expression/BindComputationExpression.ts';
5
- import { createComputedExpression } from './createComputedExpression.ts';
6
- import type { SimpleAtomicState, SimpleAtomicStateSetter } from './types.ts';
7
-
8
- type InitialValueSource = 'FORM_DEFAULT' | 'PRIMARY_INSTANCE';
9
-
10
- export interface ValueStateOptions {
11
- /**
12
- * Specifies the source of a {@link createValueState} signal's initial
13
- * value state, where:
14
- *
15
- * - 'FORM_DEFAULT': Derives the initial state from the form's
16
- * definition of the node itself. This is the default option, appropriate
17
- * when initializing a form without additional primary instance data. In
18
- * other words, this value should not be used for edits.
19
- *
20
- * - 'PRIMARY_INSTANCE': Derives the initial state from the current text
21
- * content of the {@link ValueNode.contextNode}. This option
22
- * should be specified when initializing a form with existing primary
23
- * instance data, such as when editing a previous submission.
24
- *
25
- * @default 'FORM_DEFAULT'
26
- *
27
- * Specifies whether a {@link createV} signal's initial state
28
- * should be derived from the current text content of the
29
- * {@link ValueNode.contextNode | primary instance DOM state}.
30
- */
31
- readonly initialValueSource?: InitialValueSource;
32
- }
33
-
34
- const getInitialValue = <RuntimeValue>(
35
- context: ValueContext<RuntimeValue>,
36
- options: ValueStateOptions
37
- ): string => {
38
- const { initialValueSource = 'FORM_DEFAULT' } = options;
39
-
40
- if (initialValueSource === 'FORM_DEFAULT') {
41
- return context.definition.defaultValue;
42
- }
43
-
44
- throw new ErrorProductionDesignPendingError('Edit implementation pending');
45
- };
46
-
47
- type BaseValueState = Signal<string>;
48
-
49
- type RelevantValueState = SimpleAtomicState<string>;
50
-
51
- /**
52
- * Wraps {@link baseValueState} in a signal-like interface which:
53
- *
54
- * - produces a blank value for nodes ({@link context}) in a non-relevant state
55
- * - persists, and restores, the most recent non-blank value state when a
56
- * node/context's relevance is restored
57
- */
58
- const createRelevantValueState = <RuntimeValue>(
59
- context: ValueContext<RuntimeValue>,
60
- baseValueState: BaseValueState
61
- ): RelevantValueState => {
62
- return context.scope.runTask(() => {
63
- const [getRelevantValue, setValue] = baseValueState;
64
-
65
- const getValue = createMemo(() => {
66
- if (context.isRelevant()) {
67
- return getRelevantValue();
68
- }
69
-
70
- return '';
71
- });
72
-
73
- return [getValue, setValue];
74
- });
75
- };
76
-
77
- type RuntimeValueState<RuntimeValue> = SimpleAtomicState<RuntimeValue>;
78
-
79
- /**
80
- * Wraps {@link relevantValueState} in a signal-like interface which
81
- * automatically encodes and decodes a node's runtime value representation:
82
- *
83
- * - Values read by a node will be read from the current state as persisted in
84
- * the primary instance, then {@link ValueContext.decodeValue | decoded} (as
85
- * implemented by that node) into a format suitable for the rest of the
86
- * functionality provided by that node.
87
- *
88
- * - Values written by a node will be {@link ValueContext.encodeValue | encoded}
89
- * (also as implemented by that node) into a string value appropriate for
90
- * serialization in an instance submission.
91
- */
92
- const createRuntimeValueState = <RuntimeValue>(
93
- context: ValueContext<RuntimeValue>,
94
- relevantValueState: RelevantValueState
95
- ): RuntimeValueState<RuntimeValue> => {
96
- const { decodeValue, encodeValue } = context;
97
-
98
- return context.scope.runTask(() => {
99
- const [primaryInstanceValue, setPrimaryInstanceValue] = relevantValueState;
100
- const getRuntimeValue = createMemo(() => {
101
- return decodeValue(primaryInstanceValue());
102
- });
103
- const setRuntimeValue: SimpleAtomicStateSetter<RuntimeValue> = (value) => {
104
- const encodedValue = encodeValue(value);
105
-
106
- return decodeValue(setPrimaryInstanceValue(encodedValue));
107
- };
108
-
109
- return [getRuntimeValue, setRuntimeValue];
110
- });
111
- };
112
-
113
- /**
114
- * For fields with a `readonly` bind expression, prevent downstream
115
- * (client/user) writes when the field is in a `readonly` state.
116
- */
117
- const guardDownstreamReadonlyWrites = <RuntimeValue>(
118
- context: ValueContext<RuntimeValue>,
119
- baseState: SimpleAtomicState<RuntimeValue>
120
- ): SimpleAtomicState<RuntimeValue> => {
121
- const { readonly } = context.definition.bind;
122
-
123
- if (readonly.isDefaultExpression) {
124
- return baseState;
125
- }
126
-
127
- const [getValue, baseSetValue] = baseState;
128
-
129
- const setValue: SimpleAtomicStateSetter<RuntimeValue> = (value) => {
130
- if (context.isReadonly()) {
131
- const reference = untrack(() => context.contextReference());
132
-
133
- throw new Error(`Cannot write to readonly field: ${reference}`);
134
- }
135
-
136
- return baseSetValue(value);
137
- };
138
-
139
- return [getValue, setValue];
140
- };
141
-
142
- /**
143
- * Defines a reactive effect which writes the result of `calculate` bind
144
- * computations to the provided value setter, on initialization and any
145
- * subsequent reactive update.
146
- */
147
- const createCalculation = <RuntimeValue>(
148
- context: ValueContext<RuntimeValue>,
149
- setValue: SimpleAtomicStateSetter<RuntimeValue>,
150
- calculateDefinition: BindComputationExpression<'calculate'>
151
- ): void => {
152
- context.scope.runTask(() => {
153
- const calculate = createComputedExpression(context, calculateDefinition, {
154
- defaultValue: '',
155
- });
156
-
157
- createComputed(() => {
158
- if (context.isAttached() && context.isRelevant()) {
159
- const calculated = calculate();
160
- const value = context.decodeValue(calculated);
161
-
162
- setValue(value);
163
- }
164
- });
165
- });
166
- };
167
-
168
- type ValueState<RuntimeValue> = SimpleAtomicState<RuntimeValue>;
169
-
170
- /**
171
- * Provides a consistent interface for value nodes of any type which:
172
- *
173
- * - derives initial state from either an existing instance (e.g. for edits) or
174
- * the node's definition (e.g. initializing a new submission)
175
- * - decodes current primary instance state into the value node's runtime type
176
- * - encodes updated runtime values to store updated instance state
177
- * - initializes reactive computation of `calculate` bind expressions for those
178
- * nodes defined with one
179
- * - prevents downstream writes to nodes in a readonly state
180
- */
181
- export const createValueState = <RuntimeValue>(
182
- context: ValueContext<RuntimeValue>,
183
- options: ValueStateOptions = {}
184
- ): ValueState<RuntimeValue> => {
185
- return context.scope.runTask(() => {
186
- const initialValue = getInitialValue(context, options);
187
- const baseValueState = createSignal(initialValue);
188
- const valueState = createRelevantValueState(context, baseValueState);
189
- const runtimeState = createRuntimeValueState(context, valueState);
190
- const { calculate } = context.definition.bind;
191
-
192
- if (calculate != null) {
193
- const [, setValue] = runtimeState;
194
-
195
- createCalculation(context, setValue, calculate);
196
- }
197
-
198
- return guardDownstreamReadonlyWrites(context, runtimeState);
199
- });
200
- };
@@ -1,4 +0,0 @@
1
- import { StaticDocument } from '../../../integration/xpath/static-dom/StaticDocument.ts';
2
- import { ItextTranslationRootDefinition } from './ItextTranslationRootDefinition.ts';
3
-
4
- export class ItextTranslationDefinition extends StaticDocument<ItextTranslationRootDefinition> {}
@@ -1,42 +0,0 @@
1
- import type { XFormsItextTranslationElement } from '@getodk/xpath';
2
- import { XFORMS_KNOWN_ATTRIBUTE, XFORMS_LOCAL_NAME } from '@getodk/xpath';
3
- import { StaticElement } from '../../../integration/xpath/static-dom/StaticElement.ts';
4
- import type { ItextTranslationDefinition } from './ItextTranslationDefinition.ts';
5
-
6
- // prettier-ignore
7
- type ItextTranslationRootKnownAttributeValue<LocalName extends string> =
8
- LocalName extends 'lang'
9
- ? string
10
- : string | null;
11
-
12
- type AssertItextTranslationRootKnownAttributeValue = <LocalName extends string>(
13
- localName: LocalName,
14
- value: string | null
15
- ) => asserts value is ItextTranslationRootKnownAttributeValue<LocalName>;
16
-
17
- const assertItextTranslationRootKnownAttributeValue: AssertItextTranslationRootKnownAttributeValue =
18
- (localName, value) => {
19
- if (localName === 'lang' && value == null) {
20
- throw new Error('Invalid itext <translation> element: missing `lang` attribute');
21
- }
22
- };
23
-
24
- export class ItextTranslationRootDefinition
25
- extends StaticElement<ItextTranslationDefinition>
26
- implements XFormsItextTranslationElement<ItextTranslationRootDefinition>
27
- {
28
- override readonly [XFORMS_LOCAL_NAME] = 'translation';
29
- override readonly [XFORMS_KNOWN_ATTRIBUTE] = 'lang';
30
-
31
- override getAttributeValue(localName: 'lang'): string;
32
- override getAttributeValue(localName: string): string | null;
33
- override getAttributeValue<LocalName extends string>(
34
- localName: LocalName
35
- ): ItextTranslationRootKnownAttributeValue<LocalName> {
36
- const value = super.getAttributeValue(localName);
37
-
38
- assertItextTranslationRootKnownAttributeValue(localName, value);
39
-
40
- return value;
41
- }
42
- }
@@ -1,31 +0,0 @@
1
- import type { XFormsItextTranslationMap } from '@getodk/xpath';
2
- import type { EngineXPathNode } from '../../../integration/xpath/adapter/kind.ts';
3
- import { parseStaticDocumentFromDOMSubtree } from '../../shared/parseStaticDocumentFromDOMSubtree.ts';
4
- import type { XFormDOM } from '../../XFormDOM.ts';
5
- import { ItextTranslationDefinition } from './ItextTranslationDefinition.ts';
6
- import { ItextTranslationRootDefinition } from './ItextTranslationRootDefinition.ts';
7
-
8
- export class ItextTranslationsDefinition
9
- extends Map<string, ItextTranslationRootDefinition>
10
- implements XFormsItextTranslationMap<EngineXPathNode>
11
- {
12
- static from(xformDOM: XFormDOM): ItextTranslationsDefinition {
13
- const translationDefinitions = xformDOM.itextTranslationElements.map((element) => {
14
- return parseStaticDocumentFromDOMSubtree(
15
- ItextTranslationDefinition,
16
- ItextTranslationRootDefinition,
17
- element
18
- );
19
- });
20
-
21
- return new this(translationDefinitions);
22
- }
23
-
24
- private constructor(translations: readonly ItextTranslationDefinition[]) {
25
- super(
26
- translations.map(({ root }) => {
27
- return [root.getAttributeValue('lang'), root];
28
- })
29
- );
30
- }
31
- }
@@ -1,38 +0,0 @@
1
- import { NamespaceDeclarationMap } from '../../lib/names/NamespaceDeclarationMap.ts';
2
- import { QualifiedName } from '../../lib/names/QualifiedName.ts';
3
- import { RepeatElementDefinition } from '../body/RepeatElementDefinition.ts';
4
- import { DescendentNodeDefinition } from './DescendentNodeDefinition.ts';
5
- import type { ChildNodeDefinition } from './NodeDefinition.ts';
6
- import type { AnyRepeatRangeDefinition } from './RepeatRangeDefinition.ts';
7
-
8
- export class RepeatInstanceDefinition extends DescendentNodeDefinition<
9
- 'repeat-instance',
10
- RepeatElementDefinition
11
- > {
12
- readonly type = 'repeat-instance';
13
-
14
- readonly namespaceDeclarations: NamespaceDeclarationMap;
15
- readonly qualifiedName: QualifiedName;
16
- readonly children: readonly ChildNodeDefinition[];
17
- readonly instances = null;
18
- readonly defaultValue = null;
19
-
20
- constructor(
21
- range: AnyRepeatRangeDefinition,
22
- readonly node: Element
23
- ) {
24
- const { bind, bodyElement, parent, root } = range;
25
-
26
- super(parent, bind, bodyElement);
27
-
28
- this.qualifiedName = new QualifiedName(node);
29
- this.namespaceDeclarations = new NamespaceDeclarationMap(this);
30
- this.children = root.buildSubtree(this);
31
- }
32
-
33
- toJSON() {
34
- const { bind, bodyElement, parent, root, ...rest } = this;
35
-
36
- return rest;
37
- }
38
- }
@@ -1,98 +0,0 @@
1
- import { NamespaceDeclarationMap } from '../../lib/names/NamespaceDeclarationMap.ts';
2
- import { QualifiedName } from '../../lib/names/QualifiedName.ts';
3
- import type { RepeatElementDefinition } from '../body/RepeatElementDefinition.ts';
4
- import { RepeatCountControlExpression } from '../expression/RepeatCountControlExpression.ts';
5
- import type { BindDefinition } from './BindDefinition.ts';
6
- import { DescendentNodeDefinition } from './DescendentNodeDefinition.ts';
7
- import type { ParentNodeDefinition } from './NodeDefinition.ts';
8
- import { RepeatInstanceDefinition } from './RepeatInstanceDefinition.ts';
9
- import { RepeatTemplateDefinition } from './RepeatTemplateDefinition.ts';
10
-
11
- export interface ControlledRepeatRangeDefinition extends RepeatRangeDefinition {
12
- readonly count: RepeatCountControlExpression;
13
- }
14
-
15
- export interface UncontrolledRepeatRangeDefinition extends RepeatRangeDefinition {
16
- readonly count: null;
17
- }
18
-
19
- // prettier-ignore
20
- export type AnyRepeatRangeDefinition =
21
- | ControlledRepeatRangeDefinition
22
- | UncontrolledRepeatRangeDefinition;
23
-
24
- type AssertRepeatRangeDefinitionUnion = (
25
- definition: RepeatRangeDefinition
26
- ) => asserts definition is AnyRepeatRangeDefinition;
27
-
28
- const assertRepeatRangeDefinitionUnion: AssertRepeatRangeDefinitionUnion = (_definition) => {
29
- // Intentional no-op, used to guide the type checker. Implementation would
30
- // check _definition.count == null || _definition.count != null, which is
31
- // tautologically true!
32
- };
33
-
34
- export class RepeatRangeDefinition extends DescendentNodeDefinition<
35
- 'repeat-range',
36
- RepeatElementDefinition
37
- > {
38
- static from(
39
- parent: ParentNodeDefinition,
40
- bind: BindDefinition,
41
- bodyElement: RepeatElementDefinition,
42
- modelNodes: readonly [Element, ...Element[]]
43
- ): AnyRepeatRangeDefinition {
44
- const definition = new this(parent, bind, bodyElement, modelNodes);
45
-
46
- assertRepeatRangeDefinitionUnion(definition);
47
-
48
- return definition;
49
- }
50
-
51
- readonly type = 'repeat-range';
52
-
53
- readonly template: RepeatTemplateDefinition;
54
- readonly children = null;
55
- readonly instances: RepeatInstanceDefinition[];
56
- readonly count: RepeatCountControlExpression | null;
57
-
58
- readonly node = null;
59
- readonly namespaceDeclarations: NamespaceDeclarationMap;
60
- readonly qualifiedName: QualifiedName;
61
- readonly defaultValue = null;
62
-
63
- private constructor(
64
- parent: ParentNodeDefinition,
65
- bind: BindDefinition,
66
- bodyElement: RepeatElementDefinition,
67
- modelNodes: readonly [Element, ...Element[]]
68
- ) {
69
- super(parent, bind, bodyElement);
70
-
71
- const { template, instanceNodes } = RepeatTemplateDefinition.parseModelNodes(this, modelNodes);
72
-
73
- this.template = template;
74
- this.qualifiedName = template.qualifiedName;
75
- this.namespaceDeclarations = new NamespaceDeclarationMap(this);
76
- this.count = RepeatCountControlExpression.from(bodyElement, instanceNodes.length);
77
-
78
- assertRepeatRangeDefinitionUnion(this);
79
-
80
- this.instances = instanceNodes.map((element) => {
81
- return new RepeatInstanceDefinition(this, element);
82
- });
83
- }
84
-
85
- isControlled(): this is ControlledRepeatRangeDefinition {
86
- return this.count != null;
87
- }
88
-
89
- isUncontrolled(): this is UncontrolledRepeatRangeDefinition {
90
- return this.count == null;
91
- }
92
-
93
- toJSON() {
94
- const { bind, bodyElement: groupDefinition, parent, root, ...rest } = this;
95
-
96
- return rest;
97
- }
98
- }