@getodk/xforms-engine 0.1.1 → 0.3.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 (228) hide show
  1. package/dist/body/BodyDefinition.d.ts +24 -7
  2. package/dist/body/BodyElementDefinition.d.ts +4 -3
  3. package/dist/body/RepeatElementDefinition.d.ts +19 -0
  4. package/dist/body/appearance/inputAppearanceParser.d.ts +4 -0
  5. package/dist/body/appearance/selectAppearanceParser.d.ts +4 -0
  6. package/dist/body/appearance/structureElementAppearanceParser.d.ts +4 -0
  7. package/dist/body/control/ControlDefinition.d.ts +4 -2
  8. package/dist/body/control/InputDefinition.d.ts +5 -0
  9. package/dist/body/control/select/ItemDefinition.d.ts +2 -2
  10. package/dist/body/control/select/ItemsetDefinition.d.ts +5 -4
  11. package/dist/body/control/select/SelectDefinition.d.ts +11 -1
  12. package/dist/body/group/BaseGroupDefinition.d.ts +4 -9
  13. package/dist/body/group/PresentationGroupDefinition.d.ts +1 -1
  14. package/dist/client/BaseNode.d.ts +74 -3
  15. package/dist/client/GroupNode.d.ts +7 -2
  16. package/dist/client/ModelValueNode.d.ts +37 -0
  17. package/dist/client/NodeAppearances.d.ts +15 -0
  18. package/dist/client/NoteNode.d.ts +53 -0
  19. package/dist/client/RootNode.d.ts +21 -0
  20. package/dist/client/SelectNode.d.ts +8 -3
  21. package/dist/client/StringNode.d.ts +8 -3
  22. package/dist/client/SubtreeNode.d.ts +3 -0
  23. package/dist/client/TextRange.d.ts +85 -2
  24. package/dist/client/constants.d.ts +9 -0
  25. package/dist/client/hierarchy.d.ts +14 -9
  26. package/dist/client/node-types.d.ts +2 -1
  27. package/dist/client/{RepeatRangeNode.d.ts → repeat/BaseRepeatRangeNode.d.ts} +19 -15
  28. package/dist/client/{RepeatInstanceNode.d.ts → repeat/RepeatInstanceNode.d.ts} +11 -7
  29. package/dist/client/repeat/RepeatRangeControlledNode.d.ts +19 -0
  30. package/dist/client/repeat/RepeatRangeUncontrolledNode.d.ts +20 -0
  31. package/dist/client/validation.d.ts +163 -0
  32. package/dist/expression/DependentExpression.d.ts +12 -8
  33. package/dist/index.d.ts +9 -4
  34. package/dist/index.js +3173 -960
  35. package/dist/index.js.map +1 -1
  36. package/dist/instance/Group.d.ts +6 -4
  37. package/dist/instance/ModelValue.d.ts +40 -0
  38. package/dist/instance/Note.d.ts +42 -0
  39. package/dist/instance/Root.d.ts +10 -23
  40. package/dist/instance/SelectField.d.ts +12 -6
  41. package/dist/instance/StringField.d.ts +13 -7
  42. package/dist/instance/Subtree.d.ts +3 -1
  43. package/dist/instance/abstract/DescendantNode.d.ts +16 -9
  44. package/dist/instance/abstract/InstanceNode.d.ts +28 -29
  45. package/dist/instance/hierarchy.d.ts +10 -5
  46. package/dist/instance/internal-api/EvaluationContext.d.ts +5 -4
  47. package/dist/instance/internal-api/ValidationContext.d.ts +21 -0
  48. package/dist/instance/internal-api/ValueContext.d.ts +2 -2
  49. package/dist/instance/repeat/BaseRepeatRange.d.ts +160 -0
  50. package/dist/instance/{RepeatInstance.d.ts → repeat/RepeatInstance.d.ts} +38 -13
  51. package/dist/instance/repeat/RepeatRangeControlled.d.ts +16 -0
  52. package/dist/instance/repeat/RepeatRangeUncontrolled.d.ts +35 -0
  53. package/dist/instance/text/TextRange.d.ts +4 -4
  54. package/dist/lib/TokenListParser.d.ts +84 -0
  55. package/dist/lib/dom/query.d.ts +5 -0
  56. package/dist/lib/reactivity/createComputedExpression.d.ts +6 -1
  57. package/dist/lib/reactivity/createNoteReadonlyThunk.d.ts +5 -0
  58. package/dist/lib/reactivity/materializeCurrentStateChildren.d.ts +2 -1
  59. package/dist/lib/reactivity/node-state/createSharedNodeState.d.ts +1 -1
  60. package/dist/lib/reactivity/node-state/createSpecifiedState.d.ts +1 -1
  61. package/dist/lib/reactivity/text/createFieldHint.d.ts +3 -3
  62. package/dist/lib/reactivity/text/createNodeLabel.d.ts +2 -2
  63. package/dist/lib/reactivity/text/createNoteText.d.ts +25 -0
  64. package/dist/lib/reactivity/text/createTextRange.d.ts +5 -7
  65. package/dist/lib/reactivity/validation/createAggregatedViolations.d.ts +9 -0
  66. package/dist/lib/reactivity/validation/createValidation.d.ts +18 -0
  67. package/dist/model/BindDefinition.d.ts +4 -2
  68. package/dist/model/BindElement.d.ts +1 -0
  69. package/dist/model/DescendentNodeDefinition.d.ts +1 -2
  70. package/dist/model/{ValueNodeDefinition.d.ts → LeafNodeDefinition.d.ts} +3 -4
  71. package/dist/model/NodeDefinition.d.ts +16 -16
  72. package/dist/model/RepeatInstanceDefinition.d.ts +5 -6
  73. package/dist/model/RepeatRangeDefinition.d.ts +30 -0
  74. package/dist/model/RepeatTemplateDefinition.d.ts +6 -7
  75. package/dist/model/RootDefinition.d.ts +3 -1
  76. package/dist/model/SubtreeDefinition.d.ts +2 -2
  77. package/dist/parse/NoteNodeDefinition.d.ts +31 -0
  78. package/dist/parse/expression/RepeatCountControlExpression.d.ts +19 -0
  79. package/dist/parse/text/HintDefinition.d.ts +9 -0
  80. package/dist/parse/text/ItemLabelDefinition.d.ts +9 -0
  81. package/dist/parse/text/ItemsetLabelDefinition.d.ts +13 -0
  82. package/dist/parse/text/LabelDefinition.d.ts +15 -0
  83. package/dist/parse/text/MessageDefinition.d.ts +15 -0
  84. package/dist/parse/text/OutputChunkDefinition.d.ts +8 -0
  85. package/dist/parse/text/ReferenceChunkDefinition.d.ts +8 -0
  86. package/dist/parse/text/StaticTextChunkDefinition.d.ts +10 -0
  87. package/dist/parse/text/TranslationChunkDefinition.d.ts +9 -0
  88. package/dist/parse/text/abstract/TextChunkDefinition.d.ts +18 -0
  89. package/dist/parse/text/abstract/TextElementDefinition.d.ts +23 -0
  90. package/dist/parse/text/abstract/TextRangeDefinition.d.ts +35 -0
  91. package/dist/parse/xpath/dependency-analysis.d.ts +40 -0
  92. package/dist/parse/xpath/path-resolution.d.ts +70 -0
  93. package/dist/parse/xpath/predicate-analysis.d.ts +30 -0
  94. package/dist/parse/xpath/reference-parsing.d.ts +18 -0
  95. package/dist/parse/xpath/semantic-analysis.d.ts +98 -0
  96. package/dist/parse/xpath/syntax-traversal.d.ts +69 -0
  97. package/dist/solid.js +3174 -961
  98. package/dist/solid.js.map +1 -1
  99. package/package.json +14 -15
  100. package/src/XFormDOM.ts +81 -8
  101. package/src/body/BodyDefinition.ts +38 -23
  102. package/src/body/BodyElementDefinition.ts +4 -3
  103. package/src/body/RepeatElementDefinition.ts +58 -0
  104. package/src/body/appearance/inputAppearanceParser.ts +39 -0
  105. package/src/body/appearance/selectAppearanceParser.ts +38 -0
  106. package/src/body/appearance/structureElementAppearanceParser.ts +7 -0
  107. package/src/body/control/ControlDefinition.ts +8 -3
  108. package/src/body/control/InputDefinition.ts +13 -0
  109. package/src/body/control/select/ItemDefinition.ts +3 -3
  110. package/src/body/control/select/ItemsetDefinition.ts +29 -12
  111. package/src/body/control/select/ItemsetNodesetExpression.ts +1 -1
  112. package/src/body/control/select/SelectDefinition.ts +14 -5
  113. package/src/body/group/BaseGroupDefinition.ts +14 -51
  114. package/src/body/group/PresentationGroupDefinition.ts +1 -1
  115. package/src/client/BaseNode.ts +82 -8
  116. package/src/client/GroupNode.ts +8 -2
  117. package/src/client/ModelValueNode.ts +40 -0
  118. package/src/client/NodeAppearances.ts +22 -0
  119. package/src/client/NoteNode.ts +74 -0
  120. package/src/client/README.md +1 -0
  121. package/src/client/RootNode.ts +24 -0
  122. package/src/client/SelectNode.ts +9 -3
  123. package/src/client/StringNode.ts +9 -3
  124. package/src/client/SubtreeNode.ts +3 -0
  125. package/src/client/TextRange.ts +99 -2
  126. package/src/client/constants.ts +10 -0
  127. package/src/client/hierarchy.ts +30 -14
  128. package/src/client/node-types.ts +8 -1
  129. package/src/client/{RepeatRangeNode.ts → repeat/BaseRepeatRangeNode.ts} +20 -17
  130. package/src/client/{RepeatInstanceNode.ts → repeat/RepeatInstanceNode.ts} +13 -7
  131. package/src/client/repeat/RepeatRangeControlledNode.ts +20 -0
  132. package/src/client/repeat/RepeatRangeUncontrolledNode.ts +21 -0
  133. package/src/client/validation.ts +199 -0
  134. package/src/expression/DependentExpression.ts +45 -27
  135. package/src/index.ts +15 -8
  136. package/src/instance/Group.ts +24 -13
  137. package/src/instance/ModelValue.ts +104 -0
  138. package/src/instance/Note.ts +142 -0
  139. package/src/instance/Root.ts +29 -67
  140. package/src/instance/SelectField.ts +35 -13
  141. package/src/instance/StringField.ts +40 -13
  142. package/src/instance/Subtree.ts +19 -10
  143. package/src/instance/abstract/DescendantNode.ts +50 -49
  144. package/src/instance/abstract/InstanceNode.ts +89 -92
  145. package/src/instance/children.ts +47 -10
  146. package/src/instance/hierarchy.ts +21 -2
  147. package/src/instance/index.ts +1 -1
  148. package/src/instance/internal-api/EvaluationContext.ts +5 -6
  149. package/src/instance/internal-api/ValidationContext.ts +23 -0
  150. package/src/instance/internal-api/ValueContext.ts +2 -2
  151. package/src/instance/repeat/BaseRepeatRange.ts +347 -0
  152. package/src/instance/{RepeatInstance.ts → repeat/RepeatInstance.ts} +85 -36
  153. package/src/instance/repeat/RepeatRangeControlled.ts +82 -0
  154. package/src/instance/repeat/RepeatRangeUncontrolled.ts +67 -0
  155. package/src/instance/text/TextRange.ts +10 -4
  156. package/src/lib/TokenListParser.ts +156 -0
  157. package/src/lib/dom/query.ts +13 -0
  158. package/src/lib/reactivity/createChildrenState.ts +51 -6
  159. package/src/lib/reactivity/createComputedExpression.ts +23 -25
  160. package/src/lib/reactivity/createNoteReadonlyThunk.ts +33 -0
  161. package/src/lib/reactivity/createSelectItems.ts +25 -20
  162. package/src/lib/reactivity/createValueState.ts +6 -6
  163. package/src/lib/reactivity/materializeCurrentStateChildren.ts +3 -1
  164. package/src/lib/reactivity/node-state/createSharedNodeState.ts +1 -1
  165. package/src/lib/reactivity/text/createFieldHint.ts +9 -7
  166. package/src/lib/reactivity/text/createNodeLabel.ts +7 -5
  167. package/src/lib/reactivity/text/createNoteText.ts +72 -0
  168. package/src/lib/reactivity/text/createTextRange.ts +17 -90
  169. package/src/lib/reactivity/validation/createAggregatedViolations.ts +70 -0
  170. package/src/lib/reactivity/validation/createValidation.ts +196 -0
  171. package/src/model/BindComputation.ts +0 -4
  172. package/src/model/BindDefinition.ts +8 -6
  173. package/src/model/BindElement.ts +1 -0
  174. package/src/model/DescendentNodeDefinition.ts +1 -2
  175. package/src/model/{ValueNodeDefinition.ts → LeafNodeDefinition.ts} +5 -6
  176. package/src/model/ModelBindMap.ts +4 -0
  177. package/src/model/ModelDefinition.ts +1 -1
  178. package/src/model/NodeDefinition.ts +21 -21
  179. package/src/model/RepeatInstanceDefinition.ts +8 -13
  180. package/src/model/RepeatRangeDefinition.ts +94 -0
  181. package/src/model/RepeatTemplateDefinition.ts +10 -15
  182. package/src/model/RootDefinition.ts +12 -14
  183. package/src/model/SubtreeDefinition.ts +3 -3
  184. package/src/parse/NoteNodeDefinition.ts +70 -0
  185. package/src/parse/TODO.md +3 -0
  186. package/src/parse/expression/RepeatCountControlExpression.ts +44 -0
  187. package/src/parse/text/HintDefinition.ts +25 -0
  188. package/src/parse/text/ItemLabelDefinition.ts +25 -0
  189. package/src/parse/text/ItemsetLabelDefinition.ts +44 -0
  190. package/src/parse/text/LabelDefinition.ts +61 -0
  191. package/src/parse/text/MessageDefinition.ts +49 -0
  192. package/src/parse/text/OutputChunkDefinition.ts +25 -0
  193. package/src/parse/text/ReferenceChunkDefinition.ts +14 -0
  194. package/src/parse/text/StaticTextChunkDefinition.ts +19 -0
  195. package/src/parse/text/TranslationChunkDefinition.ts +38 -0
  196. package/src/parse/text/abstract/TextChunkDefinition.ts +38 -0
  197. package/src/parse/text/abstract/TextElementDefinition.ts +71 -0
  198. package/src/parse/text/abstract/TextRangeDefinition.ts +70 -0
  199. package/src/parse/xpath/dependency-analysis.ts +105 -0
  200. package/src/parse/xpath/path-resolution.ts +475 -0
  201. package/src/parse/xpath/predicate-analysis.ts +61 -0
  202. package/src/parse/xpath/reference-parsing.ts +90 -0
  203. package/src/parse/xpath/semantic-analysis.ts +466 -0
  204. package/src/parse/xpath/syntax-traversal.ts +129 -0
  205. package/dist/body/RepeatDefinition.d.ts +0 -16
  206. package/dist/body/group/RepeatGroupDefinition.d.ts +0 -13
  207. package/dist/body/text/HintDefinition.d.ts +0 -11
  208. package/dist/body/text/LabelDefinition.d.ts +0 -20
  209. package/dist/body/text/TextElementDefinition.d.ts +0 -33
  210. package/dist/body/text/TextElementOutputPart.d.ts +0 -13
  211. package/dist/body/text/TextElementPart.d.ts +0 -13
  212. package/dist/body/text/TextElementReferencePart.d.ts +0 -7
  213. package/dist/body/text/TextElementStaticPart.d.ts +0 -7
  214. package/dist/instance/RepeatRange.d.ts +0 -80
  215. package/dist/lib/xpath/analysis.d.ts +0 -23
  216. package/dist/model/RepeatSequenceDefinition.d.ts +0 -20
  217. package/src/body/RepeatDefinition.ts +0 -54
  218. package/src/body/group/RepeatGroupDefinition.ts +0 -91
  219. package/src/body/text/HintDefinition.ts +0 -26
  220. package/src/body/text/LabelDefinition.ts +0 -54
  221. package/src/body/text/TextElementDefinition.ts +0 -97
  222. package/src/body/text/TextElementOutputPart.ts +0 -27
  223. package/src/body/text/TextElementPart.ts +0 -31
  224. package/src/body/text/TextElementReferencePart.ts +0 -21
  225. package/src/body/text/TextElementStaticPart.ts +0 -26
  226. package/src/instance/RepeatRange.ts +0 -214
  227. package/src/lib/xpath/analysis.ts +0 -241
  228. package/src/model/RepeatSequenceDefinition.ts +0 -53
@@ -1,8 +1,10 @@
1
1
  import { InputDefinition } from '../body/control/InputDefinition.ts';
2
- import { ValueNodeDefinition } from '../model/ValueNodeDefinition.ts';
2
+ import { LeafNodeDefinition } from '../model/LeafNodeDefinition.ts';
3
3
  import { BaseNode, BaseNodeState } from './BaseNode.ts';
4
+ import { NodeAppearances } from './NodeAppearances.ts';
4
5
  import { RootNode } from './RootNode.ts';
5
6
  import { GeneralParentNode } from './hierarchy.ts';
7
+ import { LeafNodeValidationState } from './validation.ts';
6
8
 
7
9
  export interface StringNodeState extends BaseNodeState {
8
10
  get children(): null;
@@ -15,9 +17,10 @@ export interface StringNodeState extends BaseNodeState {
15
17
  */
16
18
  get value(): string;
17
19
  }
18
- export interface StringDefinition extends ValueNodeDefinition {
19
- readonly bodyElement: InputDefinition | null;
20
+ export interface StringDefinition extends LeafNodeDefinition {
21
+ readonly bodyElement: InputDefinition;
20
22
  }
23
+ export type StringNodeAppearances = NodeAppearances<StringDefinition>;
21
24
  /**
22
25
  * A node which can be assigned a string/text value. A string node **MAY**
23
26
  * correspond to form field defined as an XForms `<input>`, which a user-facing
@@ -27,10 +30,12 @@ export interface StringDefinition extends ValueNodeDefinition {
27
30
  */
28
31
  export interface StringNode extends BaseNode {
29
32
  readonly nodeType: 'string';
33
+ readonly appearances: StringNodeAppearances;
30
34
  readonly definition: StringDefinition;
31
35
  readonly root: RootNode;
32
36
  readonly parent: GeneralParentNode;
33
37
  readonly currentState: StringNodeState;
38
+ readonly validationState: LeafNodeValidationState;
34
39
  /**
35
40
  * For use by a client to update the value of a string node.
36
41
  *
@@ -2,6 +2,7 @@ import { SubtreeDefinition as BaseSubtreeDefinition } from '../model/SubtreeDefi
2
2
  import { BaseNode, BaseNodeState } from './BaseNode.ts';
3
3
  import { RootNode } from './RootNode.ts';
4
4
  import { GeneralChildNode, GeneralParentNode } from './hierarchy.ts';
5
+ import { AncestorNodeValidationState } from './validation.ts';
5
6
 
6
7
  export interface SubtreeNodeState extends BaseNodeState {
7
8
  get label(): null;
@@ -46,8 +47,10 @@ export interface SubtreeDefinition extends BaseSubtreeDefinition {
46
47
  */
47
48
  export interface SubtreeNode extends BaseNode {
48
49
  readonly nodeType: 'subtree';
50
+ readonly appearances: null;
49
51
  readonly definition: SubtreeDefinition;
50
52
  readonly root: RootNode;
51
53
  readonly parent: GeneralParentNode;
52
54
  readonly currentState: SubtreeNodeState;
55
+ readonly validationState: AncestorNodeValidationState;
53
56
  }
@@ -1,6 +1,63 @@
1
1
  import { ActiveLanguage } from './FormLanguage.ts';
2
2
 
3
- export type TextChunkSource = 'itext' | 'output' | 'static';
3
+ /**
4
+ * **COMMENTARY**
5
+ *
6
+ * The spec makes naming and mapping these cases a bit more complex than would
7
+ * be ideal. The intent is to clearly identify distinct text definitions (and
8
+ * sub-structural parts) from a source form, in a way that semantically lines up
9
+ * with the ways they will need to be handled at runtime and conveyed to
10
+ * clients. This is the mapping:
11
+ *
12
+ * - 'output': All output values, i.e.:
13
+ * - `output/@value`
14
+ *
15
+ * - 'translation':
16
+ *
17
+ * - Valid XPath translation expressions, in a context accepting mixed
18
+ * translation/static syntax, i.e.:
19
+ *
20
+ * - `h:head//bind/@jr:constraintMsg[is-translation-expr()]`
21
+ * - `h:head//bind/@jr:requiredMsg[is-translation-expr()]`
22
+ *
23
+ * Here, `is-translation-expr()` is a fictional shorthand for checking
24
+ * that the attribute's value is a valid `jr:itext(...)` FunctionCall
25
+ * expression. Note that, per spec, these attributes **do not accept
26
+ * arbitrary XPath expressions**! The non-translation case is treated as
27
+ * static text, not parsed for e.g. an XPath [string] Literal expression.
28
+ * This is why we have introduced this 'translation' case, distinct from
29
+ * 'reference', which previously handled translated labels and hints.
30
+ *
31
+ * - Valid XPath translation expressions, in a context accepting arbitrary
32
+ * XPath expressions, i.e.:
33
+ *
34
+ * - `h:body//label/@ref[is-translation-expr()]`
35
+ *
36
+ * - 'static':
37
+ * - `h:head//bind/@jr:constraintMsg[not(is-translation-expr())]`
38
+ * - `h:head//bind/@jr:requiredMsg[not(is-translation-expr())]`
39
+ * - `h:body//label/text()`
40
+ * - `h:body//hint/text()`
41
+ *
42
+ * (See notes above for clarification of `is-translation-expr()`.)
43
+ *
44
+ * - 'reference': Any XPath **non-translation** expression defined as a label's
45
+ * (or hint's) `ref` attribute, i.e.
46
+ * - `h:body//label/@ref[not(is-translation-expr())]`
47
+ * - `h:body//hint/@ref[not(is-translation-expr())]`
48
+ *
49
+ * (See notes above for clarification of `is-translation-expr()`.)
50
+ *
51
+ * @todo It's unclear whether this will all become simpler or more compelex when
52
+ * we add support for outputs in translations. In theory, the actual translation
53
+ * `<text>` nodes map quite well to the `TextRange` concept (i.e. they are a
54
+ * range of static and output chunks, just like labels and hints). The potential
55
+ * for complications arise from XPath implementation details being largely
56
+ * opaque (as in, the `jr:itext` implementation is encapsulated in the `xpath`
57
+ * package, and the engine doesn't really deal with itext translations at the
58
+ * node level at all).
59
+ */
60
+ export type TextChunkSource = 'output' | 'reference' | 'translation' | 'static';
4
61
  /**
5
62
  * @todo This (and everything else to do with {@link TextRange}s is for
6
63
  * illustration purposes, as a starting point where any particular detail is of
@@ -18,6 +75,31 @@ export interface TextChunk {
18
75
  get asString(): string;
19
76
  get formatted(): unknown;
20
77
  }
78
+ export type ElementTextRole = 'hint' | 'label' | 'item-label';
79
+ export type ValidationTextRole = 'constraintMsg' | 'requiredMsg';
80
+ export type TextRole = ElementTextRole | ValidationTextRole;
81
+ /**
82
+ * Specifies the origin of a {@link TextRange}.
83
+ *
84
+ * - 'form': text is computed from the form definition, as specified for the
85
+ * {@link TextRole}. User-facing clients should present text with this origin
86
+ * where appropriate.
87
+ *
88
+ * - 'form-derived': the form definition lacks a text definition for the
89
+ * {@link TextRole}, but an appropriate one has been derived from a related
90
+ * (and semantically appropriate) aspect of the form (example: a select item
91
+ * without a label may derive that label from the item's value). User-facing
92
+ * clients should generally present text with this origin where provided; this
93
+ * origin clarifies the source of such text.
94
+ *
95
+ * - 'engine': the form definition lacks a definition for the {@link TextRole},
96
+ * but provides a constant default in its absence. User facing clients may
97
+ * disregard these constant text values, or may use them where a sensible
98
+ * default is desired. Clients may also use these constants as keys for
99
+ * translation purposes, as appropriate. Non-user facing clients may reference
100
+ * these constants for e.g. testing purposes.
101
+ */
102
+ export type TextOrigin = 'form' | 'form-derived' | 'engine';
21
103
  /**
22
104
  * Represents aspects of a form which produce text, which _might_ be:
23
105
  *
@@ -48,7 +130,8 @@ export interface TextChunk {
48
130
  * a text range's role may correspond to the "short" or "guidance" `form` of a
49
131
  * {@link https://getodk.github.io/xforms-spec/#languages | translation}).
50
132
  */
51
- export interface TextRange<Role extends string | null = null> {
133
+ export interface TextRange<Role extends TextRole, Origin extends TextOrigin = TextOrigin> {
134
+ readonly origin: Origin;
52
135
  readonly role: Role;
53
136
  [Symbol.iterator](): Iterable<TextChunk>;
54
137
  get asString(): string;
@@ -0,0 +1,9 @@
1
+ import { ValidationTextRole } from './TextRange.ts';
2
+
3
+ export declare const VALIDATION_TEXT: {
4
+ readonly constraintMsg: "Condition not satisfied: constraint";
5
+ readonly requiredMsg: "Condition not satisfied: required";
6
+ };
7
+ type ValidationTextDefaults = typeof VALIDATION_TEXT;
8
+ export type ValidationTextDefault<Role extends ValidationTextRole> = ValidationTextDefaults[Role];
9
+ export {};
@@ -1,13 +1,23 @@
1
1
  import { ExpandUnion } from '../../../common/types/helpers.d.ts';
2
2
  import { GroupNode } from './GroupNode.ts';
3
- import { RepeatInstanceNode } from './RepeatInstanceNode.ts';
4
- import { RepeatRangeNode } from './RepeatRangeNode.ts';
3
+ import { ModelValueNode } from './ModelValueNode.ts';
4
+ import { NoteNode } from './NoteNode.ts';
5
+ import { RepeatInstanceNode } from './repeat/RepeatInstanceNode.ts';
6
+ import { RepeatRangeControlledNode } from './repeat/RepeatRangeControlledNode.ts';
7
+ import { RepeatRangeUncontrolledNode } from './repeat/RepeatRangeUncontrolledNode.ts';
5
8
  import { RootNode } from './RootNode.ts';
6
9
  import { SelectNode } from './SelectNode.ts';
7
10
  import { StringNode } from './StringNode.ts';
8
11
  import { SubtreeNode } from './SubtreeNode.ts';
9
12
 
10
- export type AnyLeafNode = SelectNode | StringNode;
13
+ export type AnyControlNode = NoteNode | SelectNode | StringNode;
14
+ export type AnyLeafNode = AnyControlNode | ModelValueNode;
15
+ export type RepeatRangeNode = RepeatRangeControlledNode | RepeatRangeUncontrolledNode;
16
+ /**
17
+ * Any of the concrete node types which may be a parent of non-repeat instance
18
+ * child nodes.
19
+ */
20
+ export type GeneralParentNode = RootNode | SubtreeNode | GroupNode | RepeatInstanceNode;
11
21
  /**
12
22
  * Any of the concrete node types which may be a parent of any other node.
13
23
  *
@@ -17,7 +27,7 @@ export type AnyLeafNode = SelectNode | StringNode;
17
27
  * - Repeat instances should (continue to) specify {@link RepeatRangeNode}.
18
28
  * - All other child nodes should specify {@link GeneralParentNode}.
19
29
  */
20
- export type AnyParentNode = RootNode | SubtreeNode | GroupNode | RepeatRangeNode | RepeatInstanceNode;
30
+ export type AnyParentNode = GeneralParentNode | RepeatRangeNode;
21
31
  /**
22
32
  * Any of the concrete node types a client may get from the engine's form
23
33
  * representation. This union should be updated when any new concrete node type
@@ -27,11 +37,6 @@ export type AnyParentNode = RootNode | SubtreeNode | GroupNode | RepeatRangeNode
27
37
  * @see {@link GeneralChildNode}, which is derived from this type
28
38
  */
29
39
  export type AnyNode = ExpandUnion<AnyLeafNode | AnyParentNode>;
30
- /**
31
- * Any of the concrete node types which may be a parent of non-repeat instance
32
- * child nodes.
33
- */
34
- export type GeneralParentNode = Exclude<AnyParentNode, RepeatRangeNode>;
35
40
  /**
36
41
  * Any of the concrete node types which may be a child of any other node.
37
42
  *
@@ -1 +1,2 @@
1
- export type InstanceNodeType = 'root' | 'repeat-range' | 'repeat-instance' | 'group' | 'subtree' | 'select' | 'string';
1
+ export type RepeatRangeNodeType = 'repeat-range:controlled' | 'repeat-range:uncontrolled';
2
+ export type InstanceNodeType = 'root' | RepeatRangeNodeType | 'repeat-instance' | 'group' | 'subtree' | 'model-value' | 'note' | 'select' | 'string';
@@ -1,11 +1,14 @@
1
- import { RepeatSequenceDefinition } from '../model/RepeatSequenceDefinition.ts';
2
- import { BaseNode, BaseNodeState } from './BaseNode.ts';
1
+ import { AnyRepeatRangeDefinition } from '../../model/RepeatRangeDefinition.ts';
2
+ import { BaseNode, BaseNodeState } from '../BaseNode.ts';
3
+ import { NodeAppearances } from '../NodeAppearances.ts';
4
+ import { RootNode } from '../RootNode.ts';
5
+ import { TextRange } from '../TextRange.ts';
6
+ import { GeneralParentNode } from '../hierarchy.ts';
7
+ import { RepeatRangeNodeType } from '../node-types.ts';
8
+ import { AncestorNodeValidationState } from '../validation.ts';
3
9
  import { RepeatInstanceNode } from './RepeatInstanceNode.ts';
4
- import { RootNode } from './RootNode.ts';
5
- import { TextRange } from './TextRange.ts';
6
- import { GeneralParentNode } from './hierarchy.ts';
7
10
 
8
- export interface RepeatRangeNodeState extends BaseNodeState {
11
+ export interface BaseRepeatRangeNodeState extends BaseNodeState {
9
12
  get hint(): null;
10
13
  get label(): TextRange<'label'> | null;
11
14
  /**
@@ -14,16 +17,17 @@ export interface RepeatRangeNodeState extends BaseNodeState {
14
17
  * Note: the web-forms engine's representation of this structure differs from
15
18
  * the underlying XForms specification's primary instance structure.
16
19
  *
17
- * @see {@link RepeatRangeNode} for additional detail.
20
+ * @see {@link BaseRepeatRangeNode} for additional detail.
18
21
  */
19
22
  get children(): readonly RepeatInstanceNode[];
20
23
  get valueOptions(): null;
21
24
  get value(): null;
22
25
  }
26
+ export type RepeatRangeNodeAppearances = NodeAppearances<AnyRepeatRangeDefinition>;
23
27
  /**
24
28
  * Represents a contiguous set of zero or more {@link RepeatInstanceNode}s
25
29
  * (accessed by its
26
- * {@link RepeatRangeNodeState.children | `currentState.children`}).
30
+ * {@link BaseRepeatRangeNodeState.children | `currentState.children`}).
27
31
  *
28
32
  * This structure is modeled as a node, like any other, in the web-forms engine
29
33
  * representation, which notably differs from the corresponding structure in the
@@ -82,14 +86,14 @@ export interface RepeatRangeNodeState extends BaseNodeState {
82
86
  * Importantly, if the state of a given repeat range has no instances, no aspect
83
87
  * of these repeats will be present in the underlying XForms primary instance
84
88
  * state, but the web-forms engine's representations **retains a reference** to
85
- * its {@link RepeatRangeNode}.
89
+ * its {@link BaseRepeatRangeNode}.
86
90
  */
87
- export interface RepeatRangeNode extends BaseNode {
88
- readonly nodeType: 'repeat-range';
89
- readonly definition: RepeatSequenceDefinition;
91
+ export interface BaseRepeatRangeNode extends BaseNode {
92
+ readonly nodeType: RepeatRangeNodeType;
93
+ readonly appearances: RepeatRangeNodeAppearances;
94
+ readonly definition: AnyRepeatRangeDefinition;
90
95
  readonly root: RootNode;
91
96
  readonly parent: GeneralParentNode;
92
- readonly currentState: RepeatRangeNodeState;
93
- addInstances(afterIndex?: number, count?: number): RootNode;
94
- removeInstances(startIndex: number, count?: number): RootNode;
97
+ readonly currentState: BaseRepeatRangeNodeState;
98
+ readonly validationState: AncestorNodeValidationState;
95
99
  }
@@ -1,9 +1,10 @@
1
- import { RepeatInstanceDefinition } from '../model/RepeatInstanceDefinition.ts';
2
- import { RepeatTemplateDefinition } from '../model/RepeatTemplateDefinition.ts';
3
- import { BaseNode, BaseNodeState } from './BaseNode.ts';
4
- import { RepeatRangeNode } from './RepeatRangeNode.ts';
5
- import { RootNode } from './RootNode.ts';
6
- import { GeneralChildNode } from './hierarchy.ts';
1
+ import { RepeatInstanceDefinition } from '../../model/RepeatInstanceDefinition.ts';
2
+ import { RepeatTemplateDefinition } from '../../model/RepeatTemplateDefinition.ts';
3
+ import { BaseNode, BaseNodeState } from '../BaseNode.ts';
4
+ import { GeneralChildNode, RepeatRangeNode } from '../hierarchy.ts';
5
+ import { NodeAppearances } from '../NodeAppearances.ts';
6
+ import { RootNode } from '../RootNode.ts';
7
+ import { AncestorNodeValidationState } from '../validation.ts';
7
8
 
8
9
  export interface RepeatInstanceNodeState extends BaseNodeState {
9
10
  get hint(): null;
@@ -12,8 +13,10 @@ export interface RepeatInstanceNodeState extends BaseNodeState {
12
13
  get value(): null;
13
14
  }
14
15
  export type RepeatDefinition = RepeatInstanceDefinition | RepeatTemplateDefinition;
16
+ export type RepeatInstanceNodeAppearances = NodeAppearances<RepeatDefinition>;
15
17
  export interface RepeatInstanceNode extends BaseNode {
16
18
  readonly nodeType: 'repeat-instance';
19
+ readonly appearances: RepeatInstanceNodeAppearances;
17
20
  readonly definition: RepeatDefinition;
18
21
  readonly root: RootNode;
19
22
  /**
@@ -22,8 +25,9 @@ export interface RepeatInstanceNode extends BaseNode {
22
25
  * Note: the web-forms engine's representation of this structure differs from
23
26
  * the underlying XForms specification's primary instance structure.
24
27
  *
25
- * @see {@link RepeatRangeNode} for additional detail.
28
+ * @see {@link BaseRepeatRangeNode} for additional detail.
26
29
  */
27
30
  readonly parent: RepeatRangeNode;
28
31
  readonly currentState: RepeatInstanceNodeState;
32
+ readonly validationState: AncestorNodeValidationState;
29
33
  }
@@ -0,0 +1,19 @@
1
+ import { ControlledRepeatRangeDefinition } from '../../model/RepeatRangeDefinition.ts';
2
+ import { BaseRepeatRangeNode, BaseRepeatRangeNodeState } from './BaseRepeatRangeNode.ts';
3
+
4
+ /**
5
+ * {@inheritDoc BaseRepeatRangeNodeState}
6
+ * @see {@link BaseRepeatRangeNodeState}
7
+ */
8
+ export interface RepeatRangeControlledState extends BaseRepeatRangeNodeState {
9
+ }
10
+ /**
11
+ * Represents a repeat range whose repeat instances are controlled by the
12
+ * engine, and cannot be added or removed by a client. Functionality and
13
+ * semantics are otherwise consistent with an [uncontrolled]
14
+ * {@link RepeatRangeUncontrolledNode}.
15
+ */
16
+ export interface RepeatRangeControlledNode extends BaseRepeatRangeNode {
17
+ readonly nodeType: 'repeat-range:controlled';
18
+ readonly definition: ControlledRepeatRangeDefinition;
19
+ }
@@ -0,0 +1,20 @@
1
+ import { UncontrolledRepeatRangeDefinition } from '../../model/RepeatRangeDefinition.ts';
2
+ import { RootNode } from '../RootNode.ts';
3
+ import { BaseRepeatRangeNode, BaseRepeatRangeNodeState } from './BaseRepeatRangeNode.ts';
4
+
5
+ /**
6
+ * {@inheritDoc BaseRepeatRangeNodeState}
7
+ * @see {@link BaseRepeatRangeNodeState}
8
+ */
9
+ export interface RepeatRangeUncontrolledState extends BaseRepeatRangeNodeState {
10
+ }
11
+ /**
12
+ * {@inheritDoc BaseRepeatRangeNode}
13
+ * @see {@link BaseRepeatRangeNode}
14
+ */
15
+ export interface RepeatRangeUncontrolledNode extends BaseRepeatRangeNode {
16
+ readonly nodeType: 'repeat-range:uncontrolled';
17
+ readonly definition: UncontrolledRepeatRangeDefinition;
18
+ addInstances(afterIndex?: number, count?: number): RootNode;
19
+ removeInstances(startIndex: number, count?: number): RootNode;
20
+ }
@@ -0,0 +1,163 @@
1
+ import { NodeID } from '../instance/identity.ts';
2
+ import { TextRange } from './TextRange.ts';
3
+
4
+ interface BaseValidity {
5
+ /**
6
+ * Specifies the unambiguous validity state for each validity condition of a
7
+ * given node, or for the derived validity of any parent node whose descendants
8
+ * are validated.
9
+ *
10
+ * For {@link ValidationCondition | form-defined conditions}, validity is
11
+ * determined as follows:
12
+ *
13
+ *
14
+ * expression | state | blank | non-blank
15
+ * ------------:|:----------|:-------:|:---------:
16
+ * `constraint` | `true`\* | ✅ | ✅
17
+ * `constraint` | `false` | ✅ | ❌
18
+ * `required` | `false`\* | ✅ | ✅
19
+ * `required` | `true` | ❌ | ✅
20
+ *
21
+ * - \* = default (expression not defined)
22
+ * - ✅ = `valid: true`
23
+ * - ❌ = `valid: false`
24
+ */
25
+ readonly valid: boolean;
26
+ }
27
+ /**
28
+ * Form-defined conditions which determine node validity.
29
+ *
30
+ * @see {@link https://getodk.github.io/xforms-spec/#bind-attributes | `constraint` and `required` bind attributes}
31
+ */
32
+ export type ValidationCondition = 'constraint' | 'required';
33
+ interface ValidationConditionMessageRoles {
34
+ readonly constraint: 'constraintMsg';
35
+ readonly required: 'requiredMsg';
36
+ }
37
+ export type ValidationConditionMessageRole<Condition extends ValidationCondition> = ValidationConditionMessageRoles[Condition];
38
+ /**
39
+ * Source of a condition's violation message.
40
+ *
41
+ * - Form-defined messages (specified by the
42
+ * {@link https://getodk.github.io/xforms-spec/#bind-attributes | `jr:constraintMsg` and `jr:requiredMsg`}
43
+ * attributes) will be favored when provided by the form, and will be
44
+ * translated according to the form's active language (where applicable).
45
+ *
46
+ * - Otherwise, an engine-defined message will be provided as a fallback. This
47
+ * fallback is provided mainly for API consistency, and may be referenced for
48
+ * testing purposes; user-facing clients are expected to provide fallback
49
+ * messaging language most appropriate for their user neeeds. Engine-defined
50
+ * fallback messages **are not translated**. They are intended to be used, if
51
+ * at all, as sentinel values when a form-defined message is not available.
52
+ */
53
+ export type ViolationMessageSource = 'form' | 'engine';
54
+ /**
55
+ * @see {@link ViolationMessage.asString}
56
+ */
57
+ type ViolationMessageAsString<Source extends ViolationMessageSource, Condition extends ValidationCondition> = Source extends 'form' ? string : `Condition not satisfied: ${Condition}`;
58
+ /**
59
+ * A violation message is provided for every violation of a form-defined
60
+ * {@link ValidationCondition}.
61
+ */
62
+ export interface ViolationMessage<Condition extends ValidationCondition, Source extends ViolationMessageSource = ViolationMessageSource> extends TextRange<ValidationConditionMessageRole<Condition>> {
63
+ /**
64
+ * - Form-defined violation messages may produce arbitrary text. This text may
65
+ * be translated
66
+ * ({@link https://getodk.github.io/xforms-spec/#fn:jr:itext | `jr:itext`}),
67
+ * and it may be dynamic (translations may reference form state with
68
+ * {@link https://getodk.github.io/xforms-spec/#body-elements | `<output>`}).
69
+ *
70
+ * - When a form-defined violation message is not available, an engine-defined
71
+ * message will be provided in its place. Engine-defined violation messages
72
+ * are statically defined (and therefore not presently translated by the
73
+ * engine). Their static value can also be referenced as a static type, by
74
+ * checking {@link isFallbackMessage}.
75
+ */
76
+ get asString(): ViolationMessageAsString<Source, Condition>;
77
+ }
78
+ export interface ConditionSatisfied<Condition extends ValidationCondition> extends BaseValidity {
79
+ readonly condition: Condition;
80
+ readonly valid: true;
81
+ readonly message: null;
82
+ }
83
+ export interface ConditionViolation<Condition extends ValidationCondition> extends BaseValidity {
84
+ readonly condition: Condition;
85
+ readonly valid: false;
86
+ readonly message: ViolationMessage<Condition>;
87
+ }
88
+ export type ConditionValidation<Condition extends ValidationCondition> = ConditionSatisfied<Condition> | ConditionViolation<Condition>;
89
+ export type AnyViolation = ConditionViolation<ValidationCondition>;
90
+ /**
91
+ * Represents the validation state of a leaf (or value) node.
92
+ *
93
+ * Validity is computed for two conditions:
94
+ *
95
+ * - {@link constraint}: arbitrary form-defined condition which specifies
96
+ * whether a (non-blank) value is considered valid
97
+ *
98
+ * - {@link required}: when a node is required, the node must have a non-blank
99
+ * value to be considered valid
100
+ *
101
+ * Only one of these conditions can be violated (applicability is mutually
102
+ * exclusive). As such, {@link violation} provides a convenient way to determine
103
+ * whether a leaf/value node is valid with a single (null) check.
104
+ *
105
+ * @see {@link BaseValidity.valid} for additional details on how these
106
+ * conditions are evaluated (and how they interact with one another).
107
+ */
108
+ export interface LeafNodeValidationState {
109
+ get constraint(): ConditionValidation<'constraint'>;
110
+ get required(): ConditionValidation<'required'>;
111
+ /**
112
+ * Violations are mutually exclusive:
113
+ *
114
+ * - {@link constraint} can only be violated by a non-blank value
115
+ * - {@link required} can only be violated by a blank value
116
+ *
117
+ * As such, at most one violation can be present. If none is present,
118
+ * the node is considered valid.
119
+ */
120
+ get violation(): AnyViolation | null;
121
+ }
122
+ /**
123
+ * Provides a reference to any leaf/value node which currently violates either
124
+ * of its validity conditions.
125
+ *
126
+ * Any client can safely assume:
127
+ *
128
+ * - {@link nodeId} will be a stable reference to a node with the same
129
+ * {@link BaseNode.nodeId | `nodeId`}.
130
+ *
131
+ * - {@link node} will have reference equality to the same node object, within
132
+ * the active form instance's {@link RootNode} tree
133
+ *
134
+ * - {@link reference} will be a **current** reference to the same node object's
135
+ * **computed** {@link BaseNodeState.reference | `currentState.reference`}
136
+ *
137
+ * Any client utilizing the engine's reactive APIs (having provided an
138
+ * {@link OpaqueReactiveObjectFactory}) can safely assume that {@link reference}
139
+ * will be recomputed and updated in tandem with the affected node's own
140
+ * computed `currentState.reference` as well.
141
+ *
142
+ * @todo this type currently exposes multiple ways to reference the affected
143
+ * node. This is intended to maximize flexibility: it's not yet clear how
144
+ * clients will be best served by which reference mechanism. It is expected that
145
+ * each property will be directly computed from the affected node.
146
+ */
147
+ export interface DescendantNodeViolationReference {
148
+ readonly nodeId: NodeID;
149
+ get reference(): string;
150
+ get violation(): AnyViolation;
151
+ }
152
+ /**
153
+ * Provides access from any ancestor/parent node, to identify any validity
154
+ * violations present on any of its leaf/value node descendants.
155
+ *
156
+ * @see {@link DescendantNodeViolationReference} for details on how descendants
157
+ * may be referenced when such a violation is present.
158
+ */
159
+ export interface AncestorNodeValidationState {
160
+ get violations(): readonly DescendantNodeViolationReference[];
161
+ }
162
+ export type NodeValidationState = AncestorNodeValidationState | LeafNodeValidationState;
163
+ export {};
@@ -1,9 +1,11 @@
1
1
  import { XFormsXPathEvaluator } from '@getodk/xpath';
2
+ import { ConstantExpression, ConstantTruthyExpression } from '../parse/xpath/semantic-analysis.ts';
2
3
  import { DependencyContext } from './DependencyContext.ts';
3
4
 
4
5
  declare const evaluatorMethodsByResultType: {
5
6
  readonly boolean: "evaluateBoolean";
6
7
  readonly nodes: "evaluateNodes";
8
+ readonly number: "evaluateNumber";
7
9
  readonly string: "evaluateString";
8
10
  };
9
11
  type EvaluatorMethodsByResultType = typeof evaluatorMethodsByResultType;
@@ -11,10 +13,6 @@ export type DependentExpressionResultType = keyof EvaluatorMethodsByResultType;
11
13
  export type DependentExpressionEvaluatorMethod<Type extends DependentExpressionResultType> = EvaluatorMethodsByResultType[Type];
12
14
  export type DependentExpressionResult<Type extends DependentExpressionResultType> = ReturnType<XFormsXPathEvaluator[DependentExpressionEvaluatorMethod<Type>]>;
13
15
  interface SemanticDependencyOptions {
14
- /**
15
- * @default false
16
- */
17
- readonly parentContext?: boolean | undefined;
18
16
  /**
19
17
  * @default false
20
18
  */
@@ -25,19 +23,25 @@ interface DependentExpressionOptions {
25
23
  * @default false
26
24
  */
27
25
  readonly ignoreContextReference?: boolean;
28
- /**
29
- * @default true
30
- */
31
- readonly ignoreNullExpressions?: boolean;
32
26
  readonly semanticDependencies?: SemanticDependencyOptions;
33
27
  }
28
+ export interface ConstantDependentExpression<Type extends DependentExpressionResultType> extends DependentExpression<Type> {
29
+ readonly expression: ConstantExpression;
30
+ }
31
+ export interface ConstantTruthyDependentExpression extends ConstantDependentExpression<'boolean'> {
32
+ readonly expression: ConstantTruthyExpression;
33
+ }
34
34
  export declare class DependentExpression<Type extends DependentExpressionResultType> {
35
35
  readonly resultType: Type;
36
36
  readonly expression: string;
37
37
  readonly dependencyReferences: ReadonlySet<string>;
38
38
  readonly isTranslated: boolean;
39
39
  readonly evaluatorMethod: DependentExpressionEvaluatorMethod<Type>;
40
+ readonly constantExpression: ConstantExpression | null;
41
+ readonly constantTruthyExpression: ConstantTruthyExpression | null;
40
42
  constructor(context: DependencyContext, resultType: Type, expression: string, options?: DependentExpressionOptions);
43
+ isConstantExpression(): this is ConstantDependentExpression<Type>;
44
+ isConstantTruthyExpression(): this is ConstantTruthyDependentExpression;
41
45
  toString(): string | null;
42
46
  }
43
47
  export type AnyDependentExpression = DependentExpression<any>;
package/dist/index.d.ts CHANGED
@@ -1,17 +1,22 @@
1
1
  import { InitializeForm } from './index.ts';
2
2
 
3
3
  export declare const initializeForm: InitializeForm;
4
+ export * as constants from './client/constants.ts';
4
5
  export type * from './client/EngineConfig.ts';
5
6
  export type * from './client/FormLanguage.ts';
6
7
  export type * from './client/GroupNode.ts';
8
+ export type { AnyChildNode, AnyControlNode, AnyLeafNode, AnyNode, AnyParentNode, GeneralChildNode, GeneralParentNode, RepeatRangeNode, } from './client/hierarchy.ts';
9
+ export type * from './client/index.ts';
10
+ export type * from './client/ModelValueNode.ts';
11
+ export type * from './client/NoteNode.ts';
7
12
  export type * from './client/OpaqueReactiveObjectFactory.ts';
8
- export type * from './client/RepeatInstanceNode.ts';
9
- export type * from './client/RepeatRangeNode.ts';
13
+ export type * from './client/repeat/RepeatInstanceNode.ts';
14
+ export type * from './client/repeat/RepeatRangeControlledNode.ts';
15
+ export type * from './client/repeat/RepeatRangeUncontrolledNode.ts';
10
16
  export type * from './client/RootNode.ts';
11
17
  export type * from './client/SelectNode.ts';
12
18
  export type * from './client/StringNode.ts';
13
19
  export type * from './client/SubtreeNode.ts';
14
20
  export type * from './client/TextRange.ts';
15
- export type { AnyChildNode, AnyLeafNode, AnyNode, AnyParentNode, GeneralChildNode, GeneralParentNode, } from './client/hierarchy.ts';
16
- export type * from './client/index.ts';
21
+ export type * from './client/validation.ts';
17
22
  export type { AnySelectDefinition, SelectDefinition, } from './body/control/select/SelectDefinition.ts';