@getodk/xforms-engine 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client/BaseNode.d.ts +14 -3
- package/dist/client/BaseValueNode.d.ts +32 -0
- package/dist/client/EngineConfig.d.ts +49 -48
- package/dist/client/InputNode.d.ts +53 -0
- package/dist/client/ModelValueNode.d.ts +12 -7
- package/dist/client/NoteNode.d.ts +2 -2
- package/dist/client/RootNode.d.ts +34 -7
- package/dist/client/SelectNode.d.ts +2 -2
- package/dist/client/ValueType.d.ts +3 -0
- package/dist/client/constants.d.ts +50 -0
- package/dist/client/hierarchy.d.ts +4 -4
- package/dist/client/identity.d.ts +14 -0
- package/dist/client/node-types.d.ts +2 -1
- package/dist/client/resources.d.ts +93 -0
- package/dist/client/submission/SubmissionData.d.ts +7 -0
- package/dist/client/submission/SubmissionDefinition.d.ts +14 -0
- package/dist/client/submission/SubmissionInstanceFile.d.ts +6 -0
- package/dist/client/submission/SubmissionOptions.d.ts +23 -0
- package/dist/client/submission/SubmissionResult.d.ts +91 -0
- package/dist/client/submission/SubmissionState.d.ts +12 -0
- package/dist/client/validation.d.ts +2 -2
- package/dist/error/ErrorProductionDesignPendingError.d.ts +7 -0
- package/dist/error/ValueTypeInvariantError.d.ts +17 -0
- package/dist/error/XPathFunctionalityError.d.ts +14 -0
- package/dist/error/XPathFunctionalityNotSupportedError.d.ts +7 -0
- package/dist/error/XPathFunctionalityPendingError.d.ts +7 -0
- package/dist/index.d.ts +10 -1
- package/dist/index.js +10856 -8585
- package/dist/index.js.map +1 -1
- package/dist/instance/Group.d.ts +9 -4
- package/dist/instance/InputControl.d.ts +36 -0
- package/dist/instance/ModelValue.d.ts +16 -26
- package/dist/instance/Note.d.ts +10 -3
- package/dist/instance/PrimaryInstance.d.ts +84 -0
- package/dist/instance/Root.d.ts +29 -25
- package/dist/instance/SelectField.d.ts +10 -2
- package/dist/instance/Subtree.d.ts +10 -5
- package/dist/instance/TriggerControl.d.ts +10 -3
- package/dist/instance/abstract/DescendantNode.d.ts +31 -23
- package/dist/instance/abstract/InstanceNode.d.ts +49 -29
- package/dist/instance/abstract/UnsupportedControl.d.ts +10 -3
- package/dist/instance/abstract/ValueNode.d.ts +48 -0
- package/dist/instance/hierarchy.d.ts +9 -8
- package/dist/instance/identity.d.ts +2 -7
- package/dist/instance/internal-api/EvaluationContext.d.ts +53 -12
- package/dist/instance/internal-api/InstanceConfig.d.ts +8 -2
- package/dist/instance/internal-api/InstanceValueContext.d.ts +20 -0
- package/dist/instance/internal-api/PrimaryInstanceDocument.d.ts +36 -0
- package/dist/instance/internal-api/TranslationContext.d.ts +3 -2
- package/dist/instance/internal-api/ValidationContext.d.ts +3 -4
- package/dist/instance/internal-api/ValueContext.d.ts +2 -1
- package/dist/instance/internal-api/submission/ClientReactiveSubmittableInstance.d.ts +14 -0
- package/dist/instance/internal-api/submission/ClientReactiveSubmittableLeafNode.d.ts +31 -0
- package/dist/instance/internal-api/submission/ClientReactiveSubmittableParentNode.d.ts +18 -0
- package/dist/instance/internal-api/submission/ClientReactiveSubmittableValueNode.d.ts +17 -0
- package/dist/instance/repeat/BaseRepeatRange.d.ts +39 -83
- package/dist/instance/repeat/RepeatInstance.d.ts +11 -29
- package/dist/instance/repeat/RepeatRangeControlled.d.ts +2 -2
- package/dist/instance/repeat/RepeatRangeUncontrolled.d.ts +2 -2
- package/dist/instance/resource.d.ts +1 -1
- package/dist/instance/text/TextRange.d.ts +1 -1
- package/dist/instance/unsupported/RangeControl.d.ts +3 -1
- package/dist/instance/unsupported/RankControl.d.ts +3 -1
- package/dist/instance/unsupported/UploadControl.d.ts +3 -1
- package/dist/integration/xpath/EngineXPathEvaluator.d.ts +14 -0
- package/dist/integration/xpath/adapter/XFormsXPathNode.d.ts +71 -0
- package/dist/integration/xpath/adapter/engineDOMAdapter.d.ts +5 -0
- package/dist/integration/xpath/adapter/kind.d.ts +32 -0
- package/dist/integration/xpath/adapter/names.d.ts +16 -0
- package/dist/integration/xpath/adapter/traversal.d.ts +25 -0
- package/dist/integration/xpath/adapter/values.d.ts +2 -0
- package/dist/integration/xpath/static-dom/StaticAttribute.d.ts +19 -0
- package/dist/integration/xpath/static-dom/StaticDocument.d.ts +16 -0
- package/dist/integration/xpath/static-dom/StaticElement.d.ts +40 -0
- package/dist/integration/xpath/static-dom/StaticNamedNode.d.ts +17 -0
- package/dist/integration/xpath/static-dom/StaticNode.d.ts +33 -0
- package/dist/integration/xpath/static-dom/StaticText.d.ts +16 -0
- package/dist/lib/client-reactivity/submission/createInstanceSubmissionState.d.ts +3 -0
- package/dist/lib/client-reactivity/submission/createLeafNodeSubmissionState.d.ts +3 -0
- package/dist/lib/client-reactivity/submission/createNodeRangeSubmissionState.d.ts +4 -0
- package/dist/lib/client-reactivity/submission/createParentNodeSubmissionState.d.ts +4 -0
- package/dist/lib/client-reactivity/submission/createValueNodeSubmissionState.d.ts +3 -0
- package/dist/lib/client-reactivity/submission/prepareSubmission.d.ts +8 -0
- package/dist/lib/codecs/DecimalValueCodec.d.ts +6 -0
- package/dist/lib/codecs/IntValueCodec.d.ts +6 -0
- package/dist/lib/codecs/StringValueCodec.d.ts +4 -0
- package/dist/lib/codecs/ValueCodec.d.ts +30 -0
- package/dist/lib/codecs/ValueTypePlaceholderCodec.d.ts +12 -0
- package/dist/lib/codecs/getSharedValueCodec.d.ts +47 -0
- package/dist/lib/dom/query.d.ts +3 -0
- package/dist/lib/reactivity/createChildrenState.d.ts +7 -5
- package/dist/lib/reactivity/createComputedExpression.d.ts +18 -5
- package/dist/lib/reactivity/createInstanceValueState.d.ts +40 -0
- package/dist/lib/reactivity/createNoteReadonlyThunk.d.ts +2 -2
- package/dist/lib/reactivity/createTranslationState.d.ts +19 -0
- package/dist/lib/reactivity/createValueState.d.ts +6 -10
- package/dist/lib/reactivity/materializeCurrentStateChildren.d.ts +4 -4
- package/dist/lib/xml-serialization.d.ts +41 -0
- package/dist/parse/XFormDOM.d.ts +18 -7
- package/dist/parse/XFormDefinition.d.ts +1 -2
- package/dist/parse/attachments/FormAttachmentResource.d.ts +27 -0
- package/dist/parse/body/BodyDefinition.d.ts +3 -3
- package/dist/parse/body/RepeatElementDefinition.d.ts +1 -1
- package/dist/parse/body/appearance/inputAppearanceParser.d.ts +1 -1
- package/dist/parse/body/control/{InputDefinition.d.ts → InputControlDefinition.d.ts} +1 -1
- package/dist/parse/body/control/select/ItemsetNodesetContext.d.ts +0 -2
- package/dist/parse/expression/abstract/DependencyContext.d.ts +0 -5
- package/dist/parse/expression/abstract/DependentExpression.d.ts +2 -3
- package/dist/parse/model/BindDefinition.d.ts +4 -5
- package/dist/parse/model/BindTypeDefinition.d.ts +20 -0
- package/dist/parse/model/DescendentNodeDefinition.d.ts +0 -1
- package/dist/parse/model/FormSubmissionDefinition.d.ts +8 -0
- package/dist/parse/model/ItextTranslation/ItextTranslationDefinition.d.ts +4 -0
- package/dist/parse/model/ItextTranslation/ItextTranslationRootDefinition.d.ts +8 -0
- package/dist/parse/model/ItextTranslation/ItextTranslationsDefinition.d.ts +8 -0
- package/dist/parse/model/LeafNodeDefinition.d.ts +3 -1
- package/dist/parse/model/ModelBindMap.d.ts +1 -1
- package/dist/parse/model/ModelDefinition.d.ts +2 -0
- package/dist/parse/model/NodeDefinition.d.ts +0 -1
- package/dist/parse/model/NoteNodeDefinition.d.ts +4 -4
- package/dist/parse/model/RootDefinition.d.ts +3 -2
- package/dist/parse/model/SecondaryInstance/SecondaryInstanceDefinition.d.ts +4 -0
- package/dist/parse/model/SecondaryInstance/SecondaryInstanceRootDefinition.d.ts +7 -0
- package/dist/parse/model/SecondaryInstance/SecondaryInstancesDefinition.d.ts +13 -0
- package/dist/parse/model/SecondaryInstance/sources/BlankSecondaryInstanceSource.d.ts +14 -0
- package/dist/parse/model/SecondaryInstance/sources/CSVExternalSecondaryInstance.d.ts +22 -0
- package/dist/parse/model/SecondaryInstance/sources/ExternalSecondaryInstanceResource.d.ts +23 -0
- package/dist/parse/model/SecondaryInstance/sources/ExternalSecondaryInstanceSource.d.ts +9 -0
- package/dist/parse/model/SecondaryInstance/sources/GeoJSONExternalSecondaryInstance.d.ts +5 -0
- package/dist/parse/model/SecondaryInstance/sources/InternalSecondaryInstanceSource.d.ts +7 -0
- package/dist/parse/model/SecondaryInstance/sources/SecondaryInstanceSource.d.ts +13 -0
- package/dist/parse/model/SecondaryInstance/sources/XMLExternalSecondaryInstanceSource.d.ts +12 -0
- package/dist/parse/shared/parseStaticDocumentFromDOMSubtree.d.ts +24 -0
- package/dist/parse/text/abstract/TextRangeDefinition.d.ts +0 -2
- package/dist/parse/xpath/semantic-analysis.d.ts +5 -0
- package/dist/solid.js +8174 -5921
- package/dist/solid.js.map +1 -1
- package/package.json +13 -11
- package/src/client/BaseNode.ts +16 -6
- package/src/client/BaseValueNode.ts +35 -0
- package/src/client/EngineConfig.ts +52 -51
- package/src/client/InputNode.ts +77 -0
- package/src/client/ModelValueNode.ts +30 -7
- package/src/client/NoteNode.ts +2 -2
- package/src/client/RootNode.ts +37 -7
- package/src/client/SelectNode.ts +3 -3
- package/src/client/ValueType.ts +4 -0
- package/src/client/constants.ts +67 -0
- package/src/client/hierarchy.ts +5 -5
- package/src/client/identity.ts +16 -0
- package/src/client/node-types.ts +12 -6
- package/src/client/resources.ts +118 -0
- package/src/client/submission/SubmissionData.ts +12 -0
- package/src/client/submission/SubmissionDefinition.ts +16 -0
- package/src/client/submission/SubmissionInstanceFile.ts +9 -0
- package/src/client/submission/SubmissionOptions.ts +28 -0
- package/src/client/submission/SubmissionResult.ts +124 -0
- package/src/client/submission/SubmissionState.ts +14 -0
- package/src/client/validation.ts +2 -2
- package/src/error/ErrorProductionDesignPendingError.ts +6 -0
- package/src/error/ValueTypeInvariantError.ts +22 -0
- package/src/error/XPathFunctionalityError.ts +26 -0
- package/src/error/XPathFunctionalityNotSupportedError.ts +18 -0
- package/src/error/XPathFunctionalityPendingError.ts +18 -0
- package/src/index.ts +10 -1
- package/src/instance/Group.ts +17 -5
- package/src/instance/InputControl.ts +119 -0
- package/src/instance/ModelValue.ts +47 -54
- package/src/instance/Note.ts +24 -8
- package/src/instance/PrimaryInstance.ts +244 -0
- package/src/instance/Root.ts +62 -134
- package/src/instance/SelectField.ts +56 -19
- package/src/instance/Subtree.ts +19 -7
- package/src/instance/TriggerControl.ts +23 -6
- package/src/instance/abstract/DescendantNode.ts +90 -45
- package/src/instance/abstract/InstanceNode.ts +103 -105
- package/src/instance/abstract/UnsupportedControl.ts +28 -5
- package/src/instance/abstract/ValueNode.ts +127 -0
- package/src/instance/children.ts +9 -10
- package/src/instance/hierarchy.ts +19 -15
- package/src/instance/identity.ts +3 -9
- package/src/instance/index.ts +25 -7
- package/src/instance/internal-api/EvaluationContext.ts +60 -13
- package/src/instance/internal-api/InstanceConfig.ts +9 -2
- package/src/instance/internal-api/InstanceValueContext.ts +24 -0
- package/src/instance/internal-api/PrimaryInstanceDocument.ts +53 -0
- package/src/instance/internal-api/TranslationContext.ts +3 -2
- package/src/instance/internal-api/ValidationContext.ts +3 -4
- package/src/instance/internal-api/ValueContext.ts +2 -1
- package/src/instance/internal-api/submission/ClientReactiveSubmittableInstance.ts +20 -0
- package/src/instance/internal-api/submission/ClientReactiveSubmittableLeafNode.ts +42 -0
- package/src/instance/internal-api/submission/ClientReactiveSubmittableParentNode.ts +25 -0
- package/src/instance/internal-api/submission/ClientReactiveSubmittableValueNode.ts +23 -0
- package/src/instance/repeat/BaseRepeatRange.ts +50 -131
- package/src/instance/repeat/RepeatInstance.ts +20 -46
- package/src/instance/repeat/RepeatRangeControlled.ts +5 -5
- package/src/instance/repeat/RepeatRangeUncontrolled.ts +2 -4
- package/src/instance/resource.ts +1 -1
- package/src/instance/text/TextChunk.ts +1 -1
- package/src/instance/unsupported/RangeControl.ts +5 -1
- package/src/instance/unsupported/RankControl.ts +5 -1
- package/src/instance/unsupported/UploadControl.ts +5 -1
- package/src/integration/xpath/EngineXPathEvaluator.ts +22 -0
- package/src/integration/xpath/adapter/XFormsXPathNode.ts +126 -0
- package/src/integration/xpath/adapter/engineDOMAdapter.ts +57 -0
- package/src/integration/xpath/adapter/kind.ts +114 -0
- package/src/integration/xpath/adapter/names.ts +99 -0
- package/src/integration/xpath/adapter/traversal.ts +228 -0
- package/src/integration/xpath/adapter/values.ts +5 -0
- package/src/integration/xpath/static-dom/StaticAttribute.ts +33 -0
- package/src/integration/xpath/static-dom/StaticDocument.ts +38 -0
- package/src/integration/xpath/static-dom/StaticElement.ts +106 -0
- package/src/integration/xpath/static-dom/StaticNamedNode.ts +45 -0
- package/src/integration/xpath/static-dom/StaticNode.ts +68 -0
- package/src/integration/xpath/static-dom/StaticText.ts +28 -0
- package/src/lib/client-reactivity/README.md +0 -0
- package/src/lib/client-reactivity/submission/createInstanceSubmissionState.ts +12 -0
- package/src/lib/client-reactivity/submission/createLeafNodeSubmissionState.ts +20 -0
- package/src/lib/client-reactivity/submission/createNodeRangeSubmissionState.ts +17 -0
- package/src/lib/client-reactivity/submission/createParentNodeSubmissionState.ts +22 -0
- package/src/lib/client-reactivity/submission/createValueNodeSubmissionState.ts +21 -0
- package/src/lib/client-reactivity/submission/prepareSubmission.ts +172 -0
- package/src/lib/codecs/DecimalValueCodec.ts +46 -0
- package/src/lib/codecs/IntValueCodec.ts +100 -0
- package/src/lib/codecs/StringValueCodec.ts +11 -0
- package/src/lib/codecs/ValueCodec.ts +106 -0
- package/src/lib/codecs/ValueTypePlaceholderCodec.ts +19 -0
- package/src/lib/codecs/getSharedValueCodec.ts +77 -0
- package/src/lib/dom/query.ts +7 -0
- package/src/lib/reactivity/createChildrenState.ts +8 -6
- package/src/lib/reactivity/createComputedExpression.ts +57 -34
- package/src/lib/reactivity/createInstanceValueState.ts +166 -0
- package/src/lib/reactivity/createNoteReadonlyThunk.ts +12 -7
- package/src/lib/reactivity/createSelectItems.ts +21 -21
- package/src/lib/reactivity/createTranslationState.ts +61 -0
- package/src/lib/reactivity/createValueState.ts +62 -120
- package/src/lib/reactivity/materializeCurrentStateChildren.ts +7 -7
- package/src/lib/reactivity/text/createTextRange.ts +4 -3
- package/src/lib/reactivity/validation/createAggregatedViolations.ts +1 -1
- package/src/lib/reactivity/validation/createValidation.ts +2 -3
- package/src/lib/xml-serialization.ts +96 -0
- package/src/parse/XFormDOM.ts +110 -75
- package/src/parse/XFormDefinition.ts +1 -6
- package/src/parse/attachments/FormAttachmentResource.ts +40 -0
- package/src/parse/body/BodyDefinition.ts +3 -3
- package/src/parse/body/appearance/inputAppearanceParser.ts +1 -1
- package/src/parse/body/control/{InputDefinition.ts → InputControlDefinition.ts} +3 -5
- package/src/parse/body/control/select/ItemsetNodesetContext.ts +0 -5
- package/src/parse/expression/abstract/DependencyContext.ts +0 -26
- package/src/parse/expression/abstract/DependentExpression.ts +2 -13
- package/src/parse/model/BindDefinition.ts +5 -8
- package/src/parse/model/BindTypeDefinition.ts +175 -0
- package/src/parse/model/DescendentNodeDefinition.ts +0 -6
- package/src/parse/model/FormSubmissionDefinition.ts +44 -0
- package/src/parse/model/ItextTranslation/ItextTranslationDefinition.ts +4 -0
- package/src/parse/model/ItextTranslation/ItextTranslationRootDefinition.ts +41 -0
- package/src/parse/model/ItextTranslation/ItextTranslationsDefinition.ts +31 -0
- package/src/parse/model/LeafNodeDefinition.ts +4 -1
- package/src/parse/model/ModelBindMap.ts +6 -8
- package/src/parse/model/ModelDefinition.ts +6 -1
- package/src/parse/model/NodeDefinition.ts +0 -3
- package/src/parse/model/NoteNodeDefinition.ts +3 -3
- package/src/parse/model/RootDefinition.ts +2 -1
- package/src/parse/model/SecondaryInstance/SecondaryInstanceDefinition.ts +4 -0
- package/src/parse/model/SecondaryInstance/SecondaryInstanceRootDefinition.ts +12 -0
- package/src/parse/model/SecondaryInstance/SecondaryInstancesDefinition.ts +102 -0
- package/src/parse/model/SecondaryInstance/sources/BlankSecondaryInstanceSource.ts +40 -0
- package/src/parse/model/SecondaryInstance/sources/CSVExternalSecondaryInstance.ts +288 -0
- package/src/parse/model/SecondaryInstance/sources/ExternalSecondaryInstanceResource.ts +222 -0
- package/src/parse/model/SecondaryInstance/sources/ExternalSecondaryInstanceSource.ts +22 -0
- package/src/parse/model/SecondaryInstance/sources/GeoJSONExternalSecondaryInstance.ts +414 -0
- package/src/parse/model/SecondaryInstance/sources/InternalSecondaryInstanceSource.ts +19 -0
- package/src/parse/model/SecondaryInstance/sources/SecondaryInstanceSource.ts +29 -0
- package/src/parse/model/SecondaryInstance/sources/XMLExternalSecondaryInstanceSource.ts +32 -0
- package/src/parse/shared/parseStaticDocumentFromDOMSubtree.ts +149 -0
- package/src/parse/text/abstract/TextRangeDefinition.ts +0 -6
- package/src/parse/xpath/semantic-analysis.ts +29 -0
- package/dist/client/StringNode.d.ts +0 -46
- package/dist/instance/StringField.d.ts +0 -44
- package/dist/instance/internal-api/SubscribableDependency.d.ts +0 -59
- package/dist/parse/XFormDataType.d.ts +0 -25
- package/src/client/StringNode.ts +0 -52
- package/src/instance/StringField.ts +0 -120
- package/src/instance/internal-api/SubscribableDependency.ts +0 -61
- package/src/parse/XFormDataType.ts +0 -62
|
@@ -1,15 +1,22 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { XPathNodeKindKey } from '@getodk/xpath';
|
|
2
2
|
import type { Accessor } from 'solid-js';
|
|
3
|
+
import { createMemo } from 'solid-js';
|
|
3
4
|
import type { BaseNode } from '../../client/BaseNode.ts';
|
|
5
|
+
import type { ActiveLanguage } from '../../client/FormLanguage.ts';
|
|
6
|
+
import type { InstanceNodeType } from '../../client/node-types.ts';
|
|
7
|
+
import type { PrimaryInstanceXPathChildNode } from '../../integration/xpath/adapter/kind.ts';
|
|
8
|
+
import type {
|
|
9
|
+
XFormsXPathPrimaryInstanceDescendantNode,
|
|
10
|
+
XFormsXPathPrimaryInstanceDescendantNodeKind,
|
|
11
|
+
} from '../../integration/xpath/adapter/XFormsXPathNode.ts';
|
|
12
|
+
import { XFORMS_XPATH_NODE_RANGE_KIND } from '../../integration/xpath/adapter/XFormsXPathNode.ts';
|
|
13
|
+
import type { EngineXPathEvaluator } from '../../integration/xpath/EngineXPathEvaluator.ts';
|
|
4
14
|
import { createComputedExpression } from '../../lib/reactivity/createComputedExpression.ts';
|
|
5
15
|
import type { ReactiveScope } from '../../lib/reactivity/scope.ts';
|
|
6
16
|
import type { AnyDescendantNodeDefinition } from '../../parse/model/DescendentNodeDefinition.ts';
|
|
7
|
-
import type { LeafNodeDefinition } from '../../parse/model/LeafNodeDefinition.ts';
|
|
8
17
|
import type { AnyNodeDefinition } from '../../parse/model/NodeDefinition.ts';
|
|
9
|
-
import type {
|
|
10
|
-
import type { AnyChildNode, GeneralParentNode, RepeatRange } from '../hierarchy.ts';
|
|
18
|
+
import type { AnyChildNode, AnyParentNode, RepeatRange } from '../hierarchy.ts';
|
|
11
19
|
import type { EvaluationContext } from '../internal-api/EvaluationContext.ts';
|
|
12
|
-
import type { SubscribableDependency } from '../internal-api/SubscribableDependency.ts';
|
|
13
20
|
import type { RepeatInstance } from '../repeat/RepeatInstance.ts';
|
|
14
21
|
import type { Root } from '../Root.ts';
|
|
15
22
|
import type { InstanceNodeStateSpec } from './InstanceNode.ts';
|
|
@@ -34,19 +41,13 @@ export type DescendantNodeDefinition = Extract<
|
|
|
34
41
|
AnyDescendantNodeDefinition
|
|
35
42
|
>;
|
|
36
43
|
|
|
37
|
-
// prettier-ignore
|
|
38
|
-
export type DescendantNodeParent<Definition extends DescendantNodeDefinition> =
|
|
39
|
-
Definition extends LeafNodeDefinition
|
|
40
|
-
? GeneralParentNode
|
|
41
|
-
: Definition extends RepeatInstanceDefinition
|
|
42
|
-
? RepeatRange
|
|
43
|
-
: GeneralParentNode;
|
|
44
|
-
|
|
45
44
|
export type AnyDescendantNode = DescendantNode<
|
|
46
45
|
DescendantNodeDefinition,
|
|
47
46
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
48
47
|
DescendantNodeStateSpec<any>,
|
|
49
48
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
49
|
+
any,
|
|
50
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
50
51
|
any
|
|
51
52
|
>;
|
|
52
53
|
|
|
@@ -58,11 +59,18 @@ export abstract class DescendantNode<
|
|
|
58
59
|
Definition extends DescendantNodeDefinition,
|
|
59
60
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
60
61
|
Spec extends DescendantNodeStateSpec<any>,
|
|
62
|
+
Parent extends AnyParentNode,
|
|
61
63
|
Child extends AnyChildNode | null = null,
|
|
62
64
|
>
|
|
63
|
-
extends InstanceNode<Definition, Spec, Child>
|
|
64
|
-
implements BaseNode,
|
|
65
|
+
extends InstanceNode<Definition, Spec, Parent, Child>
|
|
66
|
+
implements BaseNode, XFormsXPathPrimaryInstanceDescendantNode, EvaluationContext
|
|
65
67
|
{
|
|
68
|
+
/**
|
|
69
|
+
* Partial implementation of {@link isAttached}, used to check whether `this`
|
|
70
|
+
* is present in {@link parent}'s children state.
|
|
71
|
+
*/
|
|
72
|
+
protected readonly isAttachedDescendant: Accessor<boolean>;
|
|
73
|
+
|
|
66
74
|
readonly hasReadonlyAncestor: Accessor<boolean> = () => {
|
|
67
75
|
const { parent } = this;
|
|
68
76
|
|
|
@@ -97,51 +105,88 @@ export abstract class DescendantNode<
|
|
|
97
105
|
|
|
98
106
|
readonly isRequired: Accessor<boolean>;
|
|
99
107
|
|
|
108
|
+
// XFormsXPathPrimaryInstanceDescendantNode
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* WARNING! Ideally, this would be an abstract property, defined by each
|
|
112
|
+
* concrete subclass (or other intermediate abstract classes, where
|
|
113
|
+
* appropriate). Unfortunately it must be assigned here, so it will be present
|
|
114
|
+
* for certain XPath DOM adapter functionality **during** each concrete node's
|
|
115
|
+
* construction.
|
|
116
|
+
*
|
|
117
|
+
* Those subclasses nevertheless override this same property, assigning the
|
|
118
|
+
* same value, for the purposes of narrowing the XPath node kind semantics
|
|
119
|
+
* appropriate for each node type.
|
|
120
|
+
*/
|
|
121
|
+
override readonly [XPathNodeKindKey]: XFormsXPathPrimaryInstanceDescendantNodeKind;
|
|
100
122
|
readonly root: Root;
|
|
101
|
-
|
|
102
|
-
|
|
123
|
+
|
|
124
|
+
// BaseNode
|
|
125
|
+
abstract override readonly nodeType: InstanceNodeType;
|
|
126
|
+
|
|
127
|
+
// EvaluationContext
|
|
128
|
+
readonly isAttached: Accessor<boolean>;
|
|
129
|
+
readonly evaluator: EngineXPathEvaluator;
|
|
130
|
+
override readonly contextNode: PrimaryInstanceXPathChildNode =
|
|
131
|
+
this as AnyDescendantNode as PrimaryInstanceXPathChildNode;
|
|
132
|
+
readonly getActiveLanguage: Accessor<ActiveLanguage>;
|
|
103
133
|
|
|
104
134
|
constructor(
|
|
105
|
-
override readonly parent:
|
|
135
|
+
override readonly parent: Parent,
|
|
106
136
|
override readonly definition: Definition,
|
|
107
137
|
options?: DescendantNodeOptions
|
|
108
138
|
) {
|
|
109
139
|
super(parent.engineConfig, parent, definition, options);
|
|
110
140
|
|
|
111
|
-
|
|
141
|
+
if (this.isRoot()) {
|
|
142
|
+
this.root = this;
|
|
143
|
+
} else {
|
|
144
|
+
this.root = parent.root;
|
|
145
|
+
}
|
|
112
146
|
|
|
113
|
-
|
|
114
|
-
this.evaluator = evaluator;
|
|
115
|
-
this.contextNode = this.initializeContextNode(parent.contextNode, definition.nodeName);
|
|
147
|
+
const { evaluator } = parent;
|
|
116
148
|
|
|
117
|
-
|
|
149
|
+
// See notes on property declaration
|
|
150
|
+
if (definition.type === 'repeat-range') {
|
|
151
|
+
this[XPathNodeKindKey] = XFORMS_XPATH_NODE_RANGE_KIND;
|
|
152
|
+
} else {
|
|
153
|
+
this[XPathNodeKindKey] = 'element';
|
|
154
|
+
}
|
|
118
155
|
|
|
119
|
-
|
|
120
|
-
this.isSelfRelevant = createComputedExpression(this, relevant);
|
|
121
|
-
this.isRequired = createComputedExpression(this, required);
|
|
122
|
-
}
|
|
156
|
+
const self = this as AnyDescendantNode as AnyChildNode;
|
|
123
157
|
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
158
|
+
this.isAttachedDescendant = this.scope.runTask(() => {
|
|
159
|
+
return createMemo(() => {
|
|
160
|
+
for (const child of parent.getChildren()) {
|
|
161
|
+
if (child === self) {
|
|
162
|
+
return true;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
127
165
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
const element = this.createContextNode(parentContextNode, nodeName);
|
|
166
|
+
return false;
|
|
167
|
+
});
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
this.isAttached = this.scope.runTask(() => {
|
|
171
|
+
return createMemo(() => {
|
|
172
|
+
return this.parent.isAttached() && this.isAttachedDescendant();
|
|
173
|
+
});
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
this.evaluator = evaluator;
|
|
177
|
+
this.getActiveLanguage = parent.getActiveLanguage;
|
|
141
178
|
|
|
142
|
-
|
|
179
|
+
const { readonly, relevant, required } = definition.bind;
|
|
143
180
|
|
|
144
|
-
|
|
181
|
+
this.isSelfReadonly = createComputedExpression(this, readonly, {
|
|
182
|
+
defaultValue: true,
|
|
183
|
+
});
|
|
184
|
+
this.isSelfRelevant = createComputedExpression(this, relevant, {
|
|
185
|
+
defaultValue: false,
|
|
186
|
+
});
|
|
187
|
+
this.isRequired = createComputedExpression(this, required, {
|
|
188
|
+
defaultValue: false,
|
|
189
|
+
});
|
|
145
190
|
}
|
|
146
191
|
|
|
147
192
|
/**
|
|
@@ -1,10 +1,18 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { XPathNodeKindKey } from '@getodk/xpath';
|
|
2
2
|
import type { Accessor, Signal } from 'solid-js';
|
|
3
3
|
import type { BaseNode } from '../../client/BaseNode.ts';
|
|
4
4
|
import type { NodeAppearances } from '../../client/NodeAppearances.ts';
|
|
5
|
-
import type {
|
|
5
|
+
import type { FormNodeID } from '../../client/identity.ts';
|
|
6
|
+
import type { InstanceNodeType as ClientInstanceNodeType } from '../../client/node-types.ts';
|
|
7
|
+
import type { SubmissionState } from '../../client/submission/SubmissionState.ts';
|
|
6
8
|
import type { NodeValidationState } from '../../client/validation.ts';
|
|
7
|
-
import type { TextRange } from '../../index.ts';
|
|
9
|
+
import type { ActiveLanguage, TextRange } from '../../index.ts';
|
|
10
|
+
import type { EngineXPathEvaluator } from '../../integration/xpath/EngineXPathEvaluator.ts';
|
|
11
|
+
import type {
|
|
12
|
+
XFormsXPathPrimaryInstanceNode,
|
|
13
|
+
XFormsXPathPrimaryInstanceNodeKind,
|
|
14
|
+
} from '../../integration/xpath/adapter/XFormsXPathNode.ts';
|
|
15
|
+
import type { PrimaryInstanceXPathNode } from '../../integration/xpath/adapter/kind.ts';
|
|
8
16
|
import type { MaterializedChildren } from '../../lib/reactivity/materializeCurrentStateChildren.ts';
|
|
9
17
|
import type { CurrentState } from '../../lib/reactivity/node-state/createCurrentState.ts';
|
|
10
18
|
import type { EngineState } from '../../lib/reactivity/node-state/createEngineState.ts';
|
|
@@ -13,13 +21,18 @@ import type { ReactiveScope } from '../../lib/reactivity/scope.ts';
|
|
|
13
21
|
import { createReactiveScope } from '../../lib/reactivity/scope.ts';
|
|
14
22
|
import type { SimpleAtomicState } from '../../lib/reactivity/types.ts';
|
|
15
23
|
import type { AnyNodeDefinition } from '../../parse/model/NodeDefinition.ts';
|
|
24
|
+
import type { PrimaryInstance } from '../PrimaryInstance.ts';
|
|
16
25
|
import type { Root } from '../Root.ts';
|
|
17
26
|
import type { AnyChildNode, AnyNode, AnyParentNode } from '../hierarchy.ts';
|
|
18
|
-
import
|
|
19
|
-
import { declareNodeID } from '../identity.ts';
|
|
27
|
+
import { nodeID } from '../identity.ts';
|
|
20
28
|
import type { EvaluationContext } from '../internal-api/EvaluationContext.ts';
|
|
21
29
|
import type { InstanceConfig } from '../internal-api/InstanceConfig.ts';
|
|
22
|
-
|
|
30
|
+
|
|
31
|
+
export type EngineInstanceNodeType = ClientInstanceNodeType | 'primary-instance';
|
|
32
|
+
|
|
33
|
+
export interface BaseEngineNode extends Omit<BaseNode, 'nodeType'> {
|
|
34
|
+
readonly nodeType: EngineInstanceNodeType;
|
|
35
|
+
}
|
|
23
36
|
|
|
24
37
|
export interface InstanceNodeStateSpec<Value = never> {
|
|
25
38
|
readonly reference: Accessor<string> | string;
|
|
@@ -28,7 +41,7 @@ export interface InstanceNodeStateSpec<Value = never> {
|
|
|
28
41
|
readonly required: Accessor<boolean> | boolean;
|
|
29
42
|
readonly label: Accessor<TextRange<'label'> | null> | null;
|
|
30
43
|
readonly hint: Accessor<TextRange<'hint'> | null> | null;
|
|
31
|
-
readonly children: Accessor<readonly
|
|
44
|
+
readonly children: Accessor<readonly FormNodeID[]> | null;
|
|
32
45
|
readonly valueOptions: Accessor<null> | Accessor<readonly unknown[]> | null;
|
|
33
46
|
readonly value: Signal<Value> | SimpleAtomicState<Value> | null;
|
|
34
47
|
}
|
|
@@ -71,19 +84,26 @@ type ComputeInstanceNodeReference = <This extends ComputableReferenceNode>(
|
|
|
71
84
|
|
|
72
85
|
export interface InstanceNodeOptions {
|
|
73
86
|
readonly computeReference?: () => string;
|
|
87
|
+
readonly scope?: ReactiveScope;
|
|
74
88
|
}
|
|
75
89
|
|
|
76
90
|
export abstract class InstanceNode<
|
|
77
91
|
Definition extends AnyNodeDefinition,
|
|
78
92
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
79
93
|
Spec extends InstanceNodeStateSpec<any>,
|
|
94
|
+
Parent extends AnyParentNode | null,
|
|
80
95
|
Child extends AnyChildNode | null = null,
|
|
81
96
|
>
|
|
82
|
-
implements
|
|
97
|
+
implements BaseEngineNode, XFormsXPathPrimaryInstanceNode, EvaluationContext
|
|
83
98
|
{
|
|
84
99
|
protected abstract readonly state: SharedNodeState<Spec>;
|
|
85
100
|
protected abstract readonly engineState: EngineState<Spec>;
|
|
86
101
|
|
|
102
|
+
// XFormsXPathPrimaryInstanceNode
|
|
103
|
+
abstract readonly [XPathNodeKindKey]: XFormsXPathPrimaryInstanceNodeKind;
|
|
104
|
+
readonly rootDocument: PrimaryInstance;
|
|
105
|
+
abstract readonly root: Root;
|
|
106
|
+
|
|
87
107
|
/**
|
|
88
108
|
* @package Exposed on every node type to facilitate inheritance, as well as
|
|
89
109
|
* conditional behavior for value nodes.
|
|
@@ -109,10 +129,10 @@ export abstract class InstanceNode<
|
|
|
109
129
|
abstract readonly isRelevant: Accessor<boolean>;
|
|
110
130
|
|
|
111
131
|
// BaseNode: identity
|
|
112
|
-
readonly nodeId:
|
|
132
|
+
readonly nodeId: FormNodeID;
|
|
113
133
|
|
|
114
134
|
// BaseNode: node types and variants (e.g. for narrowing)
|
|
115
|
-
abstract readonly nodeType:
|
|
135
|
+
abstract readonly nodeType: EngineInstanceNodeType;
|
|
116
136
|
|
|
117
137
|
abstract readonly appearances: NodeAppearances<Definition>;
|
|
118
138
|
|
|
@@ -120,15 +140,15 @@ export abstract class InstanceNode<
|
|
|
120
140
|
|
|
121
141
|
abstract readonly validationState: NodeValidationState;
|
|
122
142
|
|
|
123
|
-
|
|
124
|
-
abstract readonly root: Root;
|
|
143
|
+
abstract readonly submissionState: SubmissionState;
|
|
125
144
|
|
|
126
145
|
// EvaluationContext: instance-global/shared
|
|
127
|
-
abstract readonly evaluator:
|
|
146
|
+
abstract readonly evaluator: EngineXPathEvaluator;
|
|
147
|
+
abstract readonly getActiveLanguage: Accessor<ActiveLanguage>;
|
|
128
148
|
|
|
129
|
-
// EvaluationContext
|
|
149
|
+
// EvaluationContext: node-specific
|
|
150
|
+
abstract readonly isAttached: Accessor<boolean>;
|
|
130
151
|
readonly scope: ReactiveScope;
|
|
131
|
-
|
|
132
152
|
readonly computeReference: ComputeInstanceNodeReference;
|
|
133
153
|
|
|
134
154
|
protected readonly computeChildStepReference: ComputeInstanceNodeReference = (
|
|
@@ -149,114 +169,92 @@ export abstract class InstanceNode<
|
|
|
149
169
|
return this.computeReference(this.parent, this.definition);
|
|
150
170
|
};
|
|
151
171
|
|
|
152
|
-
|
|
172
|
+
/**
|
|
173
|
+
* Note: it is expected that at least some node subclasses will override this
|
|
174
|
+
* to reflect (or in the case of intermediate abstract base classes, to
|
|
175
|
+
* constrain) their more specific `this` type.
|
|
176
|
+
*/
|
|
177
|
+
readonly contextNode: PrimaryInstanceXPathNode =
|
|
178
|
+
this as AnyInstanceNode as PrimaryInstanceXPathNode;
|
|
153
179
|
|
|
154
180
|
constructor(
|
|
155
181
|
readonly engineConfig: InstanceConfig,
|
|
156
|
-
readonly parent:
|
|
182
|
+
readonly parent: Parent,
|
|
157
183
|
readonly definition: Definition,
|
|
158
184
|
options?: InstanceNodeOptions
|
|
159
185
|
) {
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
this.scope = createReactiveScope();
|
|
163
|
-
this.engineConfig = engineConfig;
|
|
164
|
-
this.nodeId = declareNodeID(engineConfig.createUniqueId());
|
|
165
|
-
this.definition = definition;
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
/**
|
|
169
|
-
* @package This presently serves a few internal use cases, where certain
|
|
170
|
-
* behaviors depend on arbitrary traversal from any point in the instance
|
|
171
|
-
* tree, without particular regard for the visited node type. It isn't
|
|
172
|
-
* intended for external traversal or any other means of consuming children by
|
|
173
|
-
* a client. This return type intentionally deviates from one structural
|
|
174
|
-
* expectation, requiring even leaf nodes to return an array (though for those
|
|
175
|
-
* nodes it will always be empty). This affords consistency and efficiency of
|
|
176
|
-
* interface for those internal uses.
|
|
177
|
-
*/
|
|
178
|
-
abstract getChildren(this: AnyInstanceNode): readonly AnyChildNode[];
|
|
186
|
+
const self = this as AnyInstanceNode as AnyNode;
|
|
179
187
|
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
if (visited.has(this)) {
|
|
186
|
-
return [];
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
visited.add(this);
|
|
190
|
-
|
|
191
|
-
const { nodeset } = this.definition;
|
|
192
|
-
|
|
193
|
-
if (dependencyReference === nodeset) {
|
|
194
|
-
if (this.nodeType === 'repeat-instance') {
|
|
195
|
-
return [this.parent];
|
|
188
|
+
if (parent == null) {
|
|
189
|
+
if (!self.isPrimaryInstance()) {
|
|
190
|
+
throw new Error(
|
|
191
|
+
'Failed to construct node: not a primary instance, no parent node specified'
|
|
192
|
+
);
|
|
196
193
|
}
|
|
197
194
|
|
|
198
|
-
|
|
195
|
+
this.rootDocument = self;
|
|
196
|
+
} else {
|
|
197
|
+
this.rootDocument = parent.rootDocument;
|
|
199
198
|
}
|
|
200
199
|
|
|
201
|
-
|
|
202
|
-
dependencyReference.startsWith(`${nodeset}/`) ||
|
|
203
|
-
dependencyReference.startsWith(`${nodeset}[`)
|
|
204
|
-
) {
|
|
205
|
-
return this.getChildren().flatMap((child) => {
|
|
206
|
-
return child.getNodesByReference(visited, dependencyReference);
|
|
207
|
-
});
|
|
208
|
-
}
|
|
200
|
+
this.computeReference = options?.computeReference ?? this.computeChildStepReference;
|
|
209
201
|
|
|
210
|
-
|
|
202
|
+
this.scope = options?.scope ?? createReactiveScope();
|
|
203
|
+
this.engineConfig = engineConfig;
|
|
204
|
+
this.nodeId = nodeID(engineConfig.createUniqueId());
|
|
205
|
+
this.definition = definition;
|
|
211
206
|
}
|
|
212
207
|
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
this
|
|
216
|
-
|
|
217
|
-
): readonly SubscribableDependency[] {
|
|
218
|
-
if (this.nodeType === 'root') {
|
|
219
|
-
const visited = new WeakSet<AnyNode>();
|
|
220
|
-
|
|
221
|
-
return this.getNodesByReference(visited, reference);
|
|
222
|
-
}
|
|
208
|
+
/** @package */
|
|
209
|
+
isPrimaryInstance(): this is PrimaryInstance {
|
|
210
|
+
return this.parent == null;
|
|
211
|
+
}
|
|
223
212
|
|
|
224
|
-
|
|
213
|
+
/** @package */
|
|
214
|
+
isRoot(): this is Root {
|
|
215
|
+
return this.parent?.nodeType === 'primary-instance';
|
|
225
216
|
}
|
|
226
217
|
|
|
227
|
-
// SubscribableDependency
|
|
228
218
|
/**
|
|
229
|
-
* This
|
|
230
|
-
*
|
|
231
|
-
*
|
|
219
|
+
* @package This presently serves a growing variety of internal use cases,
|
|
220
|
+
* where certain behaviors depend on arbitrary traversal from any point in the
|
|
221
|
+
* instance tree, without particular regard for the visited node type. It
|
|
222
|
+
* isn't intended for external traversal or any other means of consuming
|
|
223
|
+
* children by a client. This return type intentionally deviates from one
|
|
224
|
+
* structural expectation, requiring even leaf nodes to return an array
|
|
225
|
+
* (though for those nodes it will always be empty). This affords consistency
|
|
226
|
+
* and efficiency of interface for those internal uses.
|
|
232
227
|
*/
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
228
|
+
abstract getChildren(this: AnyInstanceNode): readonly AnyChildNode[];
|
|
229
|
+
|
|
230
|
+
// XFormsXPathNode
|
|
231
|
+
/**
|
|
232
|
+
* @todo Values as text nodes(?)
|
|
233
|
+
*/
|
|
234
|
+
getXPathChildNodes(): readonly AnyChildNode[] {
|
|
235
|
+
return (this as AnyInstanceNode).getChildren().flatMap((child) => {
|
|
236
|
+
switch (child.nodeType) {
|
|
237
|
+
case 'repeat-range:controlled':
|
|
238
|
+
case 'repeat-range:uncontrolled': {
|
|
239
|
+
const repeatInstances = child.getXPathChildNodes();
|
|
240
|
+
|
|
241
|
+
if (repeatInstances.length > 0) {
|
|
242
|
+
return repeatInstances;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
return child;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
default:
|
|
249
|
+
return child;
|
|
250
|
+
}
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
getXPathValue(): string {
|
|
255
|
+
return (this as AnyInstanceNode as AnyNode)
|
|
256
|
+
.getXPathChildNodes()
|
|
257
|
+
.map((child) => child.getXPathValue())
|
|
258
|
+
.join('');
|
|
261
259
|
}
|
|
262
260
|
}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { identity } from '@getodk/common/lib/identity.ts';
|
|
2
|
+
import { XPathNodeKindKey } from '@getodk/xpath';
|
|
2
3
|
import type { Accessor } from 'solid-js';
|
|
3
4
|
import type { UnsupportedControlNodeType } from '../../client/node-types.ts';
|
|
5
|
+
import type { SubmissionState } from '../../client/submission/SubmissionState.ts';
|
|
4
6
|
import type { TextRange } from '../../client/TextRange.ts';
|
|
5
7
|
import type {
|
|
6
8
|
UnsupportedControlDefinition,
|
|
@@ -8,6 +10,8 @@ import type {
|
|
|
8
10
|
UnsupportedControlNode,
|
|
9
11
|
} from '../../client/unsupported/UnsupportedControlNode.ts';
|
|
10
12
|
import type { AnyViolation, LeafNodeValidationState } from '../../client/validation.ts';
|
|
13
|
+
import type { XFormsXPathElement } from '../../integration/xpath/adapter/XFormsXPathNode.ts';
|
|
14
|
+
import { createLeafNodeSubmissionState } from '../../lib/client-reactivity/submission/createLeafNodeSubmissionState.ts';
|
|
11
15
|
import { createValueState } from '../../lib/reactivity/createValueState.ts';
|
|
12
16
|
import type { CurrentState } from '../../lib/reactivity/node-state/createCurrentState.ts';
|
|
13
17
|
import type { EngineState } from '../../lib/reactivity/node-state/createEngineState.ts';
|
|
@@ -23,9 +27,9 @@ import {
|
|
|
23
27
|
type SharedValidationState,
|
|
24
28
|
} from '../../lib/reactivity/validation/createValidation.ts';
|
|
25
29
|
import type { UnknownAppearanceDefinition } from '../../parse/body/appearance/unknownAppearanceParser.ts';
|
|
26
|
-
import type { GeneralParentNode } from '../hierarchy.ts';
|
|
30
|
+
import type { AnyUnsupportedControl, GeneralParentNode } from '../hierarchy.ts';
|
|
27
31
|
import type { EvaluationContext } from '../internal-api/EvaluationContext.ts';
|
|
28
|
-
import type {
|
|
32
|
+
import type { ClientReactiveSubmittableLeafNode } from '../internal-api/submission/ClientReactiveSubmittableLeafNode.ts';
|
|
29
33
|
import type { ValidationContext } from '../internal-api/ValidationContext.ts';
|
|
30
34
|
import type { ValueContext } from '../internal-api/ValueContext.ts';
|
|
31
35
|
import { DescendantNode, type DescendantNodeStateSpec } from './DescendantNode.ts';
|
|
@@ -61,17 +65,26 @@ class UnsupportedControlWriteError extends Error {
|
|
|
61
65
|
}
|
|
62
66
|
|
|
63
67
|
export abstract class UnsupportedControl<Type extends UnsupportedControlNodeType>
|
|
64
|
-
extends DescendantNode<
|
|
68
|
+
extends DescendantNode<
|
|
69
|
+
TypedUnsupportedControlDefinition<Type>,
|
|
70
|
+
UnsupportedControlStateSpec,
|
|
71
|
+
GeneralParentNode,
|
|
72
|
+
null
|
|
73
|
+
>
|
|
65
74
|
implements
|
|
66
75
|
UnsupportedControlNode,
|
|
76
|
+
XFormsXPathElement,
|
|
67
77
|
EvaluationContext,
|
|
68
|
-
SubscribableDependency,
|
|
69
78
|
ValidationContext,
|
|
70
|
-
ValueContext<unknown
|
|
79
|
+
ValueContext<unknown>,
|
|
80
|
+
ClientReactiveSubmittableLeafNode<unknown>
|
|
71
81
|
{
|
|
72
82
|
private readonly validation: SharedValidationState;
|
|
73
83
|
protected readonly state: SharedNodeState<UnsupportedControlStateSpec>;
|
|
74
84
|
|
|
85
|
+
// XFormsXPathElement
|
|
86
|
+
override readonly [XPathNodeKindKey] = 'element';
|
|
87
|
+
|
|
75
88
|
// InstanceNode
|
|
76
89
|
protected readonly engineState: EngineState<UnsupportedControlStateSpec>;
|
|
77
90
|
|
|
@@ -85,7 +98,11 @@ export abstract class UnsupportedControl<Type extends UnsupportedControlNodeType
|
|
|
85
98
|
return this.validation.currentState;
|
|
86
99
|
}
|
|
87
100
|
|
|
101
|
+
readonly submissionState: SubmissionState;
|
|
102
|
+
|
|
88
103
|
// ValueContext
|
|
104
|
+
abstract override readonly contextNode: AnyUnsupportedControl & this;
|
|
105
|
+
|
|
89
106
|
readonly encodeValue = (instanceValue: unknown): string => {
|
|
90
107
|
const encoded = instanceValue;
|
|
91
108
|
|
|
@@ -128,6 +145,12 @@ export abstract class UnsupportedControl<Type extends UnsupportedControlNodeType
|
|
|
128
145
|
this.engineState = state.engineState;
|
|
129
146
|
this.currentState = state.currentState;
|
|
130
147
|
this.validation = createValidationState(this, sharedStateOptions);
|
|
148
|
+
this.submissionState = createLeafNodeSubmissionState(this);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// XFormsXPathElement
|
|
152
|
+
override getXPathValue(): string {
|
|
153
|
+
return this.encodeValue(this.engineState.value);
|
|
131
154
|
}
|
|
132
155
|
|
|
133
156
|
// ValidationContext
|