@getodk/xforms-engine 0.4.0 → 0.5.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 (285) hide show
  1. package/dist/client/BaseNode.d.ts +14 -3
  2. package/dist/client/BaseValueNode.d.ts +32 -0
  3. package/dist/client/EngineConfig.d.ts +49 -48
  4. package/dist/client/InputNode.d.ts +53 -0
  5. package/dist/client/ModelValueNode.d.ts +12 -7
  6. package/dist/client/NoteNode.d.ts +2 -2
  7. package/dist/client/RootNode.d.ts +34 -7
  8. package/dist/client/SelectNode.d.ts +2 -2
  9. package/dist/client/ValueType.d.ts +3 -0
  10. package/dist/client/constants.d.ts +50 -0
  11. package/dist/client/hierarchy.d.ts +4 -4
  12. package/dist/client/identity.d.ts +14 -0
  13. package/dist/client/node-types.d.ts +2 -1
  14. package/dist/client/resources.d.ts +93 -0
  15. package/dist/client/submission/SubmissionData.d.ts +7 -0
  16. package/dist/client/submission/SubmissionDefinition.d.ts +14 -0
  17. package/dist/client/submission/SubmissionInstanceFile.d.ts +6 -0
  18. package/dist/client/submission/SubmissionOptions.d.ts +23 -0
  19. package/dist/client/submission/SubmissionResult.d.ts +91 -0
  20. package/dist/client/submission/SubmissionState.d.ts +12 -0
  21. package/dist/client/validation.d.ts +2 -2
  22. package/dist/error/ErrorProductionDesignPendingError.d.ts +7 -0
  23. package/dist/error/ValueTypeInvariantError.d.ts +17 -0
  24. package/dist/error/XPathFunctionalityError.d.ts +14 -0
  25. package/dist/error/XPathFunctionalityNotSupportedError.d.ts +7 -0
  26. package/dist/error/XPathFunctionalityPendingError.d.ts +7 -0
  27. package/dist/index.d.ts +10 -1
  28. package/dist/index.js +10856 -8585
  29. package/dist/index.js.map +1 -1
  30. package/dist/instance/Group.d.ts +9 -4
  31. package/dist/instance/InputControl.d.ts +36 -0
  32. package/dist/instance/ModelValue.d.ts +16 -26
  33. package/dist/instance/Note.d.ts +10 -3
  34. package/dist/instance/PrimaryInstance.d.ts +84 -0
  35. package/dist/instance/Root.d.ts +29 -25
  36. package/dist/instance/SelectField.d.ts +10 -2
  37. package/dist/instance/Subtree.d.ts +10 -5
  38. package/dist/instance/TriggerControl.d.ts +10 -3
  39. package/dist/instance/abstract/DescendantNode.d.ts +31 -23
  40. package/dist/instance/abstract/InstanceNode.d.ts +49 -29
  41. package/dist/instance/abstract/UnsupportedControl.d.ts +10 -3
  42. package/dist/instance/abstract/ValueNode.d.ts +48 -0
  43. package/dist/instance/hierarchy.d.ts +9 -8
  44. package/dist/instance/identity.d.ts +2 -7
  45. package/dist/instance/internal-api/EvaluationContext.d.ts +53 -12
  46. package/dist/instance/internal-api/InstanceConfig.d.ts +8 -2
  47. package/dist/instance/internal-api/InstanceValueContext.d.ts +20 -0
  48. package/dist/instance/internal-api/PrimaryInstanceDocument.d.ts +36 -0
  49. package/dist/instance/internal-api/TranslationContext.d.ts +3 -2
  50. package/dist/instance/internal-api/ValidationContext.d.ts +3 -4
  51. package/dist/instance/internal-api/ValueContext.d.ts +2 -1
  52. package/dist/instance/internal-api/submission/ClientReactiveSubmittableInstance.d.ts +14 -0
  53. package/dist/instance/internal-api/submission/ClientReactiveSubmittableLeafNode.d.ts +31 -0
  54. package/dist/instance/internal-api/submission/ClientReactiveSubmittableParentNode.d.ts +18 -0
  55. package/dist/instance/internal-api/submission/ClientReactiveSubmittableValueNode.d.ts +17 -0
  56. package/dist/instance/repeat/BaseRepeatRange.d.ts +39 -83
  57. package/dist/instance/repeat/RepeatInstance.d.ts +11 -29
  58. package/dist/instance/repeat/RepeatRangeControlled.d.ts +2 -2
  59. package/dist/instance/repeat/RepeatRangeUncontrolled.d.ts +2 -2
  60. package/dist/instance/resource.d.ts +1 -1
  61. package/dist/instance/text/TextRange.d.ts +1 -1
  62. package/dist/instance/unsupported/RangeControl.d.ts +3 -1
  63. package/dist/instance/unsupported/RankControl.d.ts +3 -1
  64. package/dist/instance/unsupported/UploadControl.d.ts +3 -1
  65. package/dist/integration/xpath/EngineXPathEvaluator.d.ts +14 -0
  66. package/dist/integration/xpath/adapter/XFormsXPathNode.d.ts +71 -0
  67. package/dist/integration/xpath/adapter/engineDOMAdapter.d.ts +5 -0
  68. package/dist/integration/xpath/adapter/kind.d.ts +32 -0
  69. package/dist/integration/xpath/adapter/names.d.ts +16 -0
  70. package/dist/integration/xpath/adapter/traversal.d.ts +25 -0
  71. package/dist/integration/xpath/adapter/values.d.ts +2 -0
  72. package/dist/integration/xpath/static-dom/StaticAttribute.d.ts +19 -0
  73. package/dist/integration/xpath/static-dom/StaticDocument.d.ts +16 -0
  74. package/dist/integration/xpath/static-dom/StaticElement.d.ts +40 -0
  75. package/dist/integration/xpath/static-dom/StaticNamedNode.d.ts +17 -0
  76. package/dist/integration/xpath/static-dom/StaticNode.d.ts +33 -0
  77. package/dist/integration/xpath/static-dom/StaticText.d.ts +16 -0
  78. package/dist/lib/client-reactivity/submission/createInstanceSubmissionState.d.ts +3 -0
  79. package/dist/lib/client-reactivity/submission/createLeafNodeSubmissionState.d.ts +3 -0
  80. package/dist/lib/client-reactivity/submission/createNodeRangeSubmissionState.d.ts +4 -0
  81. package/dist/lib/client-reactivity/submission/createParentNodeSubmissionState.d.ts +4 -0
  82. package/dist/lib/client-reactivity/submission/createValueNodeSubmissionState.d.ts +3 -0
  83. package/dist/lib/client-reactivity/submission/prepareSubmission.d.ts +8 -0
  84. package/dist/lib/codecs/DecimalValueCodec.d.ts +6 -0
  85. package/dist/lib/codecs/IntValueCodec.d.ts +6 -0
  86. package/dist/lib/codecs/StringValueCodec.d.ts +4 -0
  87. package/dist/lib/codecs/ValueCodec.d.ts +30 -0
  88. package/dist/lib/codecs/ValueTypePlaceholderCodec.d.ts +12 -0
  89. package/dist/lib/codecs/getSharedValueCodec.d.ts +47 -0
  90. package/dist/lib/dom/query.d.ts +3 -0
  91. package/dist/lib/reactivity/createChildrenState.d.ts +7 -5
  92. package/dist/lib/reactivity/createComputedExpression.d.ts +18 -5
  93. package/dist/lib/reactivity/createInstanceValueState.d.ts +40 -0
  94. package/dist/lib/reactivity/createNoteReadonlyThunk.d.ts +2 -2
  95. package/dist/lib/reactivity/createTranslationState.d.ts +19 -0
  96. package/dist/lib/reactivity/createValueState.d.ts +6 -10
  97. package/dist/lib/reactivity/materializeCurrentStateChildren.d.ts +4 -4
  98. package/dist/lib/xml-serialization.d.ts +41 -0
  99. package/dist/parse/XFormDOM.d.ts +18 -7
  100. package/dist/parse/XFormDefinition.d.ts +1 -2
  101. package/dist/parse/attachments/FormAttachmentResource.d.ts +27 -0
  102. package/dist/parse/body/BodyDefinition.d.ts +3 -3
  103. package/dist/parse/body/RepeatElementDefinition.d.ts +1 -1
  104. package/dist/parse/body/appearance/inputAppearanceParser.d.ts +1 -1
  105. package/dist/parse/body/control/{InputDefinition.d.ts → InputControlDefinition.d.ts} +1 -1
  106. package/dist/parse/body/control/select/ItemsetNodesetContext.d.ts +0 -2
  107. package/dist/parse/expression/abstract/DependencyContext.d.ts +0 -5
  108. package/dist/parse/expression/abstract/DependentExpression.d.ts +2 -3
  109. package/dist/parse/model/BindDefinition.d.ts +4 -5
  110. package/dist/parse/model/BindTypeDefinition.d.ts +20 -0
  111. package/dist/parse/model/DescendentNodeDefinition.d.ts +0 -1
  112. package/dist/parse/model/FormSubmissionDefinition.d.ts +8 -0
  113. package/dist/parse/model/ItextTranslation/ItextTranslationDefinition.d.ts +4 -0
  114. package/dist/parse/model/ItextTranslation/ItextTranslationRootDefinition.d.ts +8 -0
  115. package/dist/parse/model/ItextTranslation/ItextTranslationsDefinition.d.ts +8 -0
  116. package/dist/parse/model/LeafNodeDefinition.d.ts +3 -1
  117. package/dist/parse/model/ModelBindMap.d.ts +1 -1
  118. package/dist/parse/model/ModelDefinition.d.ts +2 -0
  119. package/dist/parse/model/NodeDefinition.d.ts +0 -1
  120. package/dist/parse/model/NoteNodeDefinition.d.ts +4 -4
  121. package/dist/parse/model/RootDefinition.d.ts +3 -2
  122. package/dist/parse/model/SecondaryInstance/SecondaryInstanceDefinition.d.ts +4 -0
  123. package/dist/parse/model/SecondaryInstance/SecondaryInstanceRootDefinition.d.ts +7 -0
  124. package/dist/parse/model/SecondaryInstance/SecondaryInstancesDefinition.d.ts +13 -0
  125. package/dist/parse/model/SecondaryInstance/sources/BlankSecondaryInstanceSource.d.ts +14 -0
  126. package/dist/parse/model/SecondaryInstance/sources/CSVExternalSecondaryInstance.d.ts +22 -0
  127. package/dist/parse/model/SecondaryInstance/sources/ExternalSecondaryInstanceResource.d.ts +23 -0
  128. package/dist/parse/model/SecondaryInstance/sources/ExternalSecondaryInstanceSource.d.ts +9 -0
  129. package/dist/parse/model/SecondaryInstance/sources/GeoJSONExternalSecondaryInstance.d.ts +5 -0
  130. package/dist/parse/model/SecondaryInstance/sources/InternalSecondaryInstanceSource.d.ts +7 -0
  131. package/dist/parse/model/SecondaryInstance/sources/SecondaryInstanceSource.d.ts +13 -0
  132. package/dist/parse/model/SecondaryInstance/sources/XMLExternalSecondaryInstanceSource.d.ts +12 -0
  133. package/dist/parse/shared/parseStaticDocumentFromDOMSubtree.d.ts +24 -0
  134. package/dist/parse/text/abstract/TextRangeDefinition.d.ts +0 -2
  135. package/dist/parse/xpath/semantic-analysis.d.ts +5 -0
  136. package/dist/solid.js +8174 -5921
  137. package/dist/solid.js.map +1 -1
  138. package/package.json +13 -11
  139. package/src/client/BaseNode.ts +16 -6
  140. package/src/client/BaseValueNode.ts +35 -0
  141. package/src/client/EngineConfig.ts +52 -51
  142. package/src/client/InputNode.ts +77 -0
  143. package/src/client/ModelValueNode.ts +30 -7
  144. package/src/client/NoteNode.ts +2 -2
  145. package/src/client/RootNode.ts +37 -7
  146. package/src/client/SelectNode.ts +3 -3
  147. package/src/client/ValueType.ts +4 -0
  148. package/src/client/constants.ts +67 -0
  149. package/src/client/hierarchy.ts +5 -5
  150. package/src/client/identity.ts +16 -0
  151. package/src/client/node-types.ts +12 -6
  152. package/src/client/resources.ts +118 -0
  153. package/src/client/submission/SubmissionData.ts +12 -0
  154. package/src/client/submission/SubmissionDefinition.ts +16 -0
  155. package/src/client/submission/SubmissionInstanceFile.ts +9 -0
  156. package/src/client/submission/SubmissionOptions.ts +28 -0
  157. package/src/client/submission/SubmissionResult.ts +124 -0
  158. package/src/client/submission/SubmissionState.ts +14 -0
  159. package/src/client/validation.ts +2 -2
  160. package/src/error/ErrorProductionDesignPendingError.ts +6 -0
  161. package/src/error/ValueTypeInvariantError.ts +22 -0
  162. package/src/error/XPathFunctionalityError.ts +26 -0
  163. package/src/error/XPathFunctionalityNotSupportedError.ts +18 -0
  164. package/src/error/XPathFunctionalityPendingError.ts +18 -0
  165. package/src/index.ts +10 -1
  166. package/src/instance/Group.ts +17 -5
  167. package/src/instance/InputControl.ts +119 -0
  168. package/src/instance/ModelValue.ts +47 -54
  169. package/src/instance/Note.ts +24 -8
  170. package/src/instance/PrimaryInstance.ts +244 -0
  171. package/src/instance/Root.ts +62 -134
  172. package/src/instance/SelectField.ts +56 -19
  173. package/src/instance/Subtree.ts +19 -7
  174. package/src/instance/TriggerControl.ts +23 -6
  175. package/src/instance/abstract/DescendantNode.ts +90 -45
  176. package/src/instance/abstract/InstanceNode.ts +103 -105
  177. package/src/instance/abstract/UnsupportedControl.ts +28 -5
  178. package/src/instance/abstract/ValueNode.ts +127 -0
  179. package/src/instance/children.ts +9 -10
  180. package/src/instance/hierarchy.ts +19 -15
  181. package/src/instance/identity.ts +3 -9
  182. package/src/instance/index.ts +25 -7
  183. package/src/instance/internal-api/EvaluationContext.ts +60 -13
  184. package/src/instance/internal-api/InstanceConfig.ts +9 -2
  185. package/src/instance/internal-api/InstanceValueContext.ts +24 -0
  186. package/src/instance/internal-api/PrimaryInstanceDocument.ts +53 -0
  187. package/src/instance/internal-api/TranslationContext.ts +3 -2
  188. package/src/instance/internal-api/ValidationContext.ts +3 -4
  189. package/src/instance/internal-api/ValueContext.ts +2 -1
  190. package/src/instance/internal-api/submission/ClientReactiveSubmittableInstance.ts +20 -0
  191. package/src/instance/internal-api/submission/ClientReactiveSubmittableLeafNode.ts +42 -0
  192. package/src/instance/internal-api/submission/ClientReactiveSubmittableParentNode.ts +25 -0
  193. package/src/instance/internal-api/submission/ClientReactiveSubmittableValueNode.ts +23 -0
  194. package/src/instance/repeat/BaseRepeatRange.ts +50 -131
  195. package/src/instance/repeat/RepeatInstance.ts +20 -46
  196. package/src/instance/repeat/RepeatRangeControlled.ts +5 -5
  197. package/src/instance/repeat/RepeatRangeUncontrolled.ts +2 -4
  198. package/src/instance/resource.ts +1 -1
  199. package/src/instance/text/TextChunk.ts +1 -1
  200. package/src/instance/unsupported/RangeControl.ts +5 -1
  201. package/src/instance/unsupported/RankControl.ts +5 -1
  202. package/src/instance/unsupported/UploadControl.ts +5 -1
  203. package/src/integration/xpath/EngineXPathEvaluator.ts +22 -0
  204. package/src/integration/xpath/adapter/XFormsXPathNode.ts +126 -0
  205. package/src/integration/xpath/adapter/engineDOMAdapter.ts +57 -0
  206. package/src/integration/xpath/adapter/kind.ts +114 -0
  207. package/src/integration/xpath/adapter/names.ts +99 -0
  208. package/src/integration/xpath/adapter/traversal.ts +228 -0
  209. package/src/integration/xpath/adapter/values.ts +5 -0
  210. package/src/integration/xpath/static-dom/StaticAttribute.ts +33 -0
  211. package/src/integration/xpath/static-dom/StaticDocument.ts +38 -0
  212. package/src/integration/xpath/static-dom/StaticElement.ts +106 -0
  213. package/src/integration/xpath/static-dom/StaticNamedNode.ts +45 -0
  214. package/src/integration/xpath/static-dom/StaticNode.ts +68 -0
  215. package/src/integration/xpath/static-dom/StaticText.ts +28 -0
  216. package/src/lib/client-reactivity/README.md +0 -0
  217. package/src/lib/client-reactivity/submission/createInstanceSubmissionState.ts +12 -0
  218. package/src/lib/client-reactivity/submission/createLeafNodeSubmissionState.ts +20 -0
  219. package/src/lib/client-reactivity/submission/createNodeRangeSubmissionState.ts +17 -0
  220. package/src/lib/client-reactivity/submission/createParentNodeSubmissionState.ts +22 -0
  221. package/src/lib/client-reactivity/submission/createValueNodeSubmissionState.ts +21 -0
  222. package/src/lib/client-reactivity/submission/prepareSubmission.ts +172 -0
  223. package/src/lib/codecs/DecimalValueCodec.ts +46 -0
  224. package/src/lib/codecs/IntValueCodec.ts +100 -0
  225. package/src/lib/codecs/StringValueCodec.ts +11 -0
  226. package/src/lib/codecs/ValueCodec.ts +106 -0
  227. package/src/lib/codecs/ValueTypePlaceholderCodec.ts +19 -0
  228. package/src/lib/codecs/getSharedValueCodec.ts +77 -0
  229. package/src/lib/dom/query.ts +7 -0
  230. package/src/lib/reactivity/createChildrenState.ts +8 -6
  231. package/src/lib/reactivity/createComputedExpression.ts +57 -34
  232. package/src/lib/reactivity/createInstanceValueState.ts +166 -0
  233. package/src/lib/reactivity/createNoteReadonlyThunk.ts +12 -7
  234. package/src/lib/reactivity/createSelectItems.ts +21 -21
  235. package/src/lib/reactivity/createTranslationState.ts +61 -0
  236. package/src/lib/reactivity/createValueState.ts +62 -120
  237. package/src/lib/reactivity/materializeCurrentStateChildren.ts +7 -7
  238. package/src/lib/reactivity/text/createTextRange.ts +4 -3
  239. package/src/lib/reactivity/validation/createAggregatedViolations.ts +1 -1
  240. package/src/lib/reactivity/validation/createValidation.ts +2 -3
  241. package/src/lib/xml-serialization.ts +96 -0
  242. package/src/parse/XFormDOM.ts +110 -75
  243. package/src/parse/XFormDefinition.ts +1 -6
  244. package/src/parse/attachments/FormAttachmentResource.ts +40 -0
  245. package/src/parse/body/BodyDefinition.ts +3 -3
  246. package/src/parse/body/appearance/inputAppearanceParser.ts +1 -1
  247. package/src/parse/body/control/{InputDefinition.ts → InputControlDefinition.ts} +3 -5
  248. package/src/parse/body/control/select/ItemsetNodesetContext.ts +0 -5
  249. package/src/parse/expression/abstract/DependencyContext.ts +0 -26
  250. package/src/parse/expression/abstract/DependentExpression.ts +2 -13
  251. package/src/parse/model/BindDefinition.ts +5 -8
  252. package/src/parse/model/BindTypeDefinition.ts +175 -0
  253. package/src/parse/model/DescendentNodeDefinition.ts +0 -6
  254. package/src/parse/model/FormSubmissionDefinition.ts +44 -0
  255. package/src/parse/model/ItextTranslation/ItextTranslationDefinition.ts +4 -0
  256. package/src/parse/model/ItextTranslation/ItextTranslationRootDefinition.ts +41 -0
  257. package/src/parse/model/ItextTranslation/ItextTranslationsDefinition.ts +31 -0
  258. package/src/parse/model/LeafNodeDefinition.ts +4 -1
  259. package/src/parse/model/ModelBindMap.ts +6 -8
  260. package/src/parse/model/ModelDefinition.ts +6 -1
  261. package/src/parse/model/NodeDefinition.ts +0 -3
  262. package/src/parse/model/NoteNodeDefinition.ts +3 -3
  263. package/src/parse/model/RootDefinition.ts +2 -1
  264. package/src/parse/model/SecondaryInstance/SecondaryInstanceDefinition.ts +4 -0
  265. package/src/parse/model/SecondaryInstance/SecondaryInstanceRootDefinition.ts +12 -0
  266. package/src/parse/model/SecondaryInstance/SecondaryInstancesDefinition.ts +102 -0
  267. package/src/parse/model/SecondaryInstance/sources/BlankSecondaryInstanceSource.ts +40 -0
  268. package/src/parse/model/SecondaryInstance/sources/CSVExternalSecondaryInstance.ts +288 -0
  269. package/src/parse/model/SecondaryInstance/sources/ExternalSecondaryInstanceResource.ts +222 -0
  270. package/src/parse/model/SecondaryInstance/sources/ExternalSecondaryInstanceSource.ts +22 -0
  271. package/src/parse/model/SecondaryInstance/sources/GeoJSONExternalSecondaryInstance.ts +414 -0
  272. package/src/parse/model/SecondaryInstance/sources/InternalSecondaryInstanceSource.ts +19 -0
  273. package/src/parse/model/SecondaryInstance/sources/SecondaryInstanceSource.ts +29 -0
  274. package/src/parse/model/SecondaryInstance/sources/XMLExternalSecondaryInstanceSource.ts +32 -0
  275. package/src/parse/shared/parseStaticDocumentFromDOMSubtree.ts +149 -0
  276. package/src/parse/text/abstract/TextRangeDefinition.ts +0 -6
  277. package/src/parse/xpath/semantic-analysis.ts +29 -0
  278. package/dist/client/StringNode.d.ts +0 -46
  279. package/dist/instance/StringField.d.ts +0 -44
  280. package/dist/instance/internal-api/SubscribableDependency.d.ts +0 -59
  281. package/dist/parse/XFormDataType.d.ts +0 -25
  282. package/src/client/StringNode.ts +0 -52
  283. package/src/instance/StringField.ts +0 -120
  284. package/src/instance/internal-api/SubscribableDependency.ts +0 -61
  285. package/src/parse/XFormDataType.ts +0 -62
@@ -29,7 +29,6 @@ export abstract class DescendentNodeDefinition<
29
29
 
30
30
  readonly root: RootDefinition;
31
31
  readonly nodeset: string;
32
- readonly dependencyExpressions: ReadonlySet<string>;
33
32
  readonly isTranslated: boolean = false;
34
33
 
35
34
  constructor(
@@ -43,11 +42,6 @@ export abstract class DescendentNodeDefinition<
43
42
  if (bind.isTranslated || bodyElement?.isTranslated) {
44
43
  this.isTranslated = true;
45
44
  }
46
-
47
- this.dependencyExpressions = new Set([
48
- ...bind.dependencyExpressions,
49
- ...(bodyElement?.dependencyExpressions ?? []),
50
- ]);
51
45
  }
52
46
  }
53
47
 
@@ -0,0 +1,44 @@
1
+ import type { SubmissionDefinition } from '../../client/submission/SubmissionDefinition.ts';
2
+ import { getSubmissionElement } from '../../lib/dom/query.ts';
3
+ import type { XFormDOM } from '../XFormDOM.ts';
4
+
5
+ export class FormSubmissionDefinition implements SubmissionDefinition {
6
+ readonly submissionAction!: URL | null;
7
+ readonly submissionMethod = 'post';
8
+ readonly encryptionKey!: string | null;
9
+
10
+ constructor(xformDOM: XFormDOM) {
11
+ const submissionElement = getSubmissionElement(xformDOM.model);
12
+
13
+ let submissionAction: URL | null = null;
14
+ let submissionMethod: 'post';
15
+ let encryptionKey: string | null = null;
16
+
17
+ if (submissionElement == null) {
18
+ submissionAction = null;
19
+ submissionMethod = 'post';
20
+ encryptionKey = null;
21
+ } else {
22
+ const method = submissionElement.getAttribute('method')?.trim();
23
+
24
+ if (method == null || method === 'post' || method === 'form-data-post') {
25
+ submissionMethod = 'post';
26
+ } else {
27
+ throw new Error(`Unexpected <submission method>: ${method}`);
28
+ }
29
+
30
+ const action = submissionElement.getAttribute('action');
31
+
32
+ if (action != null) {
33
+ // TODO: this is known-fallible.
34
+ submissionAction = new URL(action.trim());
35
+ }
36
+
37
+ encryptionKey = submissionElement.getAttribute('base64RsaPublicKey');
38
+ }
39
+
40
+ this.submissionAction = submissionAction;
41
+ this.submissionMethod = submissionMethod;
42
+ this.encryptionKey = encryptionKey;
43
+ }
44
+ }
@@ -0,0 +1,4 @@
1
+ import { StaticDocument } from '../../../integration/xpath/static-dom/StaticDocument.ts';
2
+ import { ItextTranslationRootDefinition } from './ItextTranslationRootDefinition.ts';
3
+
4
+ export class ItextTranslationDefinition extends StaticDocument<ItextTranslationRootDefinition> {}
@@ -0,0 +1,41 @@
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
+
5
+ // prettier-ignore
6
+ type ItextTranslationRootKnownAttributeValue<LocalName extends string> =
7
+ LocalName extends 'lang'
8
+ ? string
9
+ : string | null;
10
+
11
+ type AssertItextTranslationRootKnownAttributeValue = <LocalName extends string>(
12
+ localName: LocalName,
13
+ value: string | null
14
+ ) => asserts value is ItextTranslationRootKnownAttributeValue<LocalName>;
15
+
16
+ const assertItextTranslationRootKnownAttributeValue: AssertItextTranslationRootKnownAttributeValue =
17
+ (localName, value) => {
18
+ if (localName === 'lang' && value == null) {
19
+ throw new Error('Invalid itext <translation> element: missing `lang` attribute');
20
+ }
21
+ };
22
+
23
+ export class ItextTranslationRootDefinition
24
+ extends StaticElement
25
+ implements XFormsItextTranslationElement<ItextTranslationRootDefinition>
26
+ {
27
+ override readonly [XFORMS_LOCAL_NAME] = 'translation';
28
+ override readonly [XFORMS_KNOWN_ATTRIBUTE] = 'lang';
29
+
30
+ override getAttributeValue(localName: 'lang'): string;
31
+ override getAttributeValue(localName: string): string | null;
32
+ override getAttributeValue<LocalName extends string>(
33
+ localName: LocalName
34
+ ): ItextTranslationRootKnownAttributeValue<LocalName> {
35
+ const value = super.getAttributeValue(localName);
36
+
37
+ assertItextTranslationRootKnownAttributeValue(localName, value);
38
+
39
+ return value;
40
+ }
41
+ }
@@ -0,0 +1,31 @@
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,13 +1,15 @@
1
+ import type { ValueType } from '../../client/ValueType.ts';
1
2
  import type { AnyBodyElementDefinition, ControlElementDefinition } from '../body/BodyDefinition.ts';
2
3
  import type { BindDefinition } from './BindDefinition.ts';
3
4
  import { DescendentNodeDefinition } from './DescendentNodeDefinition.ts';
4
5
  import type { NodeDefinition, ParentNodeDefinition } from './NodeDefinition.ts';
5
6
 
6
- export class LeafNodeDefinition
7
+ export class LeafNodeDefinition<V extends ValueType = ValueType>
7
8
  extends DescendentNodeDefinition<'leaf-node', ControlElementDefinition | null>
8
9
  implements NodeDefinition<'leaf-node'>
9
10
  {
10
11
  readonly type = 'leaf-node';
12
+ readonly valueType: V;
11
13
 
12
14
  readonly nodeName: string;
13
15
  readonly children = null;
@@ -26,6 +28,7 @@ export class LeafNodeDefinition
26
28
 
27
29
  super(parent, bind, bodyElement);
28
30
 
31
+ this.valueType = bind.type.resolved satisfies ValueType as V;
29
32
  this.nodeName = node.localName;
30
33
  this.defaultValue = node.textContent ?? '';
31
34
  }
@@ -1,6 +1,7 @@
1
1
  import type { XFormDefinition } from '../XFormDefinition.ts';
2
2
  import { BindDefinition } from './BindDefinition.ts';
3
3
  import type { BindElement, BindNodeset } from './BindElement.ts';
4
+ import { DEFAULT_BIND_TYPE } from './BindTypeDefinition.ts';
4
5
  import type { ModelDefinition } from './ModelDefinition.ts';
5
6
 
6
7
  class ArtificialBindElement implements BindElement {
@@ -15,6 +16,10 @@ class ArtificialBindElement implements BindElement {
15
16
  return this.ancestorNodeset;
16
17
  }
17
18
 
19
+ if (name === 'type') {
20
+ return DEFAULT_BIND_TYPE;
21
+ }
22
+
18
23
  return null;
19
24
  }
20
25
 
@@ -37,15 +42,8 @@ export class ModelBindMap extends Map<BindNodeset, BindDefinition> {
37
42
  protected readonly form: XFormDefinition,
38
43
  protected readonly model: ModelDefinition
39
44
  ) {
40
- const bindElements = form.xformDOM.rootEvaluator.evaluateNodes<BindElement & Element>(
41
- './xf:bind[@nodeset]',
42
- {
43
- contextNode: form.xformDOM.model,
44
- }
45
- );
46
-
47
45
  super(
48
- bindElements.map((bindElement) => {
46
+ form.xformDOM.binds.map((bindElement) => {
49
47
  const nodeset = bindElement.getAttribute('nodeset');
50
48
  const bind = new BindDefinition(form, model, nodeset, bindElement);
51
49
 
@@ -1,14 +1,19 @@
1
1
  import type { XFormDefinition } from '../XFormDefinition.ts';
2
+ import { FormSubmissionDefinition } from './FormSubmissionDefinition.ts';
3
+ import { ItextTranslationsDefinition } from './ItextTranslation/ItextTranslationsDefinition.ts';
2
4
  import { ModelBindMap } from './ModelBindMap.ts';
3
5
  import { RootDefinition } from './RootDefinition.ts';
4
6
 
5
7
  export class ModelDefinition {
6
8
  readonly binds: ModelBindMap;
7
9
  readonly root: RootDefinition;
10
+ readonly itextTranslations: ItextTranslationsDefinition;
8
11
 
9
12
  constructor(readonly form: XFormDefinition) {
13
+ const submission = new FormSubmissionDefinition(form.xformDOM);
10
14
  this.binds = ModelBindMap.fromModel(this);
11
- this.root = new RootDefinition(form, this, form.body.classes);
15
+ this.root = new RootDefinition(form, this, submission, form.body.classes);
16
+ this.itextTranslations = ItextTranslationsDefinition.from(form.xformDOM);
12
17
  }
13
18
 
14
19
  toJSON() {
@@ -121,10 +121,7 @@ export interface NodeDefinition<Type extends NodeDefinitionType> {
121
121
  readonly nodeset: string;
122
122
  readonly nodeName: string;
123
123
  readonly bodyElement: AnyBodyElementDefinition | RepeatElementDefinition | null;
124
-
125
124
  readonly isTranslated: boolean;
126
- readonly dependencyExpressions: ReadonlySet<string>;
127
-
128
125
  readonly root: RootDefinition;
129
126
  readonly parent: NodeParent<Type>;
130
127
  readonly children: NodeChildren<Type>;
@@ -1,6 +1,6 @@
1
1
  import type { NoteNode } from '../../client/NoteNode.ts';
2
2
  import type { AnyBodyElementDefinition } from '../body/BodyDefinition.ts';
3
- import type { InputDefinition } from '../body/control/InputDefinition.ts';
3
+ import type { InputControlDefinition } from '../body/control/InputControlDefinition.ts';
4
4
  import { BindComputationExpression } from '../expression/BindComputationExpression.ts';
5
5
  import type { ConstantTruthyDependentExpression } from '../expression/abstract/DependentExpression.ts';
6
6
  import type { HintDefinition } from '../text/HintDefinition.ts';
@@ -31,7 +31,7 @@ export type NoteTextDefinition =
31
31
  /**
32
32
  * @package This class is used internally, both in static types and at runtime,
33
33
  * to guard and guide the distinction between instance state nodes for 'note'
34
- * and 'string' node types. It is intentionally package-private! The less
34
+ * and 'input' node types. It is intentionally package-private! The less
35
35
  * specific {@link NoteNode.definition} type, if it has any client value at all,
36
36
  * should be more than sufficient. Clients are otherwise expected to use other
37
37
  * aspects of the node's interface (such as its {@link NoteNode.nodeType} and
@@ -61,7 +61,7 @@ export class NoteNodeDefinition extends LeafNodeDefinition {
61
61
  constructor(
62
62
  parent: ParentNodeDefinition,
63
63
  override readonly bind: NoteBindDefinition,
64
- override readonly bodyElement: InputDefinition,
64
+ override readonly bodyElement: InputControlDefinition,
65
65
  readonly noteTextDefinition: NoteTextDefinition,
66
66
  node: Element
67
67
  ) {
@@ -1,6 +1,7 @@
1
1
  import type { BodyClassList } from '../body/BodyDefinition.ts';
2
2
  import type { XFormDefinition } from '../XFormDefinition.ts';
3
3
  import type { BindDefinition } from './BindDefinition.ts';
4
+ import type { FormSubmissionDefinition } from './FormSubmissionDefinition.ts';
4
5
  import { LeafNodeDefinition } from './LeafNodeDefinition.ts';
5
6
  import type { ModelDefinition } from './ModelDefinition.ts';
6
7
  import type {
@@ -26,11 +27,11 @@ export class RootDefinition implements NodeDefinition<'root'> {
26
27
  readonly defaultValue = null;
27
28
 
28
29
  readonly isTranslated = false;
29
- readonly dependencyExpressions: ReadonlySet<string> = new Set<string>();
30
30
 
31
31
  constructor(
32
32
  protected readonly form: XFormDefinition,
33
33
  protected readonly model: ModelDefinition,
34
+ readonly submission: FormSubmissionDefinition,
34
35
  readonly classes: BodyClassList
35
36
  ) {
36
37
  // TODO: theoretically the pertinent step in the bind's `nodeset` *could* be
@@ -0,0 +1,4 @@
1
+ import { StaticDocument } from '../../../integration/xpath/static-dom/StaticDocument.ts';
2
+ import { SecondaryInstanceRootDefinition } from './SecondaryInstanceRootDefinition.ts';
3
+
4
+ export class SecondaryInstanceDefinition extends StaticDocument<SecondaryInstanceRootDefinition> {}
@@ -0,0 +1,12 @@
1
+ import type { XFormsSecondaryInstanceElement } 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 { SecondaryInstanceDefinition } from './SecondaryInstanceDefinition.ts';
5
+
6
+ export class SecondaryInstanceRootDefinition
7
+ extends StaticElement<SecondaryInstanceDefinition>
8
+ implements XFormsSecondaryInstanceElement<StaticElement>
9
+ {
10
+ override readonly [XFORMS_LOCAL_NAME] = 'instance';
11
+ override readonly [XFORMS_KNOWN_ATTRIBUTE] = 'id';
12
+ }
@@ -0,0 +1,102 @@
1
+ import { JRResourceURL } from '@getodk/common/jr-resources/JRResourceURL.ts';
2
+ import { UnreachableError } from '@getodk/common/lib/error/UnreachableError.ts';
3
+ import type { XFormsSecondaryInstanceMap } from '@getodk/xpath';
4
+ import { ErrorProductionDesignPendingError } from '../../../error/ErrorProductionDesignPendingError.ts';
5
+ import type { EngineXPathNode } from '../../../integration/xpath/adapter/kind.ts';
6
+ import type { XFormDOM } from '../../XFormDOM.ts';
7
+ import { SecondaryInstanceRootDefinition } from './SecondaryInstanceRootDefinition.ts';
8
+ import { BlankSecondaryInstanceSource } from './sources/BlankSecondaryInstanceSource.ts';
9
+ import { CSVExternalSecondaryInstanceSource } from './sources/CSVExternalSecondaryInstance.ts';
10
+ import type { ExternalSecondaryInstanceResourceLoadOptions } from './sources/ExternalSecondaryInstanceResource.ts';
11
+ import { ExternalSecondaryInstanceResource } from './sources/ExternalSecondaryInstanceResource.ts';
12
+ import { GeoJSONExternalSecondaryInstanceSource } from './sources/GeoJSONExternalSecondaryInstance.ts';
13
+ import { InternalSecondaryInstanceSource } from './sources/InternalSecondaryInstanceSource.ts';
14
+ import type { SecondaryInstanceSource } from './sources/SecondaryInstanceSource.ts';
15
+ import { XMLExternalSecondaryInstanceSource } from './sources/XMLExternalSecondaryInstanceSource.ts';
16
+
17
+ export class SecondaryInstancesDefinition
18
+ extends Map<string, SecondaryInstanceRootDefinition>
19
+ implements XFormsSecondaryInstanceMap<EngineXPathNode>
20
+ {
21
+ /**
22
+ * @package Only to be used for testing
23
+ */
24
+ static loadSync(xformDOM: XFormDOM): SecondaryInstancesDefinition {
25
+ const { secondaryInstanceElements } = xformDOM;
26
+ const sources = secondaryInstanceElements.map((domElement) => {
27
+ const instanceId = domElement.getAttribute('id');
28
+ const src = domElement.getAttribute('src');
29
+
30
+ if (src != null) {
31
+ throw new ErrorProductionDesignPendingError(
32
+ `Unexpected external secondary instance src attribute: ${src}`
33
+ );
34
+ }
35
+
36
+ return new InternalSecondaryInstanceSource(instanceId, src, domElement);
37
+ });
38
+
39
+ return new this(sources);
40
+ }
41
+
42
+ static async load(
43
+ xformDOM: XFormDOM,
44
+ options: ExternalSecondaryInstanceResourceLoadOptions
45
+ ): Promise<SecondaryInstancesDefinition> {
46
+ const { secondaryInstanceElements } = xformDOM;
47
+
48
+ const sources = await Promise.all(
49
+ secondaryInstanceElements.map(async (domElement) => {
50
+ const instanceId = domElement.getAttribute('id');
51
+ const src = domElement.getAttribute('src');
52
+
53
+ if (src == null) {
54
+ return new InternalSecondaryInstanceSource(instanceId, src, domElement);
55
+ }
56
+
57
+ if (!JRResourceURL.isJRResourceReference(src)) {
58
+ throw new ErrorProductionDesignPendingError(
59
+ `Unexpected external secondary instance src attribute: ${src}`
60
+ );
61
+ }
62
+
63
+ const resourceURL = JRResourceURL.from(src);
64
+ const resource = await ExternalSecondaryInstanceResource.load(
65
+ instanceId,
66
+ resourceURL,
67
+ options
68
+ );
69
+
70
+ if (resource.isBlank) {
71
+ return new BlankSecondaryInstanceSource(instanceId, resourceURL, domElement);
72
+ }
73
+
74
+ switch (resource.format) {
75
+ case 'csv':
76
+ return new CSVExternalSecondaryInstanceSource(domElement, resource);
77
+
78
+ case 'geojson':
79
+ return new GeoJSONExternalSecondaryInstanceSource(domElement, resource);
80
+
81
+ case 'xml':
82
+ return new XMLExternalSecondaryInstanceSource(domElement, resource);
83
+
84
+ default:
85
+ throw new UnreachableError(resource);
86
+ }
87
+ })
88
+ );
89
+
90
+ return new this(sources);
91
+ }
92
+
93
+ private constructor(sources: readonly SecondaryInstanceSource[]) {
94
+ super(
95
+ sources.map((source) => {
96
+ const { root } = source.parseDefinition();
97
+
98
+ return [root.getAttributeValue('id'), root];
99
+ })
100
+ );
101
+ }
102
+ }
@@ -0,0 +1,40 @@
1
+ import { XFORMS_NAMESPACE_URI } from '@getodk/common/constants/xmlns.ts';
2
+ import type { JRResourceURL } from '@getodk/common/jr-resources/JRResourceURL.ts';
3
+ import type { StaticNode } from '../../../../integration/xpath/static-dom/StaticNode.ts';
4
+ import { parseStaticDocumentFromDOMSubtree } from '../../../shared/parseStaticDocumentFromDOMSubtree.ts';
5
+ import type { DOMSecondaryInstanceElement } from '../../../XFormDOM.ts';
6
+ import { SecondaryInstanceDefinition } from '../SecondaryInstanceDefinition.ts';
7
+ import { SecondaryInstanceRootDefinition } from '../SecondaryInstanceRootDefinition.ts';
8
+ import { SecondaryInstanceSource } from './SecondaryInstanceSource.ts';
9
+
10
+ export class BlankSecondaryInstanceSource extends SecondaryInstanceSource<'blank'> {
11
+ constructor(
12
+ instanceId: string,
13
+ resourceURL: JRResourceURL,
14
+ domElement: DOMSecondaryInstanceElement
15
+ ) {
16
+ super('blank', instanceId, resourceURL, domElement);
17
+ }
18
+
19
+ /**
20
+ * @todo there is really no sense in using the DOM for this, other than it was
21
+ * quicker/more ergonomic than constructing the requisite {@link StaticNode}
22
+ * structures directly. Pretty good sign those constructor signatures could
23
+ * use some TLC!
24
+ */
25
+ parseDefinition(): SecondaryInstanceDefinition {
26
+ const xmlDocument = this.domElement.ownerDocument.implementation.createDocument(
27
+ XFORMS_NAMESPACE_URI,
28
+ 'instance'
29
+ );
30
+ const instanceElement = xmlDocument.documentElement;
31
+
32
+ instanceElement.setAttribute('id', this.instanceId);
33
+
34
+ return parseStaticDocumentFromDOMSubtree(
35
+ SecondaryInstanceDefinition,
36
+ SecondaryInstanceRootDefinition,
37
+ instanceElement
38
+ );
39
+ }
40
+ }