@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
@@ -0,0 +1,119 @@
1
+ import { XPathNodeKindKey } from '@getodk/xpath';
2
+ import type { Accessor } from 'solid-js';
3
+ import type {
4
+ InputDefinition,
5
+ InputNode,
6
+ InputNodeAppearances,
7
+ InputNodeInputValue,
8
+ } from '../client/InputNode.ts';
9
+ import type { TextRange } from '../client/TextRange.ts';
10
+ import type { ValueType } from '../client/ValueType.ts';
11
+ import type { XFormsXPathElement } from '../integration/xpath/adapter/XFormsXPathNode.ts';
12
+ import type { RuntimeInputValue, RuntimeValue } from '../lib/codecs/getSharedValueCodec.ts';
13
+ import { getSharedValueCodec } from '../lib/codecs/getSharedValueCodec.ts';
14
+ import type { CurrentState } from '../lib/reactivity/node-state/createCurrentState.ts';
15
+ import type { EngineState } from '../lib/reactivity/node-state/createEngineState.ts';
16
+ import type { SharedNodeState } from '../lib/reactivity/node-state/createSharedNodeState.ts';
17
+ import { createSharedNodeState } from '../lib/reactivity/node-state/createSharedNodeState.ts';
18
+ import { createFieldHint } from '../lib/reactivity/text/createFieldHint.ts';
19
+ import { createNodeLabel } from '../lib/reactivity/text/createNodeLabel.ts';
20
+ import type { Root } from './Root.ts';
21
+ import { ValueNode, type ValueNodeStateSpec } from './abstract/ValueNode.ts';
22
+ import type { GeneralParentNode } from './hierarchy.ts';
23
+ import type { EvaluationContext } from './internal-api/EvaluationContext.ts';
24
+ import type { ValidationContext } from './internal-api/ValidationContext.ts';
25
+ import type { ClientReactiveSubmittableValueNode } from './internal-api/submission/ClientReactiveSubmittableValueNode.ts';
26
+
27
+ export type AnyInputDefinition = {
28
+ [V in ValueType]: InputDefinition<V>;
29
+ }[ValueType];
30
+
31
+ interface InputControlStateSpec<V extends ValueType> extends ValueNodeStateSpec<RuntimeValue<V>> {
32
+ readonly label: Accessor<TextRange<'label'> | null>;
33
+ readonly hint: Accessor<TextRange<'hint'> | null>;
34
+ }
35
+
36
+ export class InputControl<V extends ValueType = ValueType>
37
+ extends ValueNode<V, InputDefinition<V>, RuntimeValue<V>, RuntimeInputValue<V>>
38
+ implements
39
+ InputNode<V>,
40
+ XFormsXPathElement,
41
+ EvaluationContext,
42
+ ValidationContext,
43
+ ClientReactiveSubmittableValueNode
44
+ {
45
+ static from(parent: GeneralParentNode, definition: InputDefinition): AnyInputControl;
46
+ static from<V extends ValueType>(
47
+ parent: GeneralParentNode,
48
+ definition: InputDefinition<V>
49
+ ): InputControl<V> {
50
+ return new this(parent, definition);
51
+ }
52
+
53
+ // XFormsXPathElement
54
+ override readonly [XPathNodeKindKey] = 'element';
55
+
56
+ // InstanceNode
57
+ protected readonly state: SharedNodeState<InputControlStateSpec<V>>;
58
+ protected readonly engineState: EngineState<InputControlStateSpec<V>>;
59
+
60
+ // InputNode
61
+ readonly nodeType = 'input';
62
+ readonly appearances: InputNodeAppearances;
63
+ readonly currentState: CurrentState<InputControlStateSpec<V>>;
64
+
65
+ constructor(parent: GeneralParentNode, definition: InputDefinition<V>) {
66
+ const codec = getSharedValueCodec(definition.valueType);
67
+
68
+ super(parent, definition, codec);
69
+
70
+ this.appearances = definition.bodyElement.appearances;
71
+
72
+ const sharedStateOptions = {
73
+ clientStateFactory: this.engineConfig.stateFactory,
74
+ };
75
+
76
+ const state = createSharedNodeState(
77
+ this.scope,
78
+ {
79
+ reference: this.contextReference,
80
+ readonly: this.isReadonly,
81
+ relevant: this.isRelevant,
82
+ required: this.isRequired,
83
+
84
+ label: createNodeLabel(this, definition),
85
+ hint: createFieldHint(this, definition),
86
+ children: null,
87
+ valueOptions: null,
88
+ value: this.valueState,
89
+ instanceValue: this.getInstanceValue,
90
+ },
91
+ sharedStateOptions
92
+ );
93
+
94
+ this.state = state;
95
+ this.engineState = state.engineState;
96
+ this.currentState = state.currentState;
97
+ }
98
+
99
+ setValue(value: InputNodeInputValue<V>): Root {
100
+ this.setValueState(value);
101
+
102
+ return this.root;
103
+ }
104
+ }
105
+
106
+ export type AnyInputControl =
107
+ | InputControl<'barcode'>
108
+ | InputControl<'binary'>
109
+ | InputControl<'boolean'>
110
+ | InputControl<'date'>
111
+ | InputControl<'dateTime'>
112
+ | InputControl<'decimal'>
113
+ | InputControl<'geopoint'>
114
+ | InputControl<'geoshape'>
115
+ | InputControl<'geotrace'>
116
+ | InputControl<'int'>
117
+ | InputControl<'intent'>
118
+ | InputControl<'string'>
119
+ | InputControl<'time'>;
@@ -1,65 +1,57 @@
1
- import { identity } from '@getodk/common/lib/identity.ts';
2
- import type { ModelValueNode } from '../client/ModelValueNode.ts';
3
- import type { AnyViolation, LeafNodeValidationState } from '../client/validation.ts';
4
- import { createValueState } from '../lib/reactivity/createValueState.ts';
1
+ import { XPathNodeKindKey } from '@getodk/xpath';
2
+ import type { ModelValueDefinition, ModelValueNode } from '../client/ModelValueNode.ts';
3
+ import type { ValueType } from '../client/ValueType.ts';
4
+ import type { XFormsXPathElement } from '../integration/xpath/adapter/XFormsXPathNode.ts';
5
+ import type { RuntimeInputValue, RuntimeValue } from '../lib/codecs/getSharedValueCodec.ts';
6
+ import { getSharedValueCodec } from '../lib/codecs/getSharedValueCodec.ts';
5
7
  import type { CurrentState } from '../lib/reactivity/node-state/createCurrentState.ts';
6
8
  import type { EngineState } from '../lib/reactivity/node-state/createEngineState.ts';
7
9
  import type { SharedNodeState } from '../lib/reactivity/node-state/createSharedNodeState.ts';
8
10
  import { createSharedNodeState } from '../lib/reactivity/node-state/createSharedNodeState.ts';
9
- import type { SimpleAtomicState } from '../lib/reactivity/types.ts';
10
- import type { SharedValidationState } from '../lib/reactivity/validation/createValidation.ts';
11
- import { createValidationState } from '../lib/reactivity/validation/createValidation.ts';
12
- import type { LeafNodeDefinition } from '../parse/model/LeafNodeDefinition.ts';
13
- import type { DescendantNodeStateSpec } from './abstract/DescendantNode.ts';
14
- import { DescendantNode } from './abstract/DescendantNode.ts';
11
+ import { ValueNode, type ValueNodeStateSpec } from './abstract/ValueNode.ts';
15
12
  import type { GeneralParentNode } from './hierarchy.ts';
16
13
  import type { EvaluationContext } from './internal-api/EvaluationContext.ts';
17
- import type { SubscribableDependency } from './internal-api/SubscribableDependency.ts';
18
14
  import type { ValidationContext } from './internal-api/ValidationContext.ts';
19
- import type { ValueContext } from './internal-api/ValueContext.ts';
15
+ import type { ClientReactiveSubmittableValueNode } from './internal-api/submission/ClientReactiveSubmittableValueNode.ts';
20
16
 
21
- export interface ModelValueDefinition extends LeafNodeDefinition {
22
- readonly bodyElement: null;
23
- }
24
-
25
- interface ModelValueStateSpec extends DescendantNodeStateSpec<string> {
17
+ interface ModelValueStateSpec<V extends ValueType> extends ValueNodeStateSpec<RuntimeValue<V>> {
26
18
  readonly label: null;
27
19
  readonly hint: null;
28
- readonly children: null;
29
- readonly value: SimpleAtomicState<string>;
30
- readonly valueOptions: null;
31
20
  }
32
21
 
33
- export class ModelValue
34
- extends DescendantNode<ModelValueDefinition, ModelValueStateSpec, null>
22
+ export class ModelValue<V extends ValueType = ValueType>
23
+ extends ValueNode<V, ModelValueDefinition<V>, RuntimeValue<V>, RuntimeInputValue<V>>
35
24
  implements
36
- ModelValueNode,
25
+ ModelValueNode<V>,
26
+ XFormsXPathElement,
37
27
  EvaluationContext,
38
- SubscribableDependency,
39
28
  ValidationContext,
40
- ValueContext<string>
29
+ ClientReactiveSubmittableValueNode
41
30
  {
42
- private readonly validation: SharedValidationState;
43
- protected readonly state: SharedNodeState<ModelValueStateSpec>;
31
+ static from(parent: GeneralParentNode, definition: ModelValueDefinition): AnyModelValue;
32
+ static from<V extends ValueType>(
33
+ parent: GeneralParentNode,
34
+ definition: ModelValueDefinition<V>
35
+ ): ModelValue<V> {
36
+ return new this(parent, definition);
37
+ }
38
+
39
+ // XFormsXPathElement
40
+ override readonly [XPathNodeKindKey] = 'element';
44
41
 
45
42
  // InstanceNode
46
- protected engineState: EngineState<ModelValueStateSpec>;
43
+ protected readonly state: SharedNodeState<ModelValueStateSpec<V>>;
44
+ protected readonly engineState: EngineState<ModelValueStateSpec<V>>;
47
45
 
48
46
  // ModelValueNode
49
47
  readonly nodeType = 'model-value';
50
48
  readonly appearances = null;
51
- readonly currentState: CurrentState<ModelValueStateSpec>;
49
+ readonly currentState: CurrentState<ModelValueStateSpec<V>>;
52
50
 
53
- get validationState(): LeafNodeValidationState {
54
- return this.validation.currentState;
55
- }
56
-
57
- // ValueContext
58
- readonly encodeValue = identity<string>;
59
- readonly decodeValue = identity<string>;
51
+ constructor(parent: GeneralParentNode, definition: ModelValueDefinition<V>) {
52
+ const codec = getSharedValueCodec(definition.valueType);
60
53
 
61
- constructor(parent: GeneralParentNode, definition: ModelValueDefinition) {
62
- super(parent, definition);
54
+ super(parent, definition, codec);
63
55
 
64
56
  const sharedStateOptions = {
65
57
  clientStateFactory: this.engineConfig.stateFactory,
@@ -77,7 +69,8 @@ export class ModelValue
77
69
  hint: null,
78
70
  children: null,
79
71
  valueOptions: null,
80
- value: createValueState(this),
72
+ value: this.valueState,
73
+ instanceValue: this.getInstanceValue,
81
74
  },
82
75
  sharedStateOptions
83
76
  );
@@ -85,20 +78,20 @@ export class ModelValue
85
78
  this.state = state;
86
79
  this.engineState = state.engineState;
87
80
  this.currentState = state.currentState;
88
- this.validation = createValidationState(this, sharedStateOptions);
89
- }
90
-
91
- // ValidationContext
92
- getViolation(): AnyViolation | null {
93
- return this.validation.engineState.violation;
94
- }
95
-
96
- isBlank(): boolean {
97
- return this.engineState.value === '';
98
- }
99
-
100
- // InstanceNode
101
- getChildren(): readonly [] {
102
- return [];
103
81
  }
104
82
  }
83
+
84
+ export type AnyModelValue =
85
+ | ModelValue<'barcode'>
86
+ | ModelValue<'binary'>
87
+ | ModelValue<'boolean'>
88
+ | ModelValue<'date'>
89
+ | ModelValue<'dateTime'>
90
+ | ModelValue<'decimal'>
91
+ | ModelValue<'geopoint'>
92
+ | ModelValue<'geoshape'>
93
+ | ModelValue<'geotrace'>
94
+ | ModelValue<'int'>
95
+ | ModelValue<'intent'>
96
+ | ModelValue<'string'>
97
+ | ModelValue<'time'>;
@@ -1,9 +1,13 @@
1
1
  import { UnreachableError } from '@getodk/common/lib/error/UnreachableError.ts';
2
2
  import { identity } from '@getodk/common/lib/identity.ts';
3
+ import { XPathNodeKindKey } from '@getodk/xpath';
3
4
  import type { Accessor } from 'solid-js';
4
5
  import type { NoteNode, NoteNodeAppearances } from '../client/NoteNode.ts';
6
+ import type { SubmissionState } from '../client/submission/SubmissionState.ts';
5
7
  import type { TextRange } from '../client/TextRange.ts';
6
8
  import type { AnyViolation, LeafNodeValidationState } from '../client/validation.ts';
9
+ import type { XFormsXPathElement } from '../integration/xpath/adapter/XFormsXPathNode.ts';
10
+ import { createLeafNodeSubmissionState } from '../lib/client-reactivity/submission/createLeafNodeSubmissionState.ts';
7
11
  import { createNoteReadonlyThunk } from '../lib/reactivity/createNoteReadonlyThunk.ts';
8
12
  import { createValueState } from '../lib/reactivity/createValueState.ts';
9
13
  import type { CurrentState } from '../lib/reactivity/node-state/createCurrentState.ts';
@@ -21,7 +25,7 @@ import type { DescendantNodeStateSpec } from './abstract/DescendantNode.ts';
21
25
  import { DescendantNode } from './abstract/DescendantNode.ts';
22
26
  import type { GeneralParentNode } from './hierarchy.ts';
23
27
  import type { EvaluationContext } from './internal-api/EvaluationContext.ts';
24
- import type { SubscribableDependency } from './internal-api/SubscribableDependency.ts';
28
+ import type { ClientReactiveSubmittableLeafNode } from './internal-api/submission/ClientReactiveSubmittableLeafNode.ts';
25
29
  import type { ValidationContext } from './internal-api/ValidationContext.ts';
26
30
  import type { ValueContext } from './internal-api/ValueContext.ts';
27
31
 
@@ -36,19 +40,23 @@ interface NoteStateSpec extends DescendantNodeStateSpec<string> {
36
40
  }
37
41
 
38
42
  export class Note
39
- extends DescendantNode<NoteNodeDefinition, NoteStateSpec, null>
43
+ extends DescendantNode<NoteNodeDefinition, NoteStateSpec, GeneralParentNode, null>
40
44
  implements
41
45
  NoteNode,
46
+ XFormsXPathElement,
42
47
  EvaluationContext,
43
- SubscribableDependency,
44
48
  ValidationContext,
45
- ValueContext<string>
49
+ ValueContext<string>,
50
+ ClientReactiveSubmittableLeafNode<string>
46
51
  {
47
52
  private readonly validation: SharedValidationState;
48
- protected readonly state: SharedNodeState<NoteStateSpec>;
53
+
54
+ // XFormsXPathElement
55
+ override readonly [XPathNodeKindKey] = 'element';
49
56
 
50
57
  // InstanceNode
51
- protected engineState: EngineState<NoteStateSpec>;
58
+ protected readonly state: SharedNodeState<NoteStateSpec>;
59
+ protected readonly engineState: EngineState<NoteStateSpec>;
52
60
 
53
61
  // NoteNode
54
62
  readonly nodeType = 'note';
@@ -59,9 +67,11 @@ export class Note
59
67
  return this.validation.currentState;
60
68
  }
61
69
 
70
+ readonly submissionState: SubmissionState;
71
+
62
72
  // ValueContext
73
+ override readonly contextNode = this;
63
74
  readonly encodeValue = identity<string>;
64
-
65
75
  readonly decodeValue = identity<string>;
66
76
 
67
77
  constructor(parent: GeneralParentNode, definition: NoteNodeDefinition) {
@@ -73,7 +83,7 @@ export class Note
73
83
  clientStateFactory: this.engineConfig.stateFactory,
74
84
  };
75
85
 
76
- const isReadonly = createNoteReadonlyThunk(this, definition.bind.readonly);
86
+ const isReadonly = createNoteReadonlyThunk(this, definition);
77
87
  const noteTextComputation = createNoteText(this, definition.noteTextDefinition);
78
88
 
79
89
  let noteText: ComputedNoteText;
@@ -124,6 +134,12 @@ export class Note
124
134
  this.engineState = state.engineState;
125
135
  this.currentState = state.currentState;
126
136
  this.validation = createValidationState(this, sharedStateOptions);
137
+ this.submissionState = createLeafNodeSubmissionState(this);
138
+ }
139
+
140
+ // XFormsXPathElement
141
+ override getXPathValue(): string {
142
+ return this.engineState.value;
127
143
  }
128
144
 
129
145
  // ValidationContext
@@ -0,0 +1,244 @@
1
+ import { XPathNodeKindKey } from '@getodk/xpath';
2
+ import type { Accessor } from 'solid-js';
3
+ import { createSignal } from 'solid-js';
4
+ import type { ActiveLanguage, FormLanguage, FormLanguages } from '../client/FormLanguage.ts';
5
+ import type { FormNodeID } from '../client/identity.ts';
6
+ import type { RootNode } from '../client/RootNode.ts';
7
+ import type {
8
+ SubmissionChunkedType,
9
+ SubmissionOptions,
10
+ } from '../client/submission/SubmissionOptions.ts';
11
+ import type { SubmissionResult } from '../client/submission/SubmissionResult.ts';
12
+ import type { SubmissionState } from '../client/submission/SubmissionState.ts';
13
+ import type { AncestorNodeValidationState } from '../client/validation.ts';
14
+ import type { XFormsXPathDocument } from '../integration/xpath/adapter/XFormsXPathNode.ts';
15
+ import { EngineXPathEvaluator } from '../integration/xpath/EngineXPathEvaluator.ts';
16
+ import { createInstanceSubmissionState } from '../lib/client-reactivity/submission/createInstanceSubmissionState.ts';
17
+ import { prepareSubmission } from '../lib/client-reactivity/submission/prepareSubmission.ts';
18
+ import { createChildrenState } from '../lib/reactivity/createChildrenState.ts';
19
+ import { createTranslationState } from '../lib/reactivity/createTranslationState.ts';
20
+ import type { MaterializedChildren } from '../lib/reactivity/materializeCurrentStateChildren.ts';
21
+ import { materializeCurrentStateChildren } from '../lib/reactivity/materializeCurrentStateChildren.ts';
22
+ import type { CurrentState } from '../lib/reactivity/node-state/createCurrentState.ts';
23
+ import type { EngineState } from '../lib/reactivity/node-state/createEngineState.ts';
24
+ import type { SharedNodeState } from '../lib/reactivity/node-state/createSharedNodeState.ts';
25
+ import { createSharedNodeState } from '../lib/reactivity/node-state/createSharedNodeState.ts';
26
+ import type { ReactiveScope } from '../lib/reactivity/scope.ts';
27
+ import type { SimpleAtomicStateSetter } from '../lib/reactivity/types.ts';
28
+ import type { BodyClassList } from '../parse/body/BodyDefinition.ts';
29
+ import type { ModelDefinition } from '../parse/model/ModelDefinition.ts';
30
+ import type { RootDefinition } from '../parse/model/RootDefinition.ts';
31
+ import type { SecondaryInstancesDefinition } from '../parse/model/SecondaryInstance/SecondaryInstancesDefinition.ts';
32
+ import { InstanceNode } from './abstract/InstanceNode.ts';
33
+ import type { EvaluationContext } from './internal-api/EvaluationContext.ts';
34
+ import type { InstanceConfig } from './internal-api/InstanceConfig.ts';
35
+ import type { PrimaryInstanceDocument } from './internal-api/PrimaryInstanceDocument.ts';
36
+ import type { ClientReactiveSubmittableInstance } from './internal-api/submission/ClientReactiveSubmittableInstance.ts';
37
+ import type { TranslationContext } from './internal-api/TranslationContext.ts';
38
+ import { Root } from './Root.ts';
39
+
40
+ /**
41
+ * As specified by {@link | XPath 1.0}:
42
+ *
43
+ * > A `/` by itself selects the root node of the document containing the
44
+ * > context node.
45
+ *
46
+ * Important note: "root node" here references the same semantics currently
47
+ * represented by `@getodk/xpath` as {@link XPathDocument}. It is an infortunate
48
+ * historical mistake that our internal representation of a primary instance has
49
+ * conflated the same "root" term to represent the "document element" with the
50
+ * same semantic name.
51
+ *
52
+ * {@link PrimaryInstance} exists specifically to provide XPath document
53
+ * semantics. At time of writing, it is expected that every XPath evaluation
54
+ * will be performed with a context node either:
55
+ *
56
+ * - somewhere in this primary instance document's hierarchy; or
57
+ * - in a related subtree where the primary instance document is still
58
+ * semantically represented as the context root node
59
+ */
60
+ const PRIMARY_INSTANCE_REFERENCE = '/';
61
+
62
+ interface PrimaryInstanceStateSpec {
63
+ readonly reference: string;
64
+ readonly readonly: boolean;
65
+ readonly relevant: boolean;
66
+ readonly required: boolean;
67
+ readonly label: null;
68
+ readonly hint: null;
69
+ readonly children: Accessor<readonly FormNodeID[]>;
70
+ readonly valueOptions: null;
71
+ readonly value: null;
72
+
73
+ // Root-specific
74
+ readonly activeLanguage: Accessor<ActiveLanguage>;
75
+ }
76
+
77
+ export class PrimaryInstance
78
+ extends InstanceNode<RootDefinition, PrimaryInstanceStateSpec, null, Root>
79
+ implements
80
+ PrimaryInstanceDocument,
81
+ XFormsXPathDocument,
82
+ TranslationContext,
83
+ EvaluationContext,
84
+ ClientReactiveSubmittableInstance
85
+ {
86
+ // InstanceNode
87
+ protected readonly state: SharedNodeState<PrimaryInstanceStateSpec>;
88
+ protected readonly engineState: EngineState<PrimaryInstanceStateSpec>;
89
+ readonly getChildren: Accessor<readonly Root[]>;
90
+
91
+ readonly hasReadonlyAncestor = () => false;
92
+ readonly isReadonly = () => false;
93
+ readonly hasNonRelevantAncestor = () => false;
94
+ readonly isRelevant = () => true;
95
+
96
+ // TranslationContext (support)
97
+ private readonly setActiveLanguage: SimpleAtomicStateSetter<FormLanguage>;
98
+
99
+ // XFormsXPathDocument
100
+ readonly [XPathNodeKindKey] = 'document';
101
+
102
+ // PrimaryInstanceDocument, ClientReactiveSubmittableInstance
103
+ readonly nodeType = 'primary-instance';
104
+ readonly appearances = null;
105
+ readonly classes: BodyClassList;
106
+ readonly root: Root;
107
+ readonly currentState: MaterializedChildren<CurrentState<PrimaryInstanceStateSpec>, Root>;
108
+ readonly validationState: AncestorNodeValidationState;
109
+ readonly submissionState: SubmissionState;
110
+ readonly languages: FormLanguages;
111
+
112
+ // TranslationContext (+ EvaluationContext)
113
+ readonly getActiveLanguage: Accessor<ActiveLanguage>;
114
+
115
+ // EvaluationContext
116
+ readonly isAttached: Accessor<boolean>;
117
+ readonly evaluator: EngineXPathEvaluator;
118
+ override readonly contextNode = this;
119
+
120
+ constructor(
121
+ scope: ReactiveScope,
122
+ model: ModelDefinition,
123
+ secondaryInstances: SecondaryInstancesDefinition,
124
+ engineConfig: InstanceConfig
125
+ ) {
126
+ const { root: definition } = model;
127
+
128
+ super(engineConfig, null, definition, {
129
+ scope,
130
+ computeReference: () => PRIMARY_INSTANCE_REFERENCE,
131
+ });
132
+
133
+ const [isAttached, setIsAttached] = createSignal(false);
134
+
135
+ this.isAttached = isAttached;
136
+
137
+ const evaluator = new EngineXPathEvaluator({
138
+ rootNode: this,
139
+ itextTranslationsByLanguage: model.itextTranslations,
140
+ secondaryInstancesById: secondaryInstances,
141
+ });
142
+
143
+ const { languages, getActiveLanguage, setActiveLanguage } = createTranslationState(
144
+ scope,
145
+ evaluator
146
+ );
147
+
148
+ this.languages = languages;
149
+ this.getActiveLanguage = getActiveLanguage;
150
+ this.setActiveLanguage = setActiveLanguage;
151
+
152
+ this.evaluator = evaluator;
153
+ this.classes = definition.classes;
154
+
155
+ const childrenState = createChildrenState<this, Root>(this);
156
+
157
+ this.getChildren = childrenState.getChildren;
158
+
159
+ const stateSpec: PrimaryInstanceStateSpec = {
160
+ activeLanguage: getActiveLanguage,
161
+ reference: PRIMARY_INSTANCE_REFERENCE,
162
+ label: null,
163
+ hint: null,
164
+ readonly: false,
165
+ relevant: true,
166
+ required: false,
167
+ valueOptions: null,
168
+ value: null,
169
+ children: childrenState.childIds,
170
+ };
171
+
172
+ const state = createSharedNodeState(scope, stateSpec, {
173
+ clientStateFactory: engineConfig.stateFactory,
174
+ });
175
+
176
+ this.state = state;
177
+ this.engineState = state.engineState;
178
+ this.currentState = materializeCurrentStateChildren(scope, state.currentState, childrenState);
179
+
180
+ const root = new Root(this);
181
+
182
+ this.root = root;
183
+
184
+ this.validationState = {
185
+ get violations() {
186
+ return root.validationState.violations;
187
+ },
188
+ };
189
+ this.submissionState = createInstanceSubmissionState(this);
190
+
191
+ childrenState.setChildren([root]);
192
+ setIsAttached(true);
193
+ }
194
+
195
+ // PrimaryInstanceDocument
196
+ /**
197
+ * @todo Note that this method's signature is intentionally derived from
198
+ * {@link RootNode.setLanguage}, but its return type differs! The design
199
+ * intent of returning {@link RootNode} from all of the client-facing state
200
+ * setter methods has proven… interesting philosophically. But nothing
201
+ * downstream has availed itself of that philosophy, and otherwise it's not
202
+ * particularly pragmatic or ergonomic (internally or for clients alike).
203
+ *
204
+ * Since this class is (currently) engine-internal, this seems like an
205
+ * excellent place to start a discussion around what we want longer term for
206
+ * state setter signatures in _client-facing_ APIs. As a first pass, it seems
207
+ * reasonable to borrow the idiomatic convention of returning the effective
208
+ * value assigned by the setter.
209
+ *
210
+ * @see
211
+ * {@link https://github.com/getodk/web-forms/issues/45#issuecomment-1967932261 | Initial read interface design between engine and UI - design summary comment}
212
+ * (and some of the comments leading up to it) for background on the
213
+ * philosophical reasoning behind the existing signature convention.
214
+ */
215
+ setLanguage(language: FormLanguage): FormLanguage {
216
+ const availableFormLanguage = this.languages.find(
217
+ (formLanguage): formLanguage is FormLanguage => {
218
+ return (
219
+ formLanguage.isSyntheticDefault == null && formLanguage.language === language.language
220
+ );
221
+ }
222
+ );
223
+
224
+ if (availableFormLanguage == null) {
225
+ throw new Error(`Language "${language.language}" not available`);
226
+ }
227
+
228
+ this.evaluator.setActiveLanguage(availableFormLanguage.language);
229
+
230
+ return this.setActiveLanguage(availableFormLanguage);
231
+ }
232
+
233
+ // PrimaryInstanceDocument, ClientReactiveSubmittableInstance
234
+ prepareSubmission<ChunkedType extends SubmissionChunkedType = 'monolithic'>(
235
+ options?: SubmissionOptions<ChunkedType>
236
+ ): Promise<SubmissionResult<ChunkedType>> {
237
+ const result = prepareSubmission(this, {
238
+ chunked: (options?.chunked ?? 'monolithic') as ChunkedType,
239
+ maxSize: options?.maxSize ?? Infinity,
240
+ });
241
+
242
+ return Promise.resolve(result);
243
+ }
244
+ }