@getodk/xforms-engine 0.4.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 (392) hide show
  1. package/README.md +1 -1
  2. package/dist/client/BaseNode.d.ts +18 -3
  3. package/dist/client/BaseValueNode.d.ts +32 -0
  4. package/dist/client/EngineConfig.d.ts +49 -48
  5. package/dist/client/GroupNode.d.ts +1 -0
  6. package/dist/client/InputNode.d.ts +82 -0
  7. package/dist/client/ModelValueNode.d.ts +13 -7
  8. package/dist/client/NoteNode.d.ts +26 -9
  9. package/dist/client/RangeNode.d.ts +36 -0
  10. package/dist/client/RankNode.d.ts +46 -0
  11. package/dist/client/RootNode.d.ts +37 -7
  12. package/dist/client/SelectNode.d.ts +47 -25
  13. package/dist/client/SubtreeNode.d.ts +1 -0
  14. package/dist/client/TriggerNode.d.ts +10 -6
  15. package/dist/client/ValueType.d.ts +3 -0
  16. package/dist/client/constants.d.ts +50 -0
  17. package/dist/client/hierarchy.d.ts +8 -8
  18. package/dist/client/identity.d.ts +14 -0
  19. package/dist/client/node-types.d.ts +3 -2
  20. package/dist/client/resources.d.ts +93 -0
  21. package/dist/client/submission/SubmissionData.d.ts +7 -0
  22. package/dist/client/submission/SubmissionDefinition.d.ts +14 -0
  23. package/dist/client/submission/SubmissionInstanceFile.d.ts +6 -0
  24. package/dist/client/submission/SubmissionOptions.d.ts +23 -0
  25. package/dist/client/submission/SubmissionResult.d.ts +91 -0
  26. package/dist/client/submission/SubmissionState.d.ts +12 -0
  27. package/dist/client/unsupported/UnsupportedControlNode.d.ts +1 -3
  28. package/dist/client/validation.d.ts +2 -2
  29. package/dist/error/ErrorProductionDesignPendingError.d.ts +7 -0
  30. package/dist/error/RankMissingValueError.d.ts +3 -0
  31. package/dist/error/RankValueTypeError.d.ts +6 -0
  32. package/dist/error/SelectValueTypeError.d.ts +15 -0
  33. package/dist/error/ValueTypeInvariantError.d.ts +17 -0
  34. package/dist/error/XFormsSpecViolationError.d.ts +2 -0
  35. package/dist/error/XPathFunctionalityError.d.ts +14 -0
  36. package/dist/error/XPathFunctionalityNotSupportedError.d.ts +7 -0
  37. package/dist/error/XPathFunctionalityPendingError.d.ts +7 -0
  38. package/dist/index.d.ts +12 -4
  39. package/dist/index.js +17864 -14655
  40. package/dist/index.js.map +1 -1
  41. package/dist/instance/Group.d.ts +10 -4
  42. package/dist/instance/InputControl.d.ts +38 -0
  43. package/dist/instance/ModelValue.d.ts +17 -25
  44. package/dist/instance/Note.d.ts +16 -21
  45. package/dist/instance/PrimaryInstance.d.ts +85 -0
  46. package/dist/instance/RangeControl.d.ts +34 -0
  47. package/dist/instance/RankControl.d.ts +40 -0
  48. package/dist/instance/Root.d.ts +30 -25
  49. package/dist/instance/SelectControl.d.ts +66 -0
  50. package/dist/instance/Subtree.d.ts +11 -5
  51. package/dist/instance/TriggerControl.d.ts +13 -19
  52. package/dist/instance/abstract/DescendantNode.d.ts +32 -25
  53. package/dist/instance/abstract/InstanceNode.d.ts +52 -30
  54. package/dist/instance/abstract/UnsupportedControl.d.ts +11 -3
  55. package/dist/instance/abstract/ValueNode.d.ts +47 -0
  56. package/dist/instance/hierarchy.d.ts +13 -12
  57. package/dist/instance/identity.d.ts +2 -7
  58. package/dist/instance/internal-api/EvaluationContext.d.ts +53 -12
  59. package/dist/instance/internal-api/InstanceConfig.d.ts +8 -2
  60. package/dist/instance/internal-api/InstanceValueContext.d.ts +22 -0
  61. package/dist/instance/internal-api/PrimaryInstanceDocument.d.ts +36 -0
  62. package/dist/instance/internal-api/TranslationContext.d.ts +3 -2
  63. package/dist/instance/internal-api/ValidationContext.d.ts +3 -4
  64. package/dist/instance/internal-api/ValueContext.d.ts +2 -1
  65. package/dist/instance/internal-api/submission/ClientReactiveSubmittableInstance.d.ts +14 -0
  66. package/dist/instance/internal-api/submission/ClientReactiveSubmittableLeafNode.d.ts +32 -0
  67. package/dist/instance/internal-api/submission/ClientReactiveSubmittableParentNode.d.ts +19 -0
  68. package/dist/instance/internal-api/submission/ClientReactiveSubmittableValueNode.d.ts +18 -0
  69. package/dist/instance/repeat/BaseRepeatRange.d.ts +40 -83
  70. package/dist/instance/repeat/RepeatInstance.d.ts +12 -29
  71. package/dist/instance/repeat/RepeatRangeControlled.d.ts +2 -2
  72. package/dist/instance/repeat/RepeatRangeUncontrolled.d.ts +2 -2
  73. package/dist/instance/resource.d.ts +1 -1
  74. package/dist/instance/text/TextRange.d.ts +1 -1
  75. package/dist/instance/unsupported/UploadControl.d.ts +3 -1
  76. package/dist/integration/xpath/EngineXPathEvaluator.d.ts +14 -0
  77. package/dist/integration/xpath/adapter/XFormsXPathNode.d.ts +71 -0
  78. package/dist/integration/xpath/adapter/engineDOMAdapter.d.ts +5 -0
  79. package/dist/integration/xpath/adapter/kind.d.ts +32 -0
  80. package/dist/integration/xpath/adapter/names.d.ts +6 -0
  81. package/dist/integration/xpath/adapter/traversal.d.ts +26 -0
  82. package/dist/integration/xpath/adapter/values.d.ts +2 -0
  83. package/dist/integration/xpath/static-dom/StaticAttribute.d.ts +26 -0
  84. package/dist/integration/xpath/static-dom/StaticDocument.d.ts +15 -0
  85. package/dist/integration/xpath/static-dom/StaticElement.d.ts +48 -0
  86. package/dist/integration/xpath/static-dom/StaticNode.d.ts +33 -0
  87. package/dist/integration/xpath/static-dom/StaticText.d.ts +16 -0
  88. package/dist/lib/client-reactivity/submission/createInstanceSubmissionState.d.ts +3 -0
  89. package/dist/lib/client-reactivity/submission/createLeafNodeSubmissionState.d.ts +3 -0
  90. package/dist/lib/client-reactivity/submission/createNodeRangeSubmissionState.d.ts +4 -0
  91. package/dist/lib/client-reactivity/submission/createParentNodeSubmissionState.d.ts +4 -0
  92. package/dist/lib/client-reactivity/submission/createRootSubmissionState.d.ts +3 -0
  93. package/dist/lib/client-reactivity/submission/createValueNodeSubmissionState.d.ts +3 -0
  94. package/dist/lib/client-reactivity/submission/prepareSubmission.d.ts +8 -0
  95. package/dist/lib/codecs/DecimalValueCodec.d.ts +6 -0
  96. package/dist/lib/codecs/Geopoint/Geopoint.d.ts +48 -0
  97. package/dist/lib/codecs/Geopoint/GeopointValueCodec.d.ts +5 -0
  98. package/dist/lib/codecs/IntValueCodec.d.ts +6 -0
  99. package/dist/lib/codecs/NoteCodec.d.ts +8 -0
  100. package/dist/lib/codecs/RangeCodec.d.ts +8 -0
  101. package/dist/lib/codecs/StringValueCodec.d.ts +4 -0
  102. package/dist/lib/codecs/TriggerCodec.d.ts +7 -0
  103. package/dist/lib/codecs/ValueArrayCodec.d.ts +11 -0
  104. package/dist/lib/codecs/ValueCodec.d.ts +30 -0
  105. package/dist/lib/codecs/ValueTypePlaceholderCodec.d.ts +12 -0
  106. package/dist/lib/codecs/getNoteCodec.d.ts +3 -0
  107. package/dist/lib/codecs/getSelectCodec.d.ts +5 -0
  108. package/dist/lib/codecs/getSharedValueCodec.d.ts +48 -0
  109. package/dist/lib/codecs/items/BaseItemCodec.d.ts +9 -0
  110. package/dist/lib/codecs/items/MultipleValueItemCodec.d.ts +14 -0
  111. package/dist/lib/codecs/items/SingleValueItemCodec.d.ts +24 -0
  112. package/dist/lib/dom/query.d.ts +4 -2
  113. package/dist/lib/names/NamespaceDeclaration.d.ts +45 -0
  114. package/dist/lib/names/NamespaceDeclarationMap.d.ts +137 -0
  115. package/dist/lib/names/NamespaceURL.d.ts +30 -0
  116. package/dist/lib/names/QualifiedName.d.ts +113 -0
  117. package/dist/lib/number-parsers.d.ts +2 -0
  118. package/dist/lib/reactivity/createChildrenState.d.ts +7 -5
  119. package/dist/lib/reactivity/createComputedExpression.d.ts +18 -5
  120. package/dist/lib/reactivity/createInstanceValueState.d.ts +40 -0
  121. package/dist/lib/reactivity/createItemCollection.d.ts +21 -0
  122. package/dist/lib/reactivity/createNoteReadonlyThunk.d.ts +2 -2
  123. package/dist/lib/reactivity/createTranslationState.d.ts +19 -0
  124. package/dist/lib/reactivity/createValueState.d.ts +6 -10
  125. package/dist/lib/reactivity/materializeCurrentStateChildren.d.ts +4 -4
  126. package/dist/lib/xml-serialization.d.ts +50 -0
  127. package/dist/parse/XFormDOM.d.ts +18 -7
  128. package/dist/parse/XFormDefinition.d.ts +1 -2
  129. package/dist/parse/attachments/FormAttachmentResource.d.ts +27 -0
  130. package/dist/parse/body/BodyDefinition.d.ts +4 -4
  131. package/dist/parse/body/RepeatElementDefinition.d.ts +1 -1
  132. package/dist/parse/body/appearance/inputAppearanceParser.d.ts +1 -1
  133. package/dist/parse/body/appearance/rangeAppearanceParser.d.ts +3 -0
  134. package/dist/parse/body/control/{InputDefinition.d.ts → InputControlDefinition.d.ts} +4 -1
  135. package/dist/parse/body/control/ItemDefinition.d.ts +14 -0
  136. package/dist/parse/body/control/ItemsetDefinition.d.ts +18 -0
  137. package/dist/parse/body/control/RangeControlDefinition.d.ts +31 -2
  138. package/dist/parse/body/control/RankControlDefinition.d.ts +7 -3
  139. package/dist/parse/body/control/{select/SelectDefinition.d.ts → SelectControlDefinition.d.ts} +9 -9
  140. package/dist/parse/expression/ItemsetNodesetExpression.d.ts +1 -1
  141. package/dist/parse/expression/ItemsetValueExpression.d.ts +1 -1
  142. package/dist/parse/expression/abstract/DependencyContext.d.ts +0 -5
  143. package/dist/parse/expression/abstract/DependentExpression.d.ts +2 -3
  144. package/dist/parse/model/BindDefinition.d.ts +6 -5
  145. package/dist/parse/model/BindPreloadDefinition.d.ts +42 -0
  146. package/dist/parse/model/BindTypeDefinition.d.ts +20 -0
  147. package/dist/parse/model/DescendentNodeDefinition.d.ts +4 -14
  148. package/dist/parse/model/FormSubmissionDefinition.d.ts +8 -0
  149. package/dist/parse/model/ItextTranslation/ItextTranslationDefinition.d.ts +4 -0
  150. package/dist/parse/model/ItextTranslation/ItextTranslationRootDefinition.d.ts +9 -0
  151. package/dist/parse/model/ItextTranslation/ItextTranslationsDefinition.d.ts +8 -0
  152. package/dist/parse/model/LeafNodeDefinition.d.ts +9 -4
  153. package/dist/parse/model/ModelBindMap.d.ts +1 -1
  154. package/dist/parse/model/ModelDefinition.d.ts +2 -0
  155. package/dist/parse/model/NodeDefinition.d.ts +16 -20
  156. package/dist/parse/model/NoteNodeDefinition.d.ts +9 -8
  157. package/dist/parse/model/RangeNodeDefinition.d.ts +41 -0
  158. package/dist/parse/model/RepeatInstanceDefinition.d.ts +7 -4
  159. package/dist/parse/model/RepeatRangeDefinition.d.ts +7 -4
  160. package/dist/parse/model/RepeatTemplateDefinition.d.ts +7 -4
  161. package/dist/parse/model/RootAttributeDefinition.d.ts +24 -0
  162. package/dist/parse/model/RootAttributeMap.d.ts +23 -0
  163. package/dist/parse/model/RootDefinition.d.ts +12 -9
  164. package/dist/parse/model/SecondaryInstance/SecondaryInstanceDefinition.d.ts +4 -0
  165. package/dist/parse/model/SecondaryInstance/SecondaryInstanceRootDefinition.d.ts +7 -0
  166. package/dist/parse/model/SecondaryInstance/SecondaryInstancesDefinition.d.ts +13 -0
  167. package/dist/parse/model/SecondaryInstance/sources/BlankSecondaryInstanceSource.d.ts +14 -0
  168. package/dist/parse/model/SecondaryInstance/sources/CSVExternalSecondaryInstance.d.ts +22 -0
  169. package/dist/parse/model/SecondaryInstance/sources/ExternalSecondaryInstanceResource.d.ts +23 -0
  170. package/dist/parse/model/SecondaryInstance/sources/ExternalSecondaryInstanceSource.d.ts +9 -0
  171. package/dist/parse/model/SecondaryInstance/sources/GeoJSONExternalSecondaryInstance.d.ts +5 -0
  172. package/dist/parse/model/SecondaryInstance/sources/InternalSecondaryInstanceSource.d.ts +7 -0
  173. package/dist/parse/model/SecondaryInstance/sources/SecondaryInstanceSource.d.ts +13 -0
  174. package/dist/parse/model/SecondaryInstance/sources/XMLExternalSecondaryInstanceSource.d.ts +12 -0
  175. package/dist/parse/model/SubtreeDefinition.d.ts +7 -4
  176. package/dist/parse/shared/parseStaticDocumentFromDOMSubtree.d.ts +23 -0
  177. package/dist/parse/text/ItemLabelDefinition.d.ts +1 -1
  178. package/dist/parse/text/ItemsetLabelDefinition.d.ts +2 -2
  179. package/dist/parse/text/abstract/TextElementDefinition.d.ts +1 -1
  180. package/dist/parse/text/abstract/TextRangeDefinition.d.ts +0 -2
  181. package/dist/parse/xpath/semantic-analysis.d.ts +6 -3
  182. package/dist/solid.js +15437 -12246
  183. package/dist/solid.js.map +1 -1
  184. package/package.json +18 -13
  185. package/src/client/BaseNode.ts +21 -6
  186. package/src/client/BaseValueNode.ts +35 -0
  187. package/src/client/EngineConfig.ts +52 -51
  188. package/src/client/GroupNode.ts +1 -0
  189. package/src/client/InputNode.ts +113 -0
  190. package/src/client/ModelValueNode.ts +31 -7
  191. package/src/client/NoteNode.ts +45 -9
  192. package/src/client/RangeNode.ts +51 -0
  193. package/src/client/RankNode.ts +54 -0
  194. package/src/client/RootNode.ts +43 -7
  195. package/src/client/SelectNode.ts +53 -26
  196. package/src/client/SubtreeNode.ts +1 -0
  197. package/src/client/TriggerNode.ts +12 -6
  198. package/src/client/ValueType.ts +4 -0
  199. package/src/client/constants.ts +67 -0
  200. package/src/client/hierarchy.ts +12 -13
  201. package/src/client/identity.ts +16 -0
  202. package/src/client/node-types.ts +13 -7
  203. package/src/client/resources.ts +118 -0
  204. package/src/client/submission/SubmissionData.ts +12 -0
  205. package/src/client/submission/SubmissionDefinition.ts +16 -0
  206. package/src/client/submission/SubmissionInstanceFile.ts +9 -0
  207. package/src/client/submission/SubmissionOptions.ts +28 -0
  208. package/src/client/submission/SubmissionResult.ts +124 -0
  209. package/src/client/submission/SubmissionState.ts +14 -0
  210. package/src/client/unsupported/UnsupportedControlNode.ts +2 -6
  211. package/src/client/validation.ts +2 -2
  212. package/src/error/ErrorProductionDesignPendingError.ts +6 -0
  213. package/src/error/RankMissingValueError.ts +5 -0
  214. package/src/error/RankValueTypeError.ts +13 -0
  215. package/src/error/SelectValueTypeError.ts +22 -0
  216. package/src/error/ValueTypeInvariantError.ts +22 -0
  217. package/src/error/XFormsSpecViolationError.ts +1 -0
  218. package/src/error/XPathFunctionalityError.ts +26 -0
  219. package/src/error/XPathFunctionalityNotSupportedError.ts +18 -0
  220. package/src/error/XPathFunctionalityPendingError.ts +18 -0
  221. package/src/index.ts +12 -13
  222. package/src/instance/Group.ts +18 -5
  223. package/src/instance/InputControl.ts +159 -0
  224. package/src/instance/ModelValue.ts +48 -53
  225. package/src/instance/Note.ts +40 -49
  226. package/src/instance/PrimaryInstance.ts +245 -0
  227. package/src/instance/RangeControl.ts +113 -0
  228. package/src/instance/RankControl.ts +199 -0
  229. package/src/instance/Root.ts +63 -134
  230. package/src/instance/SelectControl.ts +219 -0
  231. package/src/instance/Subtree.ts +20 -7
  232. package/src/instance/TriggerControl.ts +44 -66
  233. package/src/instance/abstract/DescendantNode.ts +91 -51
  234. package/src/instance/abstract/InstanceNode.ts +113 -107
  235. package/src/instance/abstract/UnsupportedControl.ts +29 -5
  236. package/src/instance/abstract/ValueNode.ts +128 -0
  237. package/src/instance/children.ts +80 -40
  238. package/src/instance/hierarchy.ts +39 -30
  239. package/src/instance/identity.ts +3 -9
  240. package/src/instance/index.ts +25 -7
  241. package/src/instance/internal-api/EvaluationContext.ts +60 -13
  242. package/src/instance/internal-api/InstanceConfig.ts +9 -2
  243. package/src/instance/internal-api/InstanceValueContext.ts +26 -0
  244. package/src/instance/internal-api/PrimaryInstanceDocument.ts +53 -0
  245. package/src/instance/internal-api/TranslationContext.ts +3 -2
  246. package/src/instance/internal-api/ValidationContext.ts +3 -4
  247. package/src/instance/internal-api/ValueContext.ts +2 -1
  248. package/src/instance/internal-api/submission/ClientReactiveSubmittableInstance.ts +20 -0
  249. package/src/instance/internal-api/submission/ClientReactiveSubmittableLeafNode.ts +43 -0
  250. package/src/instance/internal-api/submission/ClientReactiveSubmittableParentNode.ts +26 -0
  251. package/src/instance/internal-api/submission/ClientReactiveSubmittableValueNode.ts +24 -0
  252. package/src/instance/repeat/BaseRepeatRange.ts +52 -131
  253. package/src/instance/repeat/RepeatInstance.ts +21 -46
  254. package/src/instance/repeat/RepeatRangeControlled.ts +5 -5
  255. package/src/instance/repeat/RepeatRangeUncontrolled.ts +2 -4
  256. package/src/instance/resource.ts +5 -2
  257. package/src/instance/text/TextChunk.ts +1 -1
  258. package/src/instance/unsupported/UploadControl.ts +5 -1
  259. package/src/integration/xpath/EngineXPathEvaluator.ts +22 -0
  260. package/src/integration/xpath/adapter/XFormsXPathNode.ts +126 -0
  261. package/src/integration/xpath/adapter/engineDOMAdapter.ts +57 -0
  262. package/src/integration/xpath/adapter/kind.ts +114 -0
  263. package/src/integration/xpath/adapter/names.ts +148 -0
  264. package/src/integration/xpath/adapter/traversal.ts +229 -0
  265. package/src/integration/xpath/adapter/values.ts +5 -0
  266. package/src/integration/xpath/static-dom/StaticAttribute.ts +41 -0
  267. package/src/integration/xpath/static-dom/StaticDocument.ts +36 -0
  268. package/src/integration/xpath/static-dom/StaticElement.ts +119 -0
  269. package/src/integration/xpath/static-dom/StaticNode.ts +68 -0
  270. package/src/integration/xpath/static-dom/StaticText.ts +28 -0
  271. package/src/lib/client-reactivity/README.md +0 -0
  272. package/src/lib/client-reactivity/submission/createInstanceSubmissionState.ts +12 -0
  273. package/src/lib/client-reactivity/submission/createLeafNodeSubmissionState.ts +20 -0
  274. package/src/lib/client-reactivity/submission/createNodeRangeSubmissionState.ts +17 -0
  275. package/src/lib/client-reactivity/submission/createParentNodeSubmissionState.ts +22 -0
  276. package/src/lib/client-reactivity/submission/createRootSubmissionState.ts +19 -0
  277. package/src/lib/client-reactivity/submission/createValueNodeSubmissionState.ts +21 -0
  278. package/src/lib/client-reactivity/submission/prepareSubmission.ts +172 -0
  279. package/src/lib/codecs/DecimalValueCodec.ts +46 -0
  280. package/src/lib/codecs/Geopoint/Geopoint.ts +150 -0
  281. package/src/lib/codecs/Geopoint/GeopointValueCodec.ts +20 -0
  282. package/src/lib/codecs/IntValueCodec.ts +100 -0
  283. package/src/lib/codecs/NoteCodec.ts +32 -0
  284. package/src/lib/codecs/RangeCodec.ts +65 -0
  285. package/src/lib/codecs/StringValueCodec.ts +11 -0
  286. package/src/lib/codecs/TriggerCodec.ts +64 -0
  287. package/src/lib/codecs/ValueArrayCodec.ts +42 -0
  288. package/src/lib/codecs/ValueCodec.ts +106 -0
  289. package/src/lib/codecs/ValueTypePlaceholderCodec.ts +19 -0
  290. package/src/lib/codecs/getNoteCodec.ts +27 -0
  291. package/src/lib/codecs/getSelectCodec.ts +27 -0
  292. package/src/lib/codecs/getSharedValueCodec.ts +79 -0
  293. package/src/lib/codecs/items/BaseItemCodec.ts +20 -0
  294. package/src/lib/codecs/items/MultipleValueItemCodec.ts +28 -0
  295. package/src/lib/codecs/items/SingleValueItemCodec.ts +67 -0
  296. package/src/lib/dom/query.ts +8 -2
  297. package/src/lib/names/NamespaceDeclaration.ts +106 -0
  298. package/src/lib/names/NamespaceDeclarationMap.ts +228 -0
  299. package/src/lib/names/NamespaceURL.ts +44 -0
  300. package/src/lib/names/QualifiedName.ts +170 -0
  301. package/src/lib/number-parsers.ts +25 -0
  302. package/src/lib/reactivity/createChildrenState.ts +8 -6
  303. package/src/lib/reactivity/createComputedExpression.ts +57 -34
  304. package/src/lib/reactivity/createInstanceValueState.ts +216 -0
  305. package/src/lib/reactivity/createItemCollection.ts +173 -0
  306. package/src/lib/reactivity/createNoteReadonlyThunk.ts +12 -7
  307. package/src/lib/reactivity/createTranslationState.ts +61 -0
  308. package/src/lib/reactivity/createValueState.ts +62 -120
  309. package/src/lib/reactivity/materializeCurrentStateChildren.ts +7 -7
  310. package/src/lib/reactivity/text/createTextRange.ts +4 -3
  311. package/src/lib/reactivity/validation/createAggregatedViolations.ts +1 -1
  312. package/src/lib/reactivity/validation/createValidation.ts +2 -3
  313. package/src/lib/xml-serialization.ts +163 -0
  314. package/src/parse/XFormDOM.ts +231 -76
  315. package/src/parse/XFormDefinition.ts +2 -10
  316. package/src/parse/attachments/FormAttachmentResource.ts +40 -0
  317. package/src/parse/body/BodyDefinition.ts +7 -7
  318. package/src/parse/body/appearance/inputAppearanceParser.ts +1 -1
  319. package/src/parse/body/appearance/rangeAppearanceParser.ts +11 -0
  320. package/src/parse/body/control/InputControlDefinition.ts +29 -0
  321. package/src/parse/body/control/{select/ItemDefinition.ts → ItemDefinition.ts} +8 -6
  322. package/src/parse/body/control/{select/ItemsetDefinition.ts → ItemsetDefinition.ts} +11 -9
  323. package/src/parse/body/control/RangeControlDefinition.ts +91 -6
  324. package/src/parse/body/control/RankControlDefinition.ts +25 -7
  325. package/src/parse/body/control/{select/SelectDefinition.ts → SelectControlDefinition.ts} +9 -9
  326. package/src/parse/expression/ItemsetNodesetExpression.ts +1 -1
  327. package/src/parse/expression/ItemsetValueExpression.ts +1 -1
  328. package/src/parse/expression/abstract/DependencyContext.ts +0 -26
  329. package/src/parse/expression/abstract/DependentExpression.ts +2 -13
  330. package/src/parse/model/BindDefinition.ts +9 -8
  331. package/src/parse/model/BindPreloadDefinition.ts +100 -0
  332. package/src/parse/model/BindTypeDefinition.ts +175 -0
  333. package/src/parse/model/DescendentNodeDefinition.ts +7 -31
  334. package/src/parse/model/FormSubmissionDefinition.ts +44 -0
  335. package/src/parse/model/ItextTranslation/ItextTranslationDefinition.ts +4 -0
  336. package/src/parse/model/ItextTranslation/ItextTranslationRootDefinition.ts +42 -0
  337. package/src/parse/model/ItextTranslation/ItextTranslationsDefinition.ts +31 -0
  338. package/src/parse/model/LeafNodeDefinition.ts +15 -5
  339. package/src/parse/model/ModelBindMap.ts +6 -8
  340. package/src/parse/model/ModelDefinition.ts +6 -1
  341. package/src/parse/model/NodeDefinition.ts +24 -48
  342. package/src/parse/model/NoteNodeDefinition.ts +11 -10
  343. package/src/parse/model/RangeNodeDefinition.ts +118 -0
  344. package/src/parse/model/RepeatInstanceDefinition.ts +11 -7
  345. package/src/parse/model/RepeatRangeDefinition.ts +11 -7
  346. package/src/parse/model/RepeatTemplateDefinition.ts +11 -7
  347. package/src/parse/model/RootAttributeDefinition.ts +45 -0
  348. package/src/parse/model/RootAttributeMap.ts +44 -0
  349. package/src/parse/model/RootDefinition.ts +31 -29
  350. package/src/parse/model/SecondaryInstance/SecondaryInstanceDefinition.ts +4 -0
  351. package/src/parse/model/SecondaryInstance/SecondaryInstanceRootDefinition.ts +12 -0
  352. package/src/parse/model/SecondaryInstance/SecondaryInstancesDefinition.ts +102 -0
  353. package/src/parse/model/SecondaryInstance/sources/BlankSecondaryInstanceSource.ts +40 -0
  354. package/src/parse/model/SecondaryInstance/sources/CSVExternalSecondaryInstance.ts +288 -0
  355. package/src/parse/model/SecondaryInstance/sources/ExternalSecondaryInstanceResource.ts +222 -0
  356. package/src/parse/model/SecondaryInstance/sources/ExternalSecondaryInstanceSource.ts +22 -0
  357. package/src/parse/model/SecondaryInstance/sources/GeoJSONExternalSecondaryInstance.ts +415 -0
  358. package/src/parse/model/SecondaryInstance/sources/InternalSecondaryInstanceSource.ts +19 -0
  359. package/src/parse/model/SecondaryInstance/sources/SecondaryInstanceSource.ts +29 -0
  360. package/src/parse/model/SecondaryInstance/sources/XMLExternalSecondaryInstanceSource.ts +32 -0
  361. package/src/parse/model/SubtreeDefinition.ts +12 -12
  362. package/src/parse/shared/parseStaticDocumentFromDOMSubtree.ts +149 -0
  363. package/src/parse/text/ItemLabelDefinition.ts +1 -1
  364. package/src/parse/text/ItemsetLabelDefinition.ts +2 -2
  365. package/src/parse/text/abstract/TextElementDefinition.ts +1 -1
  366. package/src/parse/text/abstract/TextRangeDefinition.ts +0 -6
  367. package/src/parse/xpath/semantic-analysis.ts +33 -3
  368. package/dist/client/StringNode.d.ts +0 -46
  369. package/dist/client/unsupported/RangeNode.d.ts +0 -9
  370. package/dist/client/unsupported/RankNode.d.ts +0 -9
  371. package/dist/instance/SelectField.d.ts +0 -50
  372. package/dist/instance/StringField.d.ts +0 -44
  373. package/dist/instance/internal-api/SubscribableDependency.d.ts +0 -59
  374. package/dist/instance/unsupported/RangeControl.d.ts +0 -4
  375. package/dist/instance/unsupported/RankControl.d.ts +0 -4
  376. package/dist/lib/reactivity/createSelectItems.d.ts +0 -16
  377. package/dist/parse/XFormDataType.d.ts +0 -25
  378. package/dist/parse/body/control/select/ItemDefinition.d.ts +0 -13
  379. package/dist/parse/body/control/select/ItemsetDefinition.d.ts +0 -17
  380. package/dist/parse/body/control/select/ItemsetNodesetContext.d.ts +0 -11
  381. package/src/client/StringNode.ts +0 -52
  382. package/src/client/unsupported/RangeNode.ts +0 -14
  383. package/src/client/unsupported/RankNode.ts +0 -14
  384. package/src/instance/SelectField.ts +0 -226
  385. package/src/instance/StringField.ts +0 -120
  386. package/src/instance/internal-api/SubscribableDependency.ts +0 -61
  387. package/src/instance/unsupported/RangeControl.ts +0 -5
  388. package/src/instance/unsupported/RankControl.ts +0 -5
  389. package/src/lib/reactivity/createSelectItems.ts +0 -168
  390. package/src/parse/XFormDataType.ts +0 -62
  391. package/src/parse/body/control/InputDefinition.ts +0 -22
  392. package/src/parse/body/control/select/ItemsetNodesetContext.ts +0 -26
@@ -0,0 +1,173 @@
1
+ import { UpsertableMap } from '@getodk/common/lib/collections/UpsertableMap.ts';
2
+ import type { Accessor } from 'solid-js';
3
+ import { createMemo } from 'solid-js';
4
+ import type { ActiveLanguage } from '../../client/FormLanguage.ts';
5
+ import type { SelectItem } from '../../client/SelectNode.ts';
6
+ import type { RankItem } from '../../client/RankNode.ts';
7
+ import type { TextRange as ClientTextRange } from '../../client/TextRange.ts';
8
+ import type { EvaluationContext } from '../../instance/internal-api/EvaluationContext.ts';
9
+ import type { TranslationContext } from '../../instance/internal-api/TranslationContext.ts';
10
+ import type { SelectControl } from '../../instance/SelectControl.ts';
11
+ import type { RankControl } from '../../instance/RankControl.ts';
12
+ import { TextChunk } from '../../instance/text/TextChunk.ts';
13
+ import { TextRange } from '../../instance/text/TextRange.ts';
14
+ import type { EngineXPathNode } from '../../integration/xpath/adapter/kind.ts';
15
+ import type { EngineXPathEvaluator } from '../../integration/xpath/EngineXPathEvaluator.ts';
16
+ import type { ItemDefinition } from '../../parse/body/control/ItemDefinition.ts';
17
+ import type { ItemsetDefinition } from '../../parse/body/control/ItemsetDefinition.ts';
18
+ import { createComputedExpression } from './createComputedExpression.ts';
19
+ import type { ReactiveScope } from './scope.ts';
20
+ import { createTextRange } from './text/createTextRange.ts';
21
+
22
+ export type ItemCollectionControl = RankControl | SelectControl;
23
+ type Item = RankItem | SelectItem;
24
+ type DerivedItemLabel = ClientTextRange<'item-label', 'form-derived'>;
25
+
26
+ const derivedItemLabel = (context: TranslationContext, value: string): DerivedItemLabel => {
27
+ const chunk = new TextChunk(context, 'literal', value);
28
+
29
+ return new TextRange('form-derived', 'item-label', [chunk]);
30
+ };
31
+
32
+ const createItemLabel = (
33
+ context: EvaluationContext,
34
+ definition: ItemDefinition
35
+ ): Accessor<ClientTextRange<'item-label'>> => {
36
+ const { label, value } = definition;
37
+
38
+ if (label == null) {
39
+ return () => derivedItemLabel(context, value);
40
+ }
41
+
42
+ return createTextRange(context, 'item-label', label);
43
+ };
44
+
45
+ const createTranslatedStaticItems = (
46
+ control: ItemCollectionControl,
47
+ items: readonly ItemDefinition[]
48
+ ): Accessor<readonly Item[]> => {
49
+ return control.scope.runTask(() => {
50
+ const labeledItems = items.map((item) => {
51
+ const { value } = item;
52
+ const label = createItemLabel(control, item);
53
+
54
+ return () => ({
55
+ value,
56
+ label: label(),
57
+ });
58
+ });
59
+
60
+ return createMemo(() => {
61
+ return labeledItems.map((item) => item());
62
+ });
63
+ });
64
+ };
65
+
66
+ class ItemsetItemEvaluationContext implements EvaluationContext {
67
+ readonly isAttached: Accessor<boolean>;
68
+ readonly scope: ReactiveScope;
69
+ readonly evaluator: EngineXPathEvaluator;
70
+ readonly contextReference: Accessor<string>;
71
+ readonly getActiveLanguage: Accessor<ActiveLanguage>;
72
+
73
+ constructor(
74
+ control: ItemCollectionControl,
75
+ readonly contextNode: EngineXPathNode
76
+ ) {
77
+ this.isAttached = control.isAttached;
78
+ this.scope = control.scope;
79
+ this.evaluator = control.evaluator;
80
+ this.contextReference = control.contextReference;
81
+ this.getActiveLanguage = control.getActiveLanguage;
82
+ }
83
+ }
84
+
85
+ const createItemsetItemLabel = (
86
+ context: EvaluationContext,
87
+ definition: ItemsetDefinition,
88
+ itemValue: Accessor<string>
89
+ ): Accessor<ClientTextRange<'item-label'>> => {
90
+ const { label } = definition;
91
+
92
+ if (label == null) {
93
+ return createMemo(() => {
94
+ return derivedItemLabel(context, itemValue());
95
+ });
96
+ }
97
+
98
+ return createTextRange(context, 'item-label', label);
99
+ };
100
+
101
+ interface ItemsetItem {
102
+ label(): ClientTextRange<'item-label'>;
103
+ value(): string;
104
+ }
105
+
106
+ const createItemsetItems = (
107
+ control: ItemCollectionControl,
108
+ itemset: ItemsetDefinition
109
+ ): Accessor<readonly ItemsetItem[]> => {
110
+ return control.scope.runTask(() => {
111
+ const itemNodes = createComputedExpression(control, itemset.nodes, {
112
+ defaultValue: [],
113
+ });
114
+ const itemsCache = new UpsertableMap<EngineXPathNode, ItemsetItem>();
115
+
116
+ return createMemo(() => {
117
+ return itemNodes().map((itemNode) => {
118
+ return itemsCache.upsert(itemNode, () => {
119
+ const context = new ItemsetItemEvaluationContext(control, itemNode);
120
+ const value = createComputedExpression(context, itemset.value, {
121
+ defaultValue: '',
122
+ });
123
+ const label = createItemsetItemLabel(context, itemset, value);
124
+
125
+ return {
126
+ label,
127
+ value,
128
+ };
129
+ });
130
+ });
131
+ });
132
+ });
133
+ };
134
+
135
+ const createItemset = (
136
+ control: ItemCollectionControl,
137
+ itemset: ItemsetDefinition
138
+ ): Accessor<readonly Item[]> => {
139
+ return control.scope.runTask(() => {
140
+ const itemsetItems = createItemsetItems(control, itemset);
141
+
142
+ return createMemo(() => {
143
+ return itemsetItems().map((item) => {
144
+ return {
145
+ label: item.label(),
146
+ value: item.value(),
147
+ };
148
+ });
149
+ });
150
+ });
151
+ };
152
+
153
+ /**
154
+ * Creates a reactive computation of a {@link ItemCollectionControl}'s
155
+ * {@link Item}s, in support of the field's `valueOptions`.
156
+ *
157
+ * - The control defined with static `<item>`s will compute to an corresponding
158
+ * static list of items.
159
+ * - The control defined with a computed `<itemset>` will compute to a reactive list
160
+ * of items.
161
+ * - Items of both will produce {@link ItemType.label | labels} reactive to
162
+ * their appropriate dependencies (whether relative to the itemset item node,
163
+ * referencing a form's `itext` translations, etc).
164
+ */
165
+ export const createItemCollection = (control: ItemCollectionControl): Accessor<readonly Item[]> => {
166
+ const { items, itemset } = control.definition.bodyElement;
167
+
168
+ if (itemset != null) {
169
+ return createItemset(control, itemset);
170
+ }
171
+
172
+ return createTranslatedStaticItems(control, items);
173
+ };
@@ -1,31 +1,36 @@
1
1
  import type { Accessor } from 'solid-js';
2
2
  import type { EvaluationContext } from '../../instance/internal-api/EvaluationContext.ts';
3
- import type { BindComputationExpression } from '../../parse/expression/BindComputationExpression.ts';
3
+ import type { NoteNodeDefinition } from '../../parse/model/NoteNodeDefinition.ts';
4
+ import { resolveDependencyNodesets } from '../../parse/xpath/dependency-analysis.ts';
4
5
  import { createComputedExpression } from './createComputedExpression.ts';
5
6
 
6
7
  export const createNoteReadonlyThunk = (
7
8
  context: EvaluationContext,
8
- readonlyDefinition: BindComputationExpression<'readonly'>
9
+ definition: NoteNodeDefinition
9
10
  ): Accessor<true> => {
10
- if (!readonlyDefinition.isConstantTruthyExpression()) {
11
+ const { reference } = definition.bodyElement;
12
+ const { readonly } = definition.bind;
13
+
14
+ if (!readonly.isConstantTruthyExpression()) {
11
15
  throw new Error('Expected a static readonly expression');
12
16
  }
13
17
 
14
18
  let result = true;
15
19
 
16
20
  if (import.meta.env.DEV) {
17
- const { expression } = readonlyDefinition;
21
+ const { expression } = readonly;
22
+ const dependencyReferences = resolveDependencyNodesets(reference, expression);
18
23
 
19
- if (readonlyDefinition.dependencyReferences.size > 0) {
24
+ if (dependencyReferences.length > 0) {
20
25
  throw new Error(`Expected expression ${expression} to have no dependencies`);
21
26
  }
22
27
 
23
- const computedExpression = createComputedExpression(context, readonlyDefinition);
28
+ const computedExpression = createComputedExpression(context, readonly);
24
29
 
25
30
  result = computedExpression();
26
31
 
27
32
  if (result !== true) {
28
- throw new Error(`Expected expression ${readonlyDefinition.expression} to return true`);
33
+ throw new Error(`Expected expression ${readonly.expression} to return true`);
29
34
  }
30
35
  }
31
36
 
@@ -0,0 +1,61 @@
1
+ import type { XFormsXPathEvaluator } from '@getodk/xpath';
2
+ import type { Accessor } from 'solid-js';
3
+ import { createComputed, createSignal } from 'solid-js';
4
+ import type { ActiveLanguage, FormLanguage, FormLanguages } from '../../client/FormLanguage.ts';
5
+ import type { EngineXPathEvaluator } from '../../integration/xpath/EngineXPathEvaluator.ts';
6
+ import type { ReactiveScope } from './scope.ts';
7
+ import type { SimpleAtomicStateSetter } from './types.ts';
8
+
9
+ interface TranslationState {
10
+ readonly languages: FormLanguages;
11
+ readonly getActiveLanguage: Accessor<ActiveLanguage>;
12
+ readonly setActiveLanguage: SimpleAtomicStateSetter<FormLanguage>;
13
+ }
14
+
15
+ /**
16
+ * @todo It's been very silly all along that {@link XFormsXPathEvaluator} is
17
+ * responsible for parsing translation languages, and maintaining the active
18
+ * language state. It is especially silly now that we've moved _part of the
19
+ * parsing_ up to the constructor call site. Let's finish off that awkwardness
20
+ * in a subsequent refactor.
21
+ */
22
+ export const createTranslationState = (
23
+ scope: ReactiveScope,
24
+ evaluator: EngineXPathEvaluator
25
+ ): TranslationState => {
26
+ const activeLanguageName = evaluator.getActiveLanguage();
27
+ const languageNames = evaluator.getLanguages();
28
+
29
+ let defaultLanguage: ActiveLanguage;
30
+ let languages: FormLanguages;
31
+
32
+ if (activeLanguageName == null) {
33
+ defaultLanguage = { isSyntheticDefault: true, language: '' };
34
+ languages = [defaultLanguage];
35
+ } else {
36
+ const inactiveLanguages = languageNames
37
+ .filter((languageName) => languageName !== activeLanguageName)
38
+ .map((language) => ({ language }));
39
+
40
+ defaultLanguage = { language: activeLanguageName };
41
+ languages = [defaultLanguage, ...inactiveLanguages];
42
+ }
43
+
44
+ const [getActiveLanguage, baseSetActiveLanguage] = createSignal(defaultLanguage);
45
+
46
+ const setActiveLanguage: SimpleAtomicStateSetter<FormLanguage> = (value) => {
47
+ return baseSetActiveLanguage(value);
48
+ };
49
+
50
+ scope.runTask(() => {
51
+ createComputed(() => {
52
+ evaluator.setActiveLanguage(getActiveLanguage().language);
53
+ });
54
+ });
55
+
56
+ return {
57
+ languages,
58
+ getActiveLanguage,
59
+ setActiveLanguage,
60
+ };
61
+ };
@@ -1,8 +1,7 @@
1
- import { createComputed, createMemo, createSignal, untrack } from 'solid-js';
2
- import type { SubscribableDependency } from '../../instance/internal-api/SubscribableDependency.ts';
1
+ import { createComputed, createMemo, createSignal, untrack, type Signal } from 'solid-js';
2
+ import { ErrorProductionDesignPendingError } from '../../error/ErrorProductionDesignPendingError.ts';
3
3
  import type { ValueContext } from '../../instance/internal-api/ValueContext.ts';
4
4
  import type { BindComputationExpression } from '../../parse/expression/BindComputationExpression.ts';
5
- import type { DependentExpression } from '../../parse/expression/abstract/DependentExpression.ts';
6
5
  import { createComputedExpression } from './createComputedExpression.ts';
7
6
  import type { SimpleAtomicState, SimpleAtomicStateSetter } from './types.ts';
8
7
 
@@ -19,8 +18,7 @@ export interface ValueStateOptions {
19
18
  * other words, this value should not be used for edits.
20
19
  *
21
20
  * - 'PRIMARY_INSTANCE': Derives the initial state from the current text
22
- * content of the {@link ValueNode.contextNode} (currently an XML DOM
23
- * backing store/source of thruth for primary instance state). This option
21
+ * content of the {@link ValueNode.contextNode}. This option
24
22
  * should be specified when initializing a form with existing primary
25
23
  * instance data, such as when editing a previous submission.
26
24
  *
@@ -33,110 +31,54 @@ export interface ValueStateOptions {
33
31
  readonly initialValueSource?: InitialValueSource;
34
32
  }
35
33
 
36
- interface PersistedValueState {
37
- readonly isRelevant: boolean;
38
- readonly value: string;
39
- }
40
-
41
- type PrimaryInstanceValueState = SimpleAtomicState<string>;
42
-
43
- type ValueState<RuntimeValue> = SimpleAtomicState<RuntimeValue>;
44
-
45
- /**
46
- * Creates a signal which:
47
- *
48
- * 1. Persists its state to the primary instance's
49
- * {@link ValueContext.contextNode | contextNode} on state changes.
50
- * 2. Propagates downstream reactivity only after that write is persisted.
51
- *
52
- * This ensures that reactive subscriptions get a consistent view of a node's
53
- * current state, regardless of whether they derive state from values in the
54
- * primary instance (currently: computed {@link DependentExpression}
55
- * evaluations) or from other aspects of reactive runtime state (generally,
56
- * everything besides computed {@link DependentExpression}s).
57
- */
58
- const createPrimaryInstanceValueState = <RuntimeValue>(
34
+ const getInitialValue = <RuntimeValue>(
59
35
  context: ValueContext<RuntimeValue>,
60
36
  options: ValueStateOptions
61
- ): PrimaryInstanceValueState => {
62
- const { contextNode, definition, scope } = context;
63
- const { initialValueSource } = options;
64
- const { defaultValue } = definition;
37
+ ): string => {
38
+ const { initialValueSource = 'FORM_DEFAULT' } = options;
65
39
 
66
- return scope.runTask(() => {
67
- // prettier-ignore
68
- const initialValue =
69
- initialValueSource === 'PRIMARY_INSTANCE'
70
- ? contextNode.textContent ?? defaultValue
71
- : defaultValue;
40
+ if (initialValueSource === 'FORM_DEFAULT') {
41
+ return context.definition.defaultValue;
42
+ }
72
43
 
73
- const persistedValueState = createSignal<PersistedValueState>(
74
- {
75
- isRelevant: context.isRelevant(),
76
- value: initialValue,
77
- },
78
- {
79
- // This could return a single boolean expression, but checking each
80
- // equality condition separately feels like it more clearly expresses
81
- // the intent.
82
- equals: (previous, updated) => {
83
- if (updated.isRelevant !== previous.isRelevant) {
84
- return false;
85
- }
44
+ throw new ErrorProductionDesignPendingError('Edit implementation pending');
45
+ };
86
46
 
87
- return updated.value === previous.value;
88
- },
89
- }
90
- );
91
- const [persistedValue, setValueForPersistence] = persistedValueState;
47
+ type BaseValueState = Signal<string>;
92
48
 
93
- createComputed(() => {
94
- const isRelevant = context.isRelevant();
49
+ type RelevantValueState = SimpleAtomicState<string>;
95
50
 
96
- setValueForPersistence((persisted) => {
97
- return {
98
- isRelevant,
99
- value: persisted.value,
100
- };
101
- });
102
- });
51
+ /**
52
+ * Wraps {@link baseValueState} in a signal-like interface which:
53
+ *
54
+ * - produces a blank value for nodes ({@link context}) in a non-relevant state
55
+ * - persists, and restores, the most recent non-blank value state when a
56
+ * node/context's relevance is restored
57
+ */
58
+ const createRelevantValueState = <RuntimeValue>(
59
+ context: ValueContext<RuntimeValue>,
60
+ baseValueState: BaseValueState
61
+ ): RelevantValueState => {
62
+ return context.scope.runTask(() => {
63
+ const [getRelevantValue, setValue] = baseValueState;
103
64
 
104
- const toSignalValue = (current: PersistedValueState): string => {
105
- if (current.isRelevant) {
106
- return current.value;
65
+ const getValue = createMemo(() => {
66
+ if (context.isRelevant()) {
67
+ return getRelevantValue();
107
68
  }
108
69
 
109
70
  return '';
110
- };
111
-
112
- const [signalValue, setSignalValue] = createSignal(toSignalValue(persistedValue()));
113
-
114
- createComputed(() => {
115
- const { isRelevant, value } = persistedValue();
116
- const preparedTextContent = isRelevant ? value : '';
117
- const assignedTextContent = (contextNode.textContent = preparedTextContent);
118
-
119
- setSignalValue(assignedTextContent);
120
71
  });
121
72
 
122
- const setPrimaryInstanceValue: SimpleAtomicStateSetter<string> = (value) => {
123
- // TODO: Check (error?) for non-relevant value change?
124
- const persisted = setValueForPersistence({
125
- isRelevant: context.isRelevant(),
126
- value,
127
- });
128
-
129
- return persisted.value;
130
- };
131
-
132
- return [signalValue, setPrimaryInstanceValue];
73
+ return [getValue, setValue];
133
74
  });
134
75
  };
135
76
 
77
+ type RuntimeValueState<RuntimeValue> = SimpleAtomicState<RuntimeValue>;
78
+
136
79
  /**
137
- * Wraps a node's {@link PrimaryInstanceValueState} in a signal-like interface
138
- * which automatically encodes and decodes a node's runtime value
139
- * representation:
80
+ * Wraps {@link relevantValueState} in a signal-like interface which
81
+ * automatically encodes and decodes a node's runtime value representation:
140
82
  *
141
83
  * - Values read by a node will be read from the current state as persisted in
142
84
  * the primary instance, then {@link ValueContext.decodeValue | decoded} (as
@@ -144,21 +86,17 @@ const createPrimaryInstanceValueState = <RuntimeValue>(
144
86
  * functionality provided by that node.
145
87
  *
146
88
  * - Values written by a node will be {@link ValueContext.encodeValue | encoded}
147
- * (also as implemented by that node) into a string appropriate to persist to
148
- * the primary instance, and written to it as such.
149
- *
150
- * - Downstream reactive computations should subscribe to updates to this
151
- * runtime state (suggesting the value node itself should access this state in
152
- * its {@link SubscribableDependency.subscribe} implementation).
89
+ * (also as implemented by that node) into a string value appropriate for
90
+ * serialization in an instance submission.
153
91
  */
154
92
  const createRuntimeValueState = <RuntimeValue>(
155
93
  context: ValueContext<RuntimeValue>,
156
- primaryInstanceState: PrimaryInstanceValueState
157
- ): ValueState<RuntimeValue> => {
94
+ relevantValueState: RelevantValueState
95
+ ): RuntimeValueState<RuntimeValue> => {
158
96
  const { decodeValue, encodeValue } = context;
159
97
 
160
98
  return context.scope.runTask(() => {
161
- const [primaryInstanceValue, setPrimaryInstanceValue] = primaryInstanceState;
99
+ const [primaryInstanceValue, setPrimaryInstanceValue] = relevantValueState;
162
100
  const getRuntimeValue = createMemo(() => {
163
101
  return decodeValue(primaryInstanceValue());
164
102
  });
@@ -212,10 +150,12 @@ const createCalculation = <RuntimeValue>(
212
150
  calculateDefinition: BindComputationExpression<'calculate'>
213
151
  ): void => {
214
152
  context.scope.runTask(() => {
215
- const calculate = createComputedExpression(context, calculateDefinition);
153
+ const calculate = createComputedExpression(context, calculateDefinition, {
154
+ defaultValue: '',
155
+ });
216
156
 
217
157
  createComputed(() => {
218
- if (context.isRelevant()) {
158
+ if (context.isAttached() && context.isRelevant()) {
219
159
  const calculated = calculate();
220
160
  const value = context.decodeValue(calculated);
221
161
 
@@ -225,34 +165,36 @@ const createCalculation = <RuntimeValue>(
225
165
  });
226
166
  };
227
167
 
168
+ type ValueState<RuntimeValue> = SimpleAtomicState<RuntimeValue>;
169
+
228
170
  /**
229
171
  * Provides a consistent interface for value nodes of any type which:
230
172
  *
231
- * - derives initial state from either the existing primary instance state (e.g.
232
- * for edits) or the node's definition (e.g. initializing a new submission)
233
- * - decodes primary instance state into the value node's runtime type
234
- * - encodes and persists updated values to the primary instance
173
+ * - derives initial state from either an existing instance (e.g. for edits) or
174
+ * the node's definition (e.g. initializing a new submission)
175
+ * - decodes current primary instance state into the value node's runtime type
176
+ * - encodes updated runtime values to store updated instance state
235
177
  * - initializes reactive computation of `calculate` bind expressions for those
236
178
  * nodes defined with one
237
- * - ensures any downstream reactive dependencies are updated only after writes
238
- * (whether performed by a client, or by a reactive `calculate` computation)
239
- * are persisted, ensuring a consistent view of state when downstream
240
- * computations perform XPath evaluations against that primary instance state
179
+ * - prevents downstream writes to nodes in a readonly state
241
180
  */
242
181
  export const createValueState = <RuntimeValue>(
243
182
  context: ValueContext<RuntimeValue>,
244
183
  options: ValueStateOptions = {}
245
184
  ): ValueState<RuntimeValue> => {
246
- const primaryInstanceState = createPrimaryInstanceValueState(context, options);
247
- const runtimeState = createRuntimeValueState(context, primaryInstanceState);
248
-
249
- const { calculate } = context.definition.bind;
185
+ return context.scope.runTask(() => {
186
+ const initialValue = getInitialValue(context, options);
187
+ const baseValueState = createSignal(initialValue);
188
+ const valueState = createRelevantValueState(context, baseValueState);
189
+ const runtimeState = createRuntimeValueState(context, valueState);
190
+ const { calculate } = context.definition.bind;
250
191
 
251
- if (calculate != null) {
252
- const [, setValue] = runtimeState;
192
+ if (calculate != null) {
193
+ const [, setValue] = runtimeState;
253
194
 
254
- createCalculation(context, setValue, calculate);
255
- }
195
+ createCalculation(context, setValue, calculate);
196
+ }
256
197
 
257
- return guardDownstreamReadonlyWrites(context, runtimeState);
198
+ return guardDownstreamReadonlyWrites(context, runtimeState);
199
+ });
258
200
  };
@@ -1,13 +1,13 @@
1
+ import type { FormNodeID } from '../../client/identity.ts';
1
2
  import type { AnyChildNode } from '../../instance/hierarchy.ts';
2
- import type { NodeID } from '../../instance/identity.ts';
3
3
  import type { ChildrenState, createChildrenState } from './createChildrenState.ts';
4
4
  import type { ClientState } from './node-state/createClientState.ts';
5
5
  import type { CurrentState } from './node-state/createCurrentState.ts';
6
6
  import type { ReactiveScope } from './scope.ts';
7
7
 
8
8
  interface InconsistentChildrenStateDetails {
9
- readonly missingIds: readonly NodeID[];
10
- readonly unexpectedIds: readonly NodeID[];
9
+ readonly missingIds: readonly FormNodeID[];
10
+ readonly unexpectedIds: readonly FormNodeID[];
11
11
  }
12
12
 
13
13
  class InconsistentChildrenStateError extends Error {
@@ -37,7 +37,7 @@ class InconsistentChildrenStateError extends Error {
37
37
  }
38
38
 
39
39
  export interface EncodedParentState {
40
- readonly children: readonly NodeID[];
40
+ readonly children: readonly FormNodeID[];
41
41
  }
42
42
 
43
43
  /**
@@ -58,7 +58,7 @@ export interface EncodedParentState {
58
58
  * @todo should we throw rather than warn until we have this confidence?
59
59
  */
60
60
  const reportInconsistentChildrenState = (
61
- expectedClientIds: readonly NodeID[],
61
+ expectedClientIds: readonly FormNodeID[],
62
62
  actualNodes: readonly AnyChildNode[]
63
63
  ): void => {
64
64
  const actualIds = actualNodes.map((node) => node.nodeId);
@@ -88,8 +88,8 @@ export type MaterializedChildren<
88
88
  /**
89
89
  * Creates a wrapper proxy around a parent node's {@link CurrentState} to map
90
90
  * `children` state, which is written to the node's (internal, synchronized)
91
- * {@link ClientState} as an array of {@link NodeID}s, back to the node objects
92
- * corresponding to those IDs.
91
+ * {@link ClientState} as an array of {@link FormNodeID}s, back to the node
92
+ * objects corresponding to those IDs.
93
93
  *
94
94
  * @see {@link createChildrenState} for further detail.
95
95
  */
@@ -29,7 +29,9 @@ const createComputedTextChunk = (
29
29
  }
30
30
 
31
31
  return context.scope.runTask(() => {
32
- const getText = createComputedExpression(context, textSource);
32
+ const getText = createComputedExpression(context, textSource, {
33
+ defaultValue: '',
34
+ });
33
35
 
34
36
  return {
35
37
  source,
@@ -43,14 +45,13 @@ const createTextChunks = (
43
45
  textSources: readonly AnyTextChunkExpression[]
44
46
  ): Accessor<readonly TextChunk[]> => {
45
47
  return context.scope.runTask(() => {
46
- const { root } = context;
47
48
  const chunkComputations = textSources.map((textSource) => {
48
49
  return createComputedTextChunk(context, textSource);
49
50
  });
50
51
 
51
52
  return createMemo(() => {
52
53
  return chunkComputations.map(({ source, getText }) => {
53
- return new TextChunk(root, source, getText());
54
+ return new TextChunk(context, source, getText());
54
55
  });
55
56
  });
56
57
  });
@@ -32,8 +32,8 @@ const collectViolationReferences = (
32
32
  return context.getChildren().flatMap((child) => {
33
33
  switch (child.nodeType) {
34
34
  case 'model-value':
35
+ case 'input':
35
36
  case 'note':
36
- case 'string':
37
37
  case 'select':
38
38
  case 'range':
39
39
  case 'rank':
@@ -33,7 +33,7 @@ const engineViolationMessage = <Role extends ValidationTextRole>(
33
33
  role: Role
34
34
  ): Accessor<EngineViolationMessage<Role>> => {
35
35
  const messageText = VALIDATION_TEXT[role];
36
- const chunk = new TextChunk(context.root, 'literal', messageText);
36
+ const chunk = new TextChunk(context, 'literal', messageText);
37
37
  const message = new TextRange('engine', role, [chunk]);
38
38
 
39
39
  return () => message;
@@ -75,9 +75,8 @@ const createConstraintValidation = (
75
75
  }
76
76
 
77
77
  const isValid = createComputedExpression(context, constraint, {
78
- arbitraryDependencies: [context],
78
+ defaultValue: true,
79
79
  });
80
-
81
80
  const message = createViolationMessage(context, 'constraintMsg', constraintMsg);
82
81
 
83
82
  return createMemo(() => {