@getodk/xforms-engine 0.5.0 → 0.6.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 (232) hide show
  1. package/README.md +1 -1
  2. package/dist/client/BaseNode.d.ts +4 -0
  3. package/dist/client/BaseValueNode.d.ts +1 -1
  4. package/dist/client/GroupNode.d.ts +1 -0
  5. package/dist/client/InputNode.d.ts +32 -3
  6. package/dist/client/ModelValueNode.d.ts +1 -0
  7. package/dist/client/NoteNode.d.ts +24 -7
  8. package/dist/client/RangeNode.d.ts +36 -0
  9. package/dist/client/RankNode.d.ts +46 -0
  10. package/dist/client/RootNode.d.ts +6 -3
  11. package/dist/client/SelectNode.d.ts +47 -25
  12. package/dist/client/SubtreeNode.d.ts +1 -0
  13. package/dist/client/TriggerNode.d.ts +10 -6
  14. package/dist/client/hierarchy.d.ts +5 -5
  15. package/dist/client/node-types.d.ts +2 -2
  16. package/dist/client/unsupported/UnsupportedControlNode.d.ts +1 -3
  17. package/dist/error/RankMissingValueError.d.ts +3 -0
  18. package/dist/error/RankValueTypeError.d.ts +6 -0
  19. package/dist/error/SelectValueTypeError.d.ts +15 -0
  20. package/dist/error/XFormsSpecViolationError.d.ts +2 -0
  21. package/dist/index.d.ts +2 -3
  22. package/dist/index.js +5604 -4666
  23. package/dist/index.js.map +1 -1
  24. package/dist/instance/Group.d.ts +1 -0
  25. package/dist/instance/InputControl.d.ts +5 -3
  26. package/dist/instance/ModelValue.d.ts +2 -0
  27. package/dist/instance/Note.d.ts +13 -25
  28. package/dist/instance/PrimaryInstance.d.ts +1 -0
  29. package/dist/instance/RangeControl.d.ts +34 -0
  30. package/dist/instance/RankControl.d.ts +40 -0
  31. package/dist/instance/Root.d.ts +1 -0
  32. package/dist/instance/SelectControl.d.ts +66 -0
  33. package/dist/instance/Subtree.d.ts +1 -0
  34. package/dist/instance/TriggerControl.d.ts +9 -22
  35. package/dist/instance/abstract/DescendantNode.d.ts +1 -2
  36. package/dist/instance/abstract/InstanceNode.d.ts +3 -1
  37. package/dist/instance/abstract/UnsupportedControl.d.ts +1 -0
  38. package/dist/instance/abstract/ValueNode.d.ts +0 -1
  39. package/dist/instance/hierarchy.d.ts +9 -9
  40. package/dist/instance/internal-api/InstanceValueContext.d.ts +2 -0
  41. package/dist/instance/internal-api/submission/ClientReactiveSubmittableLeafNode.d.ts +2 -1
  42. package/dist/instance/internal-api/submission/ClientReactiveSubmittableParentNode.d.ts +2 -1
  43. package/dist/instance/internal-api/submission/ClientReactiveSubmittableValueNode.d.ts +2 -1
  44. package/dist/instance/repeat/BaseRepeatRange.d.ts +1 -0
  45. package/dist/instance/repeat/RepeatInstance.d.ts +1 -0
  46. package/dist/integration/xpath/adapter/names.d.ts +1 -11
  47. package/dist/integration/xpath/adapter/traversal.d.ts +10 -9
  48. package/dist/integration/xpath/static-dom/StaticAttribute.d.ts +10 -3
  49. package/dist/integration/xpath/static-dom/StaticDocument.d.ts +0 -1
  50. package/dist/integration/xpath/static-dom/StaticElement.d.ts +12 -4
  51. package/dist/lib/client-reactivity/submission/createRootSubmissionState.d.ts +3 -0
  52. package/dist/lib/codecs/Geopoint/Geopoint.d.ts +48 -0
  53. package/dist/lib/codecs/Geopoint/GeopointValueCodec.d.ts +5 -0
  54. package/dist/lib/codecs/NoteCodec.d.ts +8 -0
  55. package/dist/lib/codecs/RangeCodec.d.ts +8 -0
  56. package/dist/lib/codecs/TriggerCodec.d.ts +7 -0
  57. package/dist/lib/codecs/ValueArrayCodec.d.ts +11 -0
  58. package/dist/lib/codecs/ValueCodec.d.ts +2 -2
  59. package/dist/lib/codecs/getNoteCodec.d.ts +3 -0
  60. package/dist/lib/codecs/getSelectCodec.d.ts +5 -0
  61. package/dist/lib/codecs/getSharedValueCodec.d.ts +3 -2
  62. package/dist/lib/codecs/items/BaseItemCodec.d.ts +9 -0
  63. package/dist/lib/codecs/items/MultipleValueItemCodec.d.ts +14 -0
  64. package/dist/lib/codecs/items/SingleValueItemCodec.d.ts +24 -0
  65. package/dist/lib/dom/query.d.ts +1 -2
  66. package/dist/lib/names/NamespaceDeclaration.d.ts +45 -0
  67. package/dist/lib/names/NamespaceDeclarationMap.d.ts +137 -0
  68. package/dist/lib/names/NamespaceURL.d.ts +30 -0
  69. package/dist/lib/names/QualifiedName.d.ts +113 -0
  70. package/dist/lib/number-parsers.d.ts +2 -0
  71. package/dist/lib/reactivity/createItemCollection.d.ts +21 -0
  72. package/dist/lib/xml-serialization.d.ts +11 -2
  73. package/dist/parse/XFormDOM.d.ts +1 -1
  74. package/dist/parse/body/BodyDefinition.d.ts +2 -2
  75. package/dist/parse/body/appearance/rangeAppearanceParser.d.ts +3 -0
  76. package/dist/parse/body/control/InputControlDefinition.d.ts +3 -0
  77. package/dist/parse/body/control/ItemDefinition.d.ts +14 -0
  78. package/dist/parse/body/control/ItemsetDefinition.d.ts +18 -0
  79. package/dist/parse/body/control/RangeControlDefinition.d.ts +31 -2
  80. package/dist/parse/body/control/RankControlDefinition.d.ts +7 -3
  81. package/dist/parse/body/control/{select/SelectDefinition.d.ts → SelectControlDefinition.d.ts} +9 -9
  82. package/dist/parse/expression/ItemsetNodesetExpression.d.ts +1 -1
  83. package/dist/parse/expression/ItemsetValueExpression.d.ts +1 -1
  84. package/dist/parse/model/BindDefinition.d.ts +3 -1
  85. package/dist/parse/model/BindPreloadDefinition.d.ts +42 -0
  86. package/dist/parse/model/DescendentNodeDefinition.d.ts +4 -13
  87. package/dist/parse/model/ItextTranslation/ItextTranslationRootDefinition.d.ts +2 -1
  88. package/dist/parse/model/LeafNodeDefinition.d.ts +7 -4
  89. package/dist/parse/model/ModelBindMap.d.ts +1 -1
  90. package/dist/parse/model/NodeDefinition.d.ts +16 -19
  91. package/dist/parse/model/NoteNodeDefinition.d.ts +6 -5
  92. package/dist/parse/model/RangeNodeDefinition.d.ts +41 -0
  93. package/dist/parse/model/RepeatInstanceDefinition.d.ts +7 -4
  94. package/dist/parse/model/RepeatRangeDefinition.d.ts +7 -4
  95. package/dist/parse/model/RepeatTemplateDefinition.d.ts +7 -4
  96. package/dist/parse/model/RootAttributeDefinition.d.ts +24 -0
  97. package/dist/parse/model/RootAttributeMap.d.ts +23 -0
  98. package/dist/parse/model/RootDefinition.d.ts +9 -7
  99. package/dist/parse/model/SubtreeDefinition.d.ts +7 -4
  100. package/dist/parse/shared/parseStaticDocumentFromDOMSubtree.d.ts +2 -3
  101. package/dist/parse/text/ItemLabelDefinition.d.ts +1 -1
  102. package/dist/parse/text/ItemsetLabelDefinition.d.ts +2 -2
  103. package/dist/parse/text/abstract/TextElementDefinition.d.ts +1 -1
  104. package/dist/parse/xpath/semantic-analysis.d.ts +1 -3
  105. package/dist/solid.js +5603 -4665
  106. package/dist/solid.js.map +1 -1
  107. package/package.json +15 -12
  108. package/src/client/BaseNode.ts +5 -0
  109. package/src/client/BaseValueNode.ts +1 -1
  110. package/src/client/GroupNode.ts +1 -0
  111. package/src/client/InputNode.ts +38 -2
  112. package/src/client/ModelValueNode.ts +1 -0
  113. package/src/client/NoteNode.ts +43 -7
  114. package/src/client/RangeNode.ts +51 -0
  115. package/src/client/RankNode.ts +54 -0
  116. package/src/client/RootNode.ts +11 -5
  117. package/src/client/SelectNode.ts +53 -26
  118. package/src/client/SubtreeNode.ts +1 -0
  119. package/src/client/TriggerNode.ts +12 -6
  120. package/src/client/hierarchy.ts +7 -8
  121. package/src/client/node-types.ts +1 -1
  122. package/src/client/unsupported/UnsupportedControlNode.ts +2 -6
  123. package/src/error/RankMissingValueError.ts +5 -0
  124. package/src/error/RankValueTypeError.ts +13 -0
  125. package/src/error/SelectValueTypeError.ts +22 -0
  126. package/src/error/XFormsSpecViolationError.ts +1 -0
  127. package/src/index.ts +2 -12
  128. package/src/instance/Group.ts +1 -0
  129. package/src/instance/InputControl.ts +42 -2
  130. package/src/instance/ModelValue.ts +2 -0
  131. package/src/instance/Note.ts +34 -59
  132. package/src/instance/PrimaryInstance.ts +1 -0
  133. package/src/instance/RangeControl.ts +113 -0
  134. package/src/instance/RankControl.ts +199 -0
  135. package/src/instance/Root.ts +3 -2
  136. package/src/instance/SelectControl.ts +219 -0
  137. package/src/instance/Subtree.ts +1 -0
  138. package/src/instance/TriggerControl.ts +36 -75
  139. package/src/instance/abstract/DescendantNode.ts +1 -6
  140. package/src/instance/abstract/InstanceNode.ts +10 -2
  141. package/src/instance/abstract/UnsupportedControl.ts +1 -0
  142. package/src/instance/abstract/ValueNode.ts +3 -2
  143. package/src/instance/children.ts +71 -30
  144. package/src/instance/hierarchy.ts +21 -16
  145. package/src/instance/internal-api/InstanceValueContext.ts +2 -0
  146. package/src/instance/internal-api/submission/ClientReactiveSubmittableLeafNode.ts +2 -1
  147. package/src/instance/internal-api/submission/ClientReactiveSubmittableParentNode.ts +2 -1
  148. package/src/instance/internal-api/submission/ClientReactiveSubmittableValueNode.ts +2 -1
  149. package/src/instance/repeat/BaseRepeatRange.ts +2 -0
  150. package/src/instance/repeat/RepeatInstance.ts +1 -0
  151. package/src/instance/resource.ts +4 -1
  152. package/src/integration/xpath/adapter/names.ts +66 -17
  153. package/src/integration/xpath/adapter/traversal.ts +10 -9
  154. package/src/integration/xpath/static-dom/StaticAttribute.ts +15 -7
  155. package/src/integration/xpath/static-dom/StaticDocument.ts +0 -2
  156. package/src/integration/xpath/static-dom/StaticElement.ts +21 -8
  157. package/src/lib/client-reactivity/submission/createLeafNodeSubmissionState.ts +1 -1
  158. package/src/lib/client-reactivity/submission/createParentNodeSubmissionState.ts +1 -1
  159. package/src/lib/client-reactivity/submission/createRootSubmissionState.ts +19 -0
  160. package/src/lib/client-reactivity/submission/createValueNodeSubmissionState.ts +2 -2
  161. package/src/lib/codecs/Geopoint/Geopoint.ts +150 -0
  162. package/src/lib/codecs/Geopoint/GeopointValueCodec.ts +20 -0
  163. package/src/lib/codecs/NoteCodec.ts +32 -0
  164. package/src/lib/codecs/RangeCodec.ts +65 -0
  165. package/src/lib/codecs/TriggerCodec.ts +64 -0
  166. package/src/lib/codecs/ValueArrayCodec.ts +42 -0
  167. package/src/lib/codecs/ValueCodec.ts +2 -2
  168. package/src/lib/codecs/getNoteCodec.ts +27 -0
  169. package/src/lib/codecs/getSelectCodec.ts +27 -0
  170. package/src/lib/codecs/getSharedValueCodec.ts +5 -3
  171. package/src/lib/codecs/items/BaseItemCodec.ts +20 -0
  172. package/src/lib/codecs/items/MultipleValueItemCodec.ts +28 -0
  173. package/src/lib/codecs/items/SingleValueItemCodec.ts +67 -0
  174. package/src/lib/dom/query.ts +1 -2
  175. package/src/lib/names/NamespaceDeclaration.ts +106 -0
  176. package/src/lib/names/NamespaceDeclarationMap.ts +228 -0
  177. package/src/lib/names/NamespaceURL.ts +44 -0
  178. package/src/lib/names/QualifiedName.ts +170 -0
  179. package/src/lib/number-parsers.ts +25 -0
  180. package/src/lib/reactivity/createInstanceValueState.ts +50 -0
  181. package/src/lib/reactivity/{createSelectItems.ts → createItemCollection.ts} +41 -36
  182. package/src/lib/xml-serialization.ts +76 -9
  183. package/src/parse/XFormDOM.ts +141 -21
  184. package/src/parse/XFormDefinition.ts +1 -4
  185. package/src/parse/body/BodyDefinition.ts +4 -4
  186. package/src/parse/body/appearance/rangeAppearanceParser.ts +11 -0
  187. package/src/parse/body/control/InputControlDefinition.ts +9 -0
  188. package/src/parse/body/control/{select/ItemDefinition.ts → ItemDefinition.ts} +8 -6
  189. package/src/parse/body/control/{select/ItemsetDefinition.ts → ItemsetDefinition.ts} +11 -9
  190. package/src/parse/body/control/RangeControlDefinition.ts +91 -6
  191. package/src/parse/body/control/RankControlDefinition.ts +25 -7
  192. package/src/parse/body/control/{select/SelectDefinition.ts → SelectControlDefinition.ts} +9 -9
  193. package/src/parse/expression/ItemsetNodesetExpression.ts +1 -1
  194. package/src/parse/expression/ItemsetValueExpression.ts +1 -1
  195. package/src/parse/model/BindDefinition.ts +4 -0
  196. package/src/parse/model/BindPreloadDefinition.ts +100 -0
  197. package/src/parse/model/DescendentNodeDefinition.ts +7 -25
  198. package/src/parse/model/ItextTranslation/ItextTranslationRootDefinition.ts +2 -1
  199. package/src/parse/model/LeafNodeDefinition.ts +11 -4
  200. package/src/parse/model/NodeDefinition.ts +24 -45
  201. package/src/parse/model/NoteNodeDefinition.ts +8 -7
  202. package/src/parse/model/RangeNodeDefinition.ts +118 -0
  203. package/src/parse/model/RepeatInstanceDefinition.ts +11 -7
  204. package/src/parse/model/RepeatRangeDefinition.ts +11 -7
  205. package/src/parse/model/RepeatTemplateDefinition.ts +11 -7
  206. package/src/parse/model/RootAttributeDefinition.ts +45 -0
  207. package/src/parse/model/RootAttributeMap.ts +44 -0
  208. package/src/parse/model/RootDefinition.ts +29 -28
  209. package/src/parse/model/SecondaryInstance/sources/GeoJSONExternalSecondaryInstance.ts +1 -0
  210. package/src/parse/model/SubtreeDefinition.ts +12 -12
  211. package/src/parse/shared/parseStaticDocumentFromDOMSubtree.ts +3 -3
  212. package/src/parse/text/ItemLabelDefinition.ts +1 -1
  213. package/src/parse/text/ItemsetLabelDefinition.ts +2 -2
  214. package/src/parse/text/abstract/TextElementDefinition.ts +1 -1
  215. package/src/parse/xpath/semantic-analysis.ts +4 -3
  216. package/dist/client/unsupported/RangeNode.d.ts +0 -9
  217. package/dist/client/unsupported/RankNode.d.ts +0 -9
  218. package/dist/instance/SelectField.d.ts +0 -58
  219. package/dist/instance/unsupported/RangeControl.d.ts +0 -6
  220. package/dist/instance/unsupported/RankControl.d.ts +0 -6
  221. package/dist/integration/xpath/static-dom/StaticNamedNode.d.ts +0 -17
  222. package/dist/lib/reactivity/createSelectItems.d.ts +0 -16
  223. package/dist/parse/body/control/select/ItemDefinition.d.ts +0 -13
  224. package/dist/parse/body/control/select/ItemsetDefinition.d.ts +0 -17
  225. package/dist/parse/body/control/select/ItemsetNodesetContext.d.ts +0 -9
  226. package/src/client/unsupported/RangeNode.ts +0 -14
  227. package/src/client/unsupported/RankNode.ts +0 -14
  228. package/src/instance/SelectField.ts +0 -263
  229. package/src/instance/unsupported/RangeControl.ts +0 -9
  230. package/src/instance/unsupported/RankControl.ts +0 -9
  231. package/src/integration/xpath/static-dom/StaticNamedNode.ts +0 -45
  232. package/src/parse/body/control/select/ItemsetNodesetContext.ts +0 -21
package/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
  Implementation of the [ODK XForms specification](https://getodk.github.io/xforms-spec/)'s data model and computation logic. This package does not handle presentation or user interaction. Those aspects of forms are meant to be handled by a client. Presently, those clients are:
4
4
 
5
5
  - [`@getodk/web-forms`](../web-forms)
6
- - [`@getodk/ui-solid`](../ui-solid)
6
+ - [`@getodk/scenario`](../scenario)
7
7
 
8
8
  ## Install
9
9
 
@@ -133,6 +133,10 @@ export interface BaseNode {
133
133
  * @see {@link TokenListParser} for details.
134
134
  */
135
135
  readonly appearances: NodeAppearances<any> | null;
136
+ /**
137
+ * A node can have options that determine its behavior.
138
+ */
139
+ readonly nodeOptions: object | null;
136
140
  /**
137
141
  * Each node has a definition which specifies aspects of the node defined in
138
142
  * the form. These aspects include (but are not limited to) the node's data
@@ -6,7 +6,7 @@ import { LeafNodeValidationState } from './validation.ts';
6
6
  import { ValueType } from './ValueType.ts';
7
7
  export interface BaseValueNodeState<Value> extends BaseNodeState {
8
8
  get children(): null;
9
- get valueOptions(): null;
9
+ get valueOptions(): unknown;
10
10
  get value(): Value;
11
11
  /**
12
12
  * Reflects the serialized string representation of a {@link BaseValueNode}'s
@@ -21,6 +21,7 @@ export type GroupNodeAppearances = NodeAppearances<GroupDefinition>;
21
21
  export interface GroupNode extends BaseNode {
22
22
  readonly nodeType: 'group';
23
23
  readonly appearances: GroupNodeAppearances;
24
+ readonly nodeOptions: null;
24
25
  readonly definition: GroupDefinition;
25
26
  readonly root: RootNode;
26
27
  readonly parent: GeneralParentNode;
@@ -24,15 +24,39 @@ export interface InputDefinition<V extends ValueType = ValueType> extends LeafNo
24
24
  readonly bodyElement: InputControlDefinition;
25
25
  }
26
26
  export type InputNodeAppearances = NodeAppearances<InputDefinition>;
27
+ interface StringInputNodeOptions {
28
+ readonly rows: number | null;
29
+ }
30
+ interface GeoInputNodeOptions {
31
+ readonly accuracyThreshold: number | null;
32
+ readonly unacceptableAccuracyThreshold: number | null;
33
+ }
34
+ interface InputNodeOptionsByValueType {
35
+ readonly string: StringInputNodeOptions;
36
+ readonly int: null;
37
+ readonly boolean: null;
38
+ readonly decimal: null;
39
+ readonly date: null;
40
+ readonly time: null;
41
+ readonly dateTime: null;
42
+ readonly geopoint: GeoInputNodeOptions;
43
+ readonly geotrace: GeoInputNodeOptions;
44
+ readonly geoshape: GeoInputNodeOptions;
45
+ readonly binary: null;
46
+ readonly barcode: null;
47
+ readonly intent: null;
48
+ }
49
+ export type InputNodeOptions<V extends ValueType> = InputNodeOptionsByValueType[V];
27
50
  /**
28
51
  * A node corresponding to form field defined as an
29
52
  * {@link https://getodk.github.io/xforms-spec/#body-elements | XForms `<input>`},
30
- * which a user-facing client would likely present for a user to fill..
53
+ * which a user-facing client would likely present for a user to fill.
31
54
  */
32
55
  export interface InputNode<V extends ValueType = ValueType> extends BaseValueNode<V, InputValue<V>> {
33
56
  readonly nodeType: 'input';
34
57
  readonly valueType: V;
35
58
  readonly appearances: InputNodeAppearances;
59
+ readonly nodeOptions: InputNodeOptions<V>;
36
60
  readonly definition: InputDefinition<V>;
37
61
  readonly root: RootNode;
38
62
  readonly parent: GeneralParentNode;
@@ -43,11 +67,16 @@ export interface InputNode<V extends ValueType = ValueType> extends BaseValueNod
43
67
  */
44
68
  setValue(value: InputNodeInputValue<V>): RootNode;
45
69
  }
70
+ export type StringInputValue = InputValue<'string'>;
71
+ export type IntInputValue = InputValue<'int'>;
72
+ export type DecimalInputValue = InputValue<'decimal'>;
73
+ export type GeopointInputValue = InputValue<'geopoint'>;
46
74
  export type StringInputNode = InputNode<'string'>;
47
75
  export type IntInputNode = InputNode<'int'>;
48
76
  export type DecimalInputNode = InputNode<'decimal'>;
49
- type SupportedInputValueType = 'string' | 'int' | 'decimal';
77
+ export type GeopointInputNode = InputNode<'geopoint'>;
78
+ type SupportedInputValueType = 'string' | 'int' | 'decimal' | 'geopoint';
50
79
  type TemporaryStringValueType = Exclude<ValueType, SupportedInputValueType>;
51
80
  export type TemporaryStringValueInputNode = InputNode<TemporaryStringValueType>;
52
- export type AnyInputNode = StringInputNode | IntInputNode | DecimalInputNode | TemporaryStringValueInputNode;
81
+ export type AnyInputNode = StringInputNode | IntInputNode | DecimalInputNode | GeopointInputNode | TemporaryStringValueInputNode;
53
82
  export {};
@@ -32,6 +32,7 @@ export interface ModelValueNode<V extends ValueType = ValueType> extends BaseVal
32
32
  readonly nodeType: 'model-value';
33
33
  readonly valueType: V;
34
34
  readonly appearances: null;
35
+ readonly nodeOptions: null;
35
36
  readonly definition: ModelValueDefinition<V>;
36
37
  readonly root: RootNode;
37
38
  readonly parent: GeneralParentNode;
@@ -1,12 +1,15 @@
1
+ import { NoteRuntimeValue } from '../lib/codecs/NoteCodec.ts';
1
2
  import { InputControlDefinition } from '../parse/body/control/InputControlDefinition.ts';
2
3
  import { LeafNodeDefinition } from '../parse/model/LeafNodeDefinition.ts';
3
- import { BaseNode, BaseNodeState } from './BaseNode.ts';
4
+ import { BaseValueNode, BaseValueNodeState } from './BaseValueNode.ts';
4
5
  import { GeneralParentNode } from './hierarchy.ts';
5
6
  import { NodeAppearances } from './NodeAppearances.ts';
6
7
  import { RootNode } from './RootNode.ts';
7
8
  import { TextRange } from './TextRange.ts';
8
9
  import { LeafNodeValidationState } from './validation.ts';
9
- export interface NoteNodeState extends BaseNodeState {
10
+ import { ValueType } from './ValueType.ts';
11
+ export type NoteValue<V extends ValueType> = NoteRuntimeValue<V>;
12
+ export interface NoteNodeState<V extends ValueType> extends BaseValueNodeState<NoteValue<V>> {
10
13
  /**
11
14
  * Note-specific specialization: a note will always have a non-null value in
12
15
  * at least one of:
@@ -29,9 +32,9 @@ export interface NoteNodeState extends BaseNodeState {
29
32
  /**
30
33
  * Reflects the readonly value of a {@link NoteNode}, or `null` if blank.
31
34
  */
32
- get value(): string | null;
35
+ get value(): NoteValue<V>;
33
36
  }
34
- export interface NoteDefinition extends LeafNodeDefinition {
37
+ export interface NoteDefinition<V extends ValueType = ValueType> extends LeafNodeDefinition<V> {
35
38
  readonly bodyElement: InputControlDefinition;
36
39
  }
37
40
  export type NoteNodeAppearances = NodeAppearances<NoteDefinition>;
@@ -41,12 +44,26 @@ export type NoteNodeAppearances = NodeAppearances<NoteDefinition>;
41
44
  * - associated with an input, with at least one text element (label or hint)
42
45
  * - guaranteed to be {@link NoteNodeState.readonly | readonly}
43
46
  */
44
- export interface NoteNode extends BaseNode {
47
+ export interface NoteNode<V extends ValueType = ValueType> extends BaseValueNode<V, NoteValue<V>> {
45
48
  readonly nodeType: 'note';
46
49
  readonly appearances: NoteNodeAppearances;
47
- readonly definition: NoteDefinition;
50
+ readonly nodeOptions: null;
51
+ readonly definition: NoteDefinition<V>;
48
52
  readonly root: RootNode;
49
53
  readonly parent: GeneralParentNode;
50
- readonly currentState: NoteNodeState;
54
+ readonly currentState: NoteNodeState<V>;
51
55
  readonly validationState: LeafNodeValidationState;
52
56
  }
57
+ export type StringNoteValue = NoteValue<'string'>;
58
+ export type IntNoteValue = NoteValue<'int'>;
59
+ export type DecimalNoteValue = NoteValue<'decimal'>;
60
+ export type GeopointNoteValue = NoteValue<'geopoint'>;
61
+ export type StringNoteNode = NoteNode<'string'>;
62
+ export type IntNoteNode = NoteNode<'int'>;
63
+ export type DecimalNoteNode = NoteNode<'decimal'>;
64
+ export type GeopointNoteNode = NoteNode<'geopoint'>;
65
+ type SupportedNoteValueType = 'string' | 'int' | 'decimal' | 'geopoint';
66
+ type TemporaryStringValueType = Exclude<ValueType, SupportedNoteValueType>;
67
+ export type TemporaryStringValueNoteNode = NoteNode<TemporaryStringValueType>;
68
+ export type AnyNoteNode = StringNoteNode | IntNoteNode | DecimalNoteNode | GeopointNoteNode | TemporaryStringValueNoteNode;
69
+ export {};
@@ -0,0 +1,36 @@
1
+ import { RuntimeInputValue, RuntimeValue } from '../lib/codecs/getSharedValueCodec.ts';
2
+ import { RangeNodeDefinition, RangeValueType } from '../parse/model/RangeNodeDefinition.ts';
3
+ import { BaseValueNode, BaseValueNodeState } from './BaseValueNode.ts';
4
+ import { NodeAppearances } from './NodeAppearances.ts';
5
+ import { RootNode } from './RootNode.ts';
6
+ import { GeneralParentNode } from './hierarchy.ts';
7
+ import { LeafNodeValidationState } from './validation.ts';
8
+ export type { RangeValueType };
9
+ export type RangeValue<V extends RangeValueType> = RuntimeValue<V>;
10
+ export type RangeInputValue<V extends RangeValueType> = RuntimeInputValue<V>;
11
+ export interface RangeNodeState<V extends RangeValueType> extends BaseValueNodeState<RangeValue<V>> {
12
+ get valueOptions(): null;
13
+ }
14
+ export type RangeNodeAppearances = NodeAppearances<RangeNodeDefinition>;
15
+ /**
16
+ * A node corresponding to form field defined as an
17
+ * {@link https://getodk.github.io/xforms-spec/#body-elements | XForms `<range>`}.
18
+ */
19
+ export interface RangeNode<V extends RangeValueType = RangeValueType> extends BaseValueNode<V, RangeValue<V>> {
20
+ readonly nodeType: 'range';
21
+ readonly valueType: V;
22
+ readonly appearances: RangeNodeAppearances;
23
+ readonly nodeOptions: null;
24
+ readonly definition: RangeNodeDefinition<V>;
25
+ readonly root: RootNode;
26
+ readonly parent: GeneralParentNode;
27
+ readonly currentState: RangeNodeState<V>;
28
+ readonly validationState: LeafNodeValidationState;
29
+ /**
30
+ * For use by a client to update the value of an {@link RangeNode}.
31
+ */
32
+ setValue(value: RangeInputValue<V>): RootNode;
33
+ }
34
+ export type IntRangeNode = RangeNode<'int'>;
35
+ export type DecimalRangeNode = RangeNode<'decimal'>;
36
+ export type AnyRangeNode = IntRangeNode | DecimalRangeNode;
@@ -0,0 +1,46 @@
1
+ import { RankControlDefinition } from '../parse/body/control/RankControlDefinition.ts';
2
+ import { LeafNodeDefinition } from '../parse/model/LeafNodeDefinition.ts';
3
+ import { BaseValueNode, BaseValueNodeState } from './BaseValueNode.ts';
4
+ import { RootNode } from './RootNode.ts';
5
+ import { TextRange } from './TextRange.ts';
6
+ import { GeneralParentNode } from './hierarchy.ts';
7
+ import { LeafNodeValidationState } from './validation.ts';
8
+ import { UnknownAppearanceDefinition } from '../parse/body/appearance/unknownAppearanceParser.ts';
9
+ import { ValueType } from './ValueType.ts';
10
+ export interface RankItem {
11
+ get label(): TextRange<'item-label'>;
12
+ get value(): string;
13
+ }
14
+ export type RankValueOptions = readonly RankItem[];
15
+ export interface RankNodeState extends BaseValueNodeState<readonly string[]> {
16
+ get valueOptions(): RankValueOptions;
17
+ /**
18
+ * An ordered collection of values from {@link RankItem}.
19
+ * The order of the items is important and must be preserved during processing.
20
+ */
21
+ get value(): readonly string[];
22
+ }
23
+ export interface RankDefinition<V extends ValueType = ValueType> extends LeafNodeDefinition<V> {
24
+ readonly bodyElement: RankControlDefinition;
25
+ }
26
+ export interface RankNode extends BaseValueNode<'string', readonly string[]> {
27
+ readonly nodeType: 'rank';
28
+ readonly appearances: UnknownAppearanceDefinition;
29
+ readonly nodeOptions: null;
30
+ readonly valueType: 'string';
31
+ readonly definition: RankDefinition<'string'>;
32
+ readonly root: RootNode;
33
+ readonly parent: GeneralParentNode;
34
+ readonly currentState: RankNodeState;
35
+ readonly validationState: LeafNodeValidationState;
36
+ /**
37
+ * Convenience API to get the {@link RankItem}'s label.
38
+ */
39
+ getValueLabel(value: string): TextRange<'item-label'> | null;
40
+ /**
41
+ * Set the value which is an ordered collection of values from {@link RankItem}.
42
+ * Calling this setter replaces the currently value.
43
+ * If called with an empty array, the current is cleared.
44
+ */
45
+ setValues(values: readonly string[]): RootNode;
46
+ }
@@ -3,8 +3,8 @@ import { RootDefinition } from '../parse/model/RootDefinition.ts';
3
3
  import { BaseNode, BaseNodeState } from './BaseNode.ts';
4
4
  import { ActiveLanguage, FormLanguage, FormLanguages } from './FormLanguage.ts';
5
5
  import { GeneralChildNode } from './hierarchy.ts';
6
- import { SubmissionChunkedType, SubmissionOptions } from './submission/SubmissionOptions.ts';
7
- import { SubmissionResult } from './submission/SubmissionResult.ts';
6
+ import { SubmissionOptions } from './submission/SubmissionOptions.ts';
7
+ import { ChunkedSubmissionResult, MonolithicSubmissionResult } from './submission/SubmissionResult.ts';
8
8
  import { AncestorNodeValidationState } from './validation.ts';
9
9
  export interface RootNodeState extends BaseNodeState {
10
10
  /**
@@ -24,6 +24,7 @@ export interface RootNode extends BaseNode {
24
24
  * @todo this along with {@link classes} is... awkward.
25
25
  */
26
26
  readonly appearances: null;
27
+ readonly nodeOptions: null;
27
28
  /**
28
29
  * @todo This is another odd deviation in {@link RootNode}. Unlike
29
30
  * {@link languages}, it doesn't feel particularly **essential**. While it
@@ -75,5 +76,7 @@ export interface RootNode extends BaseNode {
75
76
  * A client may specify {@link SubmissionOptions<'chunked'>}, in which case a
76
77
  * {@link SubmissionResult<'chunked'>} will be produced, with form attachments
77
78
  */
78
- prepareSubmission<ChunkedType extends SubmissionChunkedType>(options?: SubmissionOptions<ChunkedType>): Promise<SubmissionResult<ChunkedType>>;
79
+ prepareSubmission(): Promise<MonolithicSubmissionResult>;
80
+ prepareSubmission(options: SubmissionOptions<'monolithic'>): Promise<MonolithicSubmissionResult>;
81
+ prepareSubmission(options: SubmissionOptions<'chunked'>): Promise<ChunkedSubmissionResult>;
79
82
  }
@@ -1,20 +1,19 @@
1
- import { AnySelectDefinition } from '../parse/body/control/select/SelectDefinition.ts';
1
+ import { AnySelectControlDefinition, SelectType } from '../parse/body/control/SelectControlDefinition.ts';
2
2
  import { LeafNodeDefinition } from '../parse/model/LeafNodeDefinition.ts';
3
- import { BaseNode, BaseNodeState } from './BaseNode.ts';
3
+ import { BaseValueNode, BaseValueNodeState } from './BaseValueNode.ts';
4
4
  import { NodeAppearances } from './NodeAppearances.ts';
5
5
  import { RootNode } from './RootNode.ts';
6
6
  import { TextRange } from './TextRange.ts';
7
+ import { ValueType } from './ValueType.ts';
7
8
  import { GeneralParentNode } from './hierarchy.ts';
8
9
  import { LeafNodeValidationState } from './validation.ts';
9
10
  export interface SelectItem {
11
+ get label(): TextRange<'item-label'>;
10
12
  get value(): string;
11
- get label(): TextRange<'item-label'> | null;
12
13
  }
13
- export interface SelectNodeState extends BaseNodeState {
14
+ export type SelectValueOptions = readonly SelectItem[];
15
+ export interface SelectNodeState extends BaseValueNodeState<readonly string[]> {
14
16
  get children(): null;
15
- /**
16
- * @todo should {@link BaseNodeState} include this??
17
- */
18
17
  get valueOptions(): readonly SelectItem[];
19
18
  /**
20
19
  * This value is treated as set-like by the engine, where each
@@ -28,38 +27,61 @@ export interface SelectNodeState extends BaseNodeState {
28
27
  * Should a `SelectNodeState` have this `value` type, whereas a hypothetical
29
28
  * `Select1NodeState` would have `get value(): SelectItem | null`?
30
29
  */
31
- get value(): readonly SelectItem[];
30
+ get value(): readonly string[];
32
31
  }
33
- export interface SelectDefinition extends LeafNodeDefinition {
34
- readonly bodyElement: AnySelectDefinition;
32
+ export interface SelectDefinition<V extends ValueType = ValueType> extends LeafNodeDefinition<V> {
33
+ readonly bodyElement: AnySelectControlDefinition;
35
34
  }
36
35
  export type SelectNodeAppearances = NodeAppearances<SelectDefinition>;
37
- export interface SelectNode extends BaseNode {
36
+ export interface SelectNode extends BaseValueNode<'string', readonly string[]> {
38
37
  readonly nodeType: 'select';
38
+ readonly valueType: 'string';
39
+ readonly selectType: SelectType;
39
40
  readonly appearances: SelectNodeAppearances;
40
- readonly definition: SelectDefinition;
41
+ readonly nodeOptions: null;
42
+ readonly definition: SelectDefinition<'string'>;
41
43
  readonly root: RootNode;
42
44
  readonly parent: GeneralParentNode;
43
45
  readonly currentState: SelectNodeState;
44
46
  readonly validationState: LeafNodeValidationState;
45
47
  /**
46
- * For use by a client to update the selection of a select node where:
48
+ * Convenience API to get the {@link SelectItem} which is associated with
49
+ * {@link value}, if one is currently available—i.e. if it is present in
50
+ * {@link SelectNodeState.valueOptions}.
51
+ */
52
+ getValueOption(value: string): SelectItem | null;
53
+ /**
54
+ * Convenience API to determine if {@link value} is currently selected—i.e. if
55
+ * it is one of the selected values in {@link SelectNodeState.value}.
56
+ */
57
+ isSelected(value: string): boolean;
58
+ /**
59
+ * Selects a single {@link value}, as provided by a {@link SelectItem.value}.
60
+ * Calling this setter replaces the currently selected value(s, if any),
61
+ * where:
47
62
  *
48
- * - For fields defined with an XForms `<select>`, calling this method is
49
- * additive, i.e. it will include the item in its
50
- * {@link SelectNodeState.value}.
51
- * - For fields defined with an XForms `<select1>`, calling this method will
52
- * replace the selection (if any).
63
+ * - if the provided value is `null`, the current selection is cleared; ELSE
64
+ * - the provided value is selected in place of any currently selected values.
53
65
  *
54
- * @todo @see {@link InputNode.setValue} re: write restrictions
55
- * @todo @see {@link SelectNodeState.value} re: breaking up the types
66
+ * This setter is most useful for {@link SelectNode}s associated with an
67
+ * XForms
68
+ * {@link https://getodk.github.io/xforms-spec/#body-elements | `<select1>`}
69
+ * control.
56
70
  */
57
- select(item: SelectItem): RootNode;
71
+ selectValue(value: string | null): RootNode;
58
72
  /**
59
- * For use by a client to remove an item from the node's
60
- * {@link SelectNodeState.value}.
73
+ * Selects any number of {@link values}, as provided by any number of
74
+ * {@link SelectItem.value}s. Calling this setter replaces the currently
75
+ * selected value(s, if any). If called with an empty array, the current
76
+ * selection is cleared.
77
+ *
78
+ * This setter is most useful for {@link SelectNode}s associated with an
79
+ * XForms
80
+ * {@link https://getodk.github.io/xforms-spec/#body-elements | `<select>`}
81
+ * control.
61
82
  *
62
- * @todo @see {@link InputNode.setValue} re: write restrictions
83
+ * This setter _may_ be used with a `<select1>` control, in which case the
84
+ * provided {@link values} should produce at most one value.
63
85
  */
64
- deselect(item: SelectItem): RootNode;
86
+ selectValues(values: readonly string[]): RootNode;
65
87
  }
@@ -47,6 +47,7 @@ export interface SubtreeDefinition extends BaseSubtreeDefinition {
47
47
  export interface SubtreeNode extends BaseNode {
48
48
  readonly nodeType: 'subtree';
49
49
  readonly appearances: null;
50
+ readonly nodeOptions: null;
50
51
  readonly definition: SubtreeDefinition;
51
52
  readonly root: RootNode;
52
53
  readonly parent: GeneralParentNode;
@@ -1,22 +1,26 @@
1
+ import { TriggerRuntimeValue, TriggerValueType } from '../lib/codecs/TriggerCodec.ts';
1
2
  import { UnknownAppearanceDefinition } from '../parse/body/appearance/unknownAppearanceParser.ts';
2
3
  import { TriggerControlDefinition } from '../parse/body/control/TriggerControlDefinition.ts';
3
4
  import { LeafNodeDefinition } from '../parse/model/LeafNodeDefinition.ts';
4
- import { BaseNode, BaseNodeState } from './BaseNode.ts';
5
+ import { BaseValueNode, BaseValueNodeState } from './BaseValueNode.ts';
5
6
  import { GeneralParentNode } from './hierarchy.ts';
6
7
  import { RootNode } from './RootNode.ts';
7
8
  import { LeafNodeValidationState } from './validation.ts';
8
- export interface TriggerNodeState extends BaseNodeState {
9
+ import { ValueType } from './ValueType.ts';
10
+ export type TriggerValue = TriggerRuntimeValue;
11
+ export interface TriggerNodeState extends BaseValueNodeState<TriggerValue> {
9
12
  get children(): null;
10
13
  get valueOptions(): null;
11
- get value(): boolean;
14
+ get value(): TriggerValue;
12
15
  }
13
- export interface TriggerNodeDefinition extends LeafNodeDefinition {
16
+ export interface TriggerNodeDefinition<V extends ValueType = ValueType> extends LeafNodeDefinition<V> {
14
17
  readonly bodyElement: TriggerControlDefinition;
15
18
  }
16
- export interface TriggerNode extends BaseNode {
19
+ export interface TriggerNode extends BaseValueNode<TriggerValueType, TriggerValue> {
17
20
  readonly nodeType: 'trigger';
18
- readonly definition: TriggerNodeDefinition;
21
+ readonly definition: TriggerNodeDefinition<TriggerValueType>;
19
22
  readonly appearances: UnknownAppearanceDefinition;
23
+ readonly nodeOptions: null;
20
24
  readonly root: RootNode;
21
25
  readonly parent: GeneralParentNode;
22
26
  readonly currentState: TriggerNodeState;
@@ -2,7 +2,8 @@ import { ExpandUnion } from '../../../common/types/helpers.d.ts';
2
2
  import { GroupNode } from './GroupNode.ts';
3
3
  import { AnyInputNode } from './InputNode.ts';
4
4
  import { AnyModelValueNode } from './ModelValueNode.ts';
5
- import { NoteNode } from './NoteNode.ts';
5
+ import { AnyNoteNode } from './NoteNode.ts';
6
+ import { AnyRangeNode } from './RangeNode.ts';
6
7
  import { RepeatInstanceNode } from './repeat/RepeatInstanceNode.ts';
7
8
  import { RepeatRangeControlledNode } from './repeat/RepeatRangeControlledNode.ts';
8
9
  import { RepeatRangeUncontrolledNode } from './repeat/RepeatRangeUncontrolledNode.ts';
@@ -10,11 +11,10 @@ import { RootNode } from './RootNode.ts';
10
11
  import { SelectNode } from './SelectNode.ts';
11
12
  import { SubtreeNode } from './SubtreeNode.ts';
12
13
  import { TriggerNode } from './TriggerNode.ts';
13
- import { RangeNode } from './unsupported/RangeNode.ts';
14
- import { RankNode } from './unsupported/RankNode.ts';
14
+ import { RankNode } from './RankNode.ts';
15
15
  import { UploadNode } from './unsupported/UploadNode.ts';
16
- export type AnyUnsupportedControlNode = RangeNode | RankNode | UploadNode;
17
- export type AnyControlNode = AnyInputNode | NoteNode | SelectNode | TriggerNode;
16
+ export type AnyUnsupportedControlNode = UploadNode;
17
+ export type AnyControlNode = AnyInputNode | AnyNoteNode | AnyRangeNode | RankNode | SelectNode | TriggerNode;
18
18
  export type AnyLeafNode = AnyControlNode | AnyModelValueNode | AnyUnsupportedControlNode;
19
19
  export type RepeatRangeNode = RepeatRangeControlledNode | RepeatRangeUncontrolledNode;
20
20
  /**
@@ -1,4 +1,4 @@
1
- export type UnsupportedControlNodeType = 'range' | 'rank' | 'upload';
1
+ export type UnsupportedControlNodeType = 'rank' | 'upload';
2
2
  export type RepeatRangeNodeType = 'repeat-range:controlled' | 'repeat-range:uncontrolled';
3
- export type LeafNodeType = 'model-value' | 'note' | 'select' | 'input' | 'trigger' | UnsupportedControlNodeType;
3
+ export type LeafNodeType = 'model-value' | 'note' | 'select' | 'input' | 'trigger' | 'range' | UnsupportedControlNodeType;
4
4
  export type InstanceNodeType = 'root' | RepeatRangeNodeType | 'repeat-instance' | 'group' | 'subtree' | LeafNodeType | UnsupportedControlNodeType;
@@ -1,6 +1,4 @@
1
1
  import { UnknownAppearanceDefinition } from '../../parse/body/appearance/unknownAppearanceParser.ts';
2
- import { RangeControlDefinition } from '../../parse/body/control/RangeControlDefinition.ts';
3
- import { RankControlDefinition } from '../../parse/body/control/RankControlDefinition.ts';
4
2
  import { UploadControlDefinition } from '../../parse/body/control/UploadControlDefinition.ts';
5
3
  import { LeafNodeDefinition } from '../../parse/model/LeafNodeDefinition.ts';
6
4
  import { BaseNode, BaseNodeState } from '../BaseNode.ts';
@@ -13,7 +11,7 @@ export interface UnsupportedControlNodeState extends BaseNodeState {
13
11
  get valueOptions(): unknown;
14
12
  get value(): unknown;
15
13
  }
16
- export type UnsupportedControlElementDefinition = RangeControlDefinition | RankControlDefinition | UploadControlDefinition;
14
+ export type UnsupportedControlElementDefinition = UploadControlDefinition;
17
15
  export interface UnsupportedControlDefinition extends LeafNodeDefinition {
18
16
  readonly bodyElement: UnsupportedControlElementDefinition;
19
17
  }
@@ -0,0 +1,3 @@
1
+ export declare class RankMissingValueError extends Error {
2
+ constructor(message: string);
3
+ }
@@ -0,0 +1,6 @@
1
+ import { XFormsSpecViolationError } from './XFormsSpecViolationError.ts';
2
+ import { RankDefinition } from '../client/RankNode.ts';
3
+ import { UnsupportedBaseItemValueType } from '../lib/codecs/items/BaseItemCodec.ts';
4
+ export declare class RankValueTypeError extends XFormsSpecViolationError {
5
+ constructor(definition: RankDefinition<UnsupportedBaseItemValueType>);
6
+ }
@@ -0,0 +1,15 @@
1
+ import { SelectDefinition } from '../client/SelectNode.ts';
2
+ import { UnsupportedBaseItemValueType } from '../lib/codecs/items/BaseItemCodec.ts';
3
+ import { XFormsSpecViolationError } from './XFormsSpecViolationError.ts';
4
+ /**
5
+ * @todo It would be good to have a standardized way to use specific types of
6
+ * errors as a prompt for feedback. There is currently a feedback link presented
7
+ * by `@getodk/web-forms`, which is conditionally displayed (condition is
8
+ * evidently controlled by a
9
+ * {@link https://vuejs.org/api/sfc-script-setup#defineoptions | Vue component option}).
10
+ *
11
+ * @see {@link https://github.com/getodk/web-forms/issues/276}
12
+ */
13
+ export declare class SelectValueTypeError extends XFormsSpecViolationError {
14
+ constructor(definition: SelectDefinition<UnsupportedBaseItemValueType>);
15
+ }
@@ -0,0 +1,2 @@
1
+ export declare abstract class XFormsSpecViolationError extends Error {
2
+ }
package/dist/index.d.ts CHANGED
@@ -11,6 +11,7 @@ export type * from './client/InputNode.ts';
11
11
  export type * from './client/ModelValueNode.ts';
12
12
  export type * from './client/NoteNode.ts';
13
13
  export type * from './client/OpaqueReactiveObjectFactory.ts';
14
+ export type * from './client/RangeNode.ts';
14
15
  export type * from './client/repeat/RepeatInstanceNode.ts';
15
16
  export type * from './client/repeat/RepeatRangeControlledNode.ts';
16
17
  export type * from './client/repeat/RepeatRangeUncontrolledNode.ts';
@@ -26,9 +27,7 @@ export type * from './client/submission/SubmissionState.ts';
26
27
  export type * from './client/SubtreeNode.ts';
27
28
  export type * from './client/TextRange.ts';
28
29
  export type * from './client/TriggerNode.ts';
29
- export type * from './client/unsupported/RangeNode.ts';
30
- export type * from './client/unsupported/RankNode.ts';
30
+ export type * from './client/RankNode.ts';
31
31
  export type * from './client/unsupported/UploadNode.ts';
32
32
  export type * from './client/validation.ts';
33
33
  export type * from './client/ValueType.ts';
34
- export type { AnySelectDefinition, SelectDefinition, } from './parse/body/control/select/SelectDefinition.ts';