@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
|
@@ -29,7 +29,6 @@ export abstract class DescendentNodeDefinition<
|
|
|
29
29
|
|
|
30
30
|
readonly root: RootDefinition;
|
|
31
31
|
readonly nodeset: string;
|
|
32
|
-
readonly dependencyExpressions: ReadonlySet<string>;
|
|
33
32
|
readonly isTranslated: boolean = false;
|
|
34
33
|
|
|
35
34
|
constructor(
|
|
@@ -43,11 +42,6 @@ export abstract class DescendentNodeDefinition<
|
|
|
43
42
|
if (bind.isTranslated || bodyElement?.isTranslated) {
|
|
44
43
|
this.isTranslated = true;
|
|
45
44
|
}
|
|
46
|
-
|
|
47
|
-
this.dependencyExpressions = new Set([
|
|
48
|
-
...bind.dependencyExpressions,
|
|
49
|
-
...(bodyElement?.dependencyExpressions ?? []),
|
|
50
|
-
]);
|
|
51
45
|
}
|
|
52
46
|
}
|
|
53
47
|
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { SubmissionDefinition } from '../../client/submission/SubmissionDefinition.ts';
|
|
2
|
+
import { getSubmissionElement } from '../../lib/dom/query.ts';
|
|
3
|
+
import type { XFormDOM } from '../XFormDOM.ts';
|
|
4
|
+
|
|
5
|
+
export class FormSubmissionDefinition implements SubmissionDefinition {
|
|
6
|
+
readonly submissionAction!: URL | null;
|
|
7
|
+
readonly submissionMethod = 'post';
|
|
8
|
+
readonly encryptionKey!: string | null;
|
|
9
|
+
|
|
10
|
+
constructor(xformDOM: XFormDOM) {
|
|
11
|
+
const submissionElement = getSubmissionElement(xformDOM.model);
|
|
12
|
+
|
|
13
|
+
let submissionAction: URL | null = null;
|
|
14
|
+
let submissionMethod: 'post';
|
|
15
|
+
let encryptionKey: string | null = null;
|
|
16
|
+
|
|
17
|
+
if (submissionElement == null) {
|
|
18
|
+
submissionAction = null;
|
|
19
|
+
submissionMethod = 'post';
|
|
20
|
+
encryptionKey = null;
|
|
21
|
+
} else {
|
|
22
|
+
const method = submissionElement.getAttribute('method')?.trim();
|
|
23
|
+
|
|
24
|
+
if (method == null || method === 'post' || method === 'form-data-post') {
|
|
25
|
+
submissionMethod = 'post';
|
|
26
|
+
} else {
|
|
27
|
+
throw new Error(`Unexpected <submission method>: ${method}`);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const action = submissionElement.getAttribute('action');
|
|
31
|
+
|
|
32
|
+
if (action != null) {
|
|
33
|
+
// TODO: this is known-fallible.
|
|
34
|
+
submissionAction = new URL(action.trim());
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
encryptionKey = submissionElement.getAttribute('base64RsaPublicKey');
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
this.submissionAction = submissionAction;
|
|
41
|
+
this.submissionMethod = submissionMethod;
|
|
42
|
+
this.encryptionKey = encryptionKey;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { StaticDocument } from '../../../integration/xpath/static-dom/StaticDocument.ts';
|
|
2
|
+
import { ItextTranslationRootDefinition } from './ItextTranslationRootDefinition.ts';
|
|
3
|
+
|
|
4
|
+
export class ItextTranslationDefinition extends StaticDocument<ItextTranslationRootDefinition> {}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { XFormsItextTranslationElement } from '@getodk/xpath';
|
|
2
|
+
import { XFORMS_KNOWN_ATTRIBUTE, XFORMS_LOCAL_NAME } from '@getodk/xpath';
|
|
3
|
+
import { StaticElement } from '../../../integration/xpath/static-dom/StaticElement.ts';
|
|
4
|
+
|
|
5
|
+
// prettier-ignore
|
|
6
|
+
type ItextTranslationRootKnownAttributeValue<LocalName extends string> =
|
|
7
|
+
LocalName extends 'lang'
|
|
8
|
+
? string
|
|
9
|
+
: string | null;
|
|
10
|
+
|
|
11
|
+
type AssertItextTranslationRootKnownAttributeValue = <LocalName extends string>(
|
|
12
|
+
localName: LocalName,
|
|
13
|
+
value: string | null
|
|
14
|
+
) => asserts value is ItextTranslationRootKnownAttributeValue<LocalName>;
|
|
15
|
+
|
|
16
|
+
const assertItextTranslationRootKnownAttributeValue: AssertItextTranslationRootKnownAttributeValue =
|
|
17
|
+
(localName, value) => {
|
|
18
|
+
if (localName === 'lang' && value == null) {
|
|
19
|
+
throw new Error('Invalid itext <translation> element: missing `lang` attribute');
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
export class ItextTranslationRootDefinition
|
|
24
|
+
extends StaticElement
|
|
25
|
+
implements XFormsItextTranslationElement<ItextTranslationRootDefinition>
|
|
26
|
+
{
|
|
27
|
+
override readonly [XFORMS_LOCAL_NAME] = 'translation';
|
|
28
|
+
override readonly [XFORMS_KNOWN_ATTRIBUTE] = 'lang';
|
|
29
|
+
|
|
30
|
+
override getAttributeValue(localName: 'lang'): string;
|
|
31
|
+
override getAttributeValue(localName: string): string | null;
|
|
32
|
+
override getAttributeValue<LocalName extends string>(
|
|
33
|
+
localName: LocalName
|
|
34
|
+
): ItextTranslationRootKnownAttributeValue<LocalName> {
|
|
35
|
+
const value = super.getAttributeValue(localName);
|
|
36
|
+
|
|
37
|
+
assertItextTranslationRootKnownAttributeValue(localName, value);
|
|
38
|
+
|
|
39
|
+
return value;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { XFormsItextTranslationMap } from '@getodk/xpath';
|
|
2
|
+
import type { EngineXPathNode } from '../../../integration/xpath/adapter/kind.ts';
|
|
3
|
+
import { parseStaticDocumentFromDOMSubtree } from '../../shared/parseStaticDocumentFromDOMSubtree.ts';
|
|
4
|
+
import type { XFormDOM } from '../../XFormDOM.ts';
|
|
5
|
+
import { ItextTranslationDefinition } from './ItextTranslationDefinition.ts';
|
|
6
|
+
import { ItextTranslationRootDefinition } from './ItextTranslationRootDefinition.ts';
|
|
7
|
+
|
|
8
|
+
export class ItextTranslationsDefinition
|
|
9
|
+
extends Map<string, ItextTranslationRootDefinition>
|
|
10
|
+
implements XFormsItextTranslationMap<EngineXPathNode>
|
|
11
|
+
{
|
|
12
|
+
static from(xformDOM: XFormDOM): ItextTranslationsDefinition {
|
|
13
|
+
const translationDefinitions = xformDOM.itextTranslationElements.map((element) => {
|
|
14
|
+
return parseStaticDocumentFromDOMSubtree(
|
|
15
|
+
ItextTranslationDefinition,
|
|
16
|
+
ItextTranslationRootDefinition,
|
|
17
|
+
element
|
|
18
|
+
);
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
return new this(translationDefinitions);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
private constructor(translations: readonly ItextTranslationDefinition[]) {
|
|
25
|
+
super(
|
|
26
|
+
translations.map(({ root }) => {
|
|
27
|
+
return [root.getAttributeValue('lang'), root];
|
|
28
|
+
})
|
|
29
|
+
);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -1,13 +1,15 @@
|
|
|
1
|
+
import type { ValueType } from '../../client/ValueType.ts';
|
|
1
2
|
import type { AnyBodyElementDefinition, ControlElementDefinition } from '../body/BodyDefinition.ts';
|
|
2
3
|
import type { BindDefinition } from './BindDefinition.ts';
|
|
3
4
|
import { DescendentNodeDefinition } from './DescendentNodeDefinition.ts';
|
|
4
5
|
import type { NodeDefinition, ParentNodeDefinition } from './NodeDefinition.ts';
|
|
5
6
|
|
|
6
|
-
export class LeafNodeDefinition
|
|
7
|
+
export class LeafNodeDefinition<V extends ValueType = ValueType>
|
|
7
8
|
extends DescendentNodeDefinition<'leaf-node', ControlElementDefinition | null>
|
|
8
9
|
implements NodeDefinition<'leaf-node'>
|
|
9
10
|
{
|
|
10
11
|
readonly type = 'leaf-node';
|
|
12
|
+
readonly valueType: V;
|
|
11
13
|
|
|
12
14
|
readonly nodeName: string;
|
|
13
15
|
readonly children = null;
|
|
@@ -26,6 +28,7 @@ export class LeafNodeDefinition
|
|
|
26
28
|
|
|
27
29
|
super(parent, bind, bodyElement);
|
|
28
30
|
|
|
31
|
+
this.valueType = bind.type.resolved satisfies ValueType as V;
|
|
29
32
|
this.nodeName = node.localName;
|
|
30
33
|
this.defaultValue = node.textContent ?? '';
|
|
31
34
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { XFormDefinition } from '../XFormDefinition.ts';
|
|
2
2
|
import { BindDefinition } from './BindDefinition.ts';
|
|
3
3
|
import type { BindElement, BindNodeset } from './BindElement.ts';
|
|
4
|
+
import { DEFAULT_BIND_TYPE } from './BindTypeDefinition.ts';
|
|
4
5
|
import type { ModelDefinition } from './ModelDefinition.ts';
|
|
5
6
|
|
|
6
7
|
class ArtificialBindElement implements BindElement {
|
|
@@ -15,6 +16,10 @@ class ArtificialBindElement implements BindElement {
|
|
|
15
16
|
return this.ancestorNodeset;
|
|
16
17
|
}
|
|
17
18
|
|
|
19
|
+
if (name === 'type') {
|
|
20
|
+
return DEFAULT_BIND_TYPE;
|
|
21
|
+
}
|
|
22
|
+
|
|
18
23
|
return null;
|
|
19
24
|
}
|
|
20
25
|
|
|
@@ -37,15 +42,8 @@ export class ModelBindMap extends Map<BindNodeset, BindDefinition> {
|
|
|
37
42
|
protected readonly form: XFormDefinition,
|
|
38
43
|
protected readonly model: ModelDefinition
|
|
39
44
|
) {
|
|
40
|
-
const bindElements = form.xformDOM.rootEvaluator.evaluateNodes<BindElement & Element>(
|
|
41
|
-
'./xf:bind[@nodeset]',
|
|
42
|
-
{
|
|
43
|
-
contextNode: form.xformDOM.model,
|
|
44
|
-
}
|
|
45
|
-
);
|
|
46
|
-
|
|
47
45
|
super(
|
|
48
|
-
|
|
46
|
+
form.xformDOM.binds.map((bindElement) => {
|
|
49
47
|
const nodeset = bindElement.getAttribute('nodeset');
|
|
50
48
|
const bind = new BindDefinition(form, model, nodeset, bindElement);
|
|
51
49
|
|
|
@@ -1,14 +1,19 @@
|
|
|
1
1
|
import type { XFormDefinition } from '../XFormDefinition.ts';
|
|
2
|
+
import { FormSubmissionDefinition } from './FormSubmissionDefinition.ts';
|
|
3
|
+
import { ItextTranslationsDefinition } from './ItextTranslation/ItextTranslationsDefinition.ts';
|
|
2
4
|
import { ModelBindMap } from './ModelBindMap.ts';
|
|
3
5
|
import { RootDefinition } from './RootDefinition.ts';
|
|
4
6
|
|
|
5
7
|
export class ModelDefinition {
|
|
6
8
|
readonly binds: ModelBindMap;
|
|
7
9
|
readonly root: RootDefinition;
|
|
10
|
+
readonly itextTranslations: ItextTranslationsDefinition;
|
|
8
11
|
|
|
9
12
|
constructor(readonly form: XFormDefinition) {
|
|
13
|
+
const submission = new FormSubmissionDefinition(form.xformDOM);
|
|
10
14
|
this.binds = ModelBindMap.fromModel(this);
|
|
11
|
-
this.root = new RootDefinition(form, this, form.body.classes);
|
|
15
|
+
this.root = new RootDefinition(form, this, submission, form.body.classes);
|
|
16
|
+
this.itextTranslations = ItextTranslationsDefinition.from(form.xformDOM);
|
|
12
17
|
}
|
|
13
18
|
|
|
14
19
|
toJSON() {
|
|
@@ -121,10 +121,7 @@ export interface NodeDefinition<Type extends NodeDefinitionType> {
|
|
|
121
121
|
readonly nodeset: string;
|
|
122
122
|
readonly nodeName: string;
|
|
123
123
|
readonly bodyElement: AnyBodyElementDefinition | RepeatElementDefinition | null;
|
|
124
|
-
|
|
125
124
|
readonly isTranslated: boolean;
|
|
126
|
-
readonly dependencyExpressions: ReadonlySet<string>;
|
|
127
|
-
|
|
128
125
|
readonly root: RootDefinition;
|
|
129
126
|
readonly parent: NodeParent<Type>;
|
|
130
127
|
readonly children: NodeChildren<Type>;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { NoteNode } from '../../client/NoteNode.ts';
|
|
2
2
|
import type { AnyBodyElementDefinition } from '../body/BodyDefinition.ts';
|
|
3
|
-
import type {
|
|
3
|
+
import type { InputControlDefinition } from '../body/control/InputControlDefinition.ts';
|
|
4
4
|
import { BindComputationExpression } from '../expression/BindComputationExpression.ts';
|
|
5
5
|
import type { ConstantTruthyDependentExpression } from '../expression/abstract/DependentExpression.ts';
|
|
6
6
|
import type { HintDefinition } from '../text/HintDefinition.ts';
|
|
@@ -31,7 +31,7 @@ export type NoteTextDefinition =
|
|
|
31
31
|
/**
|
|
32
32
|
* @package This class is used internally, both in static types and at runtime,
|
|
33
33
|
* to guard and guide the distinction between instance state nodes for 'note'
|
|
34
|
-
* and '
|
|
34
|
+
* and 'input' node types. It is intentionally package-private! The less
|
|
35
35
|
* specific {@link NoteNode.definition} type, if it has any client value at all,
|
|
36
36
|
* should be more than sufficient. Clients are otherwise expected to use other
|
|
37
37
|
* aspects of the node's interface (such as its {@link NoteNode.nodeType} and
|
|
@@ -61,7 +61,7 @@ export class NoteNodeDefinition extends LeafNodeDefinition {
|
|
|
61
61
|
constructor(
|
|
62
62
|
parent: ParentNodeDefinition,
|
|
63
63
|
override readonly bind: NoteBindDefinition,
|
|
64
|
-
override readonly bodyElement:
|
|
64
|
+
override readonly bodyElement: InputControlDefinition,
|
|
65
65
|
readonly noteTextDefinition: NoteTextDefinition,
|
|
66
66
|
node: Element
|
|
67
67
|
) {
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { BodyClassList } from '../body/BodyDefinition.ts';
|
|
2
2
|
import type { XFormDefinition } from '../XFormDefinition.ts';
|
|
3
3
|
import type { BindDefinition } from './BindDefinition.ts';
|
|
4
|
+
import type { FormSubmissionDefinition } from './FormSubmissionDefinition.ts';
|
|
4
5
|
import { LeafNodeDefinition } from './LeafNodeDefinition.ts';
|
|
5
6
|
import type { ModelDefinition } from './ModelDefinition.ts';
|
|
6
7
|
import type {
|
|
@@ -26,11 +27,11 @@ export class RootDefinition implements NodeDefinition<'root'> {
|
|
|
26
27
|
readonly defaultValue = null;
|
|
27
28
|
|
|
28
29
|
readonly isTranslated = false;
|
|
29
|
-
readonly dependencyExpressions: ReadonlySet<string> = new Set<string>();
|
|
30
30
|
|
|
31
31
|
constructor(
|
|
32
32
|
protected readonly form: XFormDefinition,
|
|
33
33
|
protected readonly model: ModelDefinition,
|
|
34
|
+
readonly submission: FormSubmissionDefinition,
|
|
34
35
|
readonly classes: BodyClassList
|
|
35
36
|
) {
|
|
36
37
|
// TODO: theoretically the pertinent step in the bind's `nodeset` *could* be
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { StaticDocument } from '../../../integration/xpath/static-dom/StaticDocument.ts';
|
|
2
|
+
import { SecondaryInstanceRootDefinition } from './SecondaryInstanceRootDefinition.ts';
|
|
3
|
+
|
|
4
|
+
export class SecondaryInstanceDefinition extends StaticDocument<SecondaryInstanceRootDefinition> {}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { XFormsSecondaryInstanceElement } from '@getodk/xpath';
|
|
2
|
+
import { XFORMS_KNOWN_ATTRIBUTE, XFORMS_LOCAL_NAME } from '@getodk/xpath';
|
|
3
|
+
import { StaticElement } from '../../../integration/xpath/static-dom/StaticElement.ts';
|
|
4
|
+
import type { SecondaryInstanceDefinition } from './SecondaryInstanceDefinition.ts';
|
|
5
|
+
|
|
6
|
+
export class SecondaryInstanceRootDefinition
|
|
7
|
+
extends StaticElement<SecondaryInstanceDefinition>
|
|
8
|
+
implements XFormsSecondaryInstanceElement<StaticElement>
|
|
9
|
+
{
|
|
10
|
+
override readonly [XFORMS_LOCAL_NAME] = 'instance';
|
|
11
|
+
override readonly [XFORMS_KNOWN_ATTRIBUTE] = 'id';
|
|
12
|
+
}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { JRResourceURL } from '@getodk/common/jr-resources/JRResourceURL.ts';
|
|
2
|
+
import { UnreachableError } from '@getodk/common/lib/error/UnreachableError.ts';
|
|
3
|
+
import type { XFormsSecondaryInstanceMap } from '@getodk/xpath';
|
|
4
|
+
import { ErrorProductionDesignPendingError } from '../../../error/ErrorProductionDesignPendingError.ts';
|
|
5
|
+
import type { EngineXPathNode } from '../../../integration/xpath/adapter/kind.ts';
|
|
6
|
+
import type { XFormDOM } from '../../XFormDOM.ts';
|
|
7
|
+
import { SecondaryInstanceRootDefinition } from './SecondaryInstanceRootDefinition.ts';
|
|
8
|
+
import { BlankSecondaryInstanceSource } from './sources/BlankSecondaryInstanceSource.ts';
|
|
9
|
+
import { CSVExternalSecondaryInstanceSource } from './sources/CSVExternalSecondaryInstance.ts';
|
|
10
|
+
import type { ExternalSecondaryInstanceResourceLoadOptions } from './sources/ExternalSecondaryInstanceResource.ts';
|
|
11
|
+
import { ExternalSecondaryInstanceResource } from './sources/ExternalSecondaryInstanceResource.ts';
|
|
12
|
+
import { GeoJSONExternalSecondaryInstanceSource } from './sources/GeoJSONExternalSecondaryInstance.ts';
|
|
13
|
+
import { InternalSecondaryInstanceSource } from './sources/InternalSecondaryInstanceSource.ts';
|
|
14
|
+
import type { SecondaryInstanceSource } from './sources/SecondaryInstanceSource.ts';
|
|
15
|
+
import { XMLExternalSecondaryInstanceSource } from './sources/XMLExternalSecondaryInstanceSource.ts';
|
|
16
|
+
|
|
17
|
+
export class SecondaryInstancesDefinition
|
|
18
|
+
extends Map<string, SecondaryInstanceRootDefinition>
|
|
19
|
+
implements XFormsSecondaryInstanceMap<EngineXPathNode>
|
|
20
|
+
{
|
|
21
|
+
/**
|
|
22
|
+
* @package Only to be used for testing
|
|
23
|
+
*/
|
|
24
|
+
static loadSync(xformDOM: XFormDOM): SecondaryInstancesDefinition {
|
|
25
|
+
const { secondaryInstanceElements } = xformDOM;
|
|
26
|
+
const sources = secondaryInstanceElements.map((domElement) => {
|
|
27
|
+
const instanceId = domElement.getAttribute('id');
|
|
28
|
+
const src = domElement.getAttribute('src');
|
|
29
|
+
|
|
30
|
+
if (src != null) {
|
|
31
|
+
throw new ErrorProductionDesignPendingError(
|
|
32
|
+
`Unexpected external secondary instance src attribute: ${src}`
|
|
33
|
+
);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
return new InternalSecondaryInstanceSource(instanceId, src, domElement);
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
return new this(sources);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
static async load(
|
|
43
|
+
xformDOM: XFormDOM,
|
|
44
|
+
options: ExternalSecondaryInstanceResourceLoadOptions
|
|
45
|
+
): Promise<SecondaryInstancesDefinition> {
|
|
46
|
+
const { secondaryInstanceElements } = xformDOM;
|
|
47
|
+
|
|
48
|
+
const sources = await Promise.all(
|
|
49
|
+
secondaryInstanceElements.map(async (domElement) => {
|
|
50
|
+
const instanceId = domElement.getAttribute('id');
|
|
51
|
+
const src = domElement.getAttribute('src');
|
|
52
|
+
|
|
53
|
+
if (src == null) {
|
|
54
|
+
return new InternalSecondaryInstanceSource(instanceId, src, domElement);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
if (!JRResourceURL.isJRResourceReference(src)) {
|
|
58
|
+
throw new ErrorProductionDesignPendingError(
|
|
59
|
+
`Unexpected external secondary instance src attribute: ${src}`
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const resourceURL = JRResourceURL.from(src);
|
|
64
|
+
const resource = await ExternalSecondaryInstanceResource.load(
|
|
65
|
+
instanceId,
|
|
66
|
+
resourceURL,
|
|
67
|
+
options
|
|
68
|
+
);
|
|
69
|
+
|
|
70
|
+
if (resource.isBlank) {
|
|
71
|
+
return new BlankSecondaryInstanceSource(instanceId, resourceURL, domElement);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
switch (resource.format) {
|
|
75
|
+
case 'csv':
|
|
76
|
+
return new CSVExternalSecondaryInstanceSource(domElement, resource);
|
|
77
|
+
|
|
78
|
+
case 'geojson':
|
|
79
|
+
return new GeoJSONExternalSecondaryInstanceSource(domElement, resource);
|
|
80
|
+
|
|
81
|
+
case 'xml':
|
|
82
|
+
return new XMLExternalSecondaryInstanceSource(domElement, resource);
|
|
83
|
+
|
|
84
|
+
default:
|
|
85
|
+
throw new UnreachableError(resource);
|
|
86
|
+
}
|
|
87
|
+
})
|
|
88
|
+
);
|
|
89
|
+
|
|
90
|
+
return new this(sources);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
private constructor(sources: readonly SecondaryInstanceSource[]) {
|
|
94
|
+
super(
|
|
95
|
+
sources.map((source) => {
|
|
96
|
+
const { root } = source.parseDefinition();
|
|
97
|
+
|
|
98
|
+
return [root.getAttributeValue('id'), root];
|
|
99
|
+
})
|
|
100
|
+
);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { XFORMS_NAMESPACE_URI } from '@getodk/common/constants/xmlns.ts';
|
|
2
|
+
import type { JRResourceURL } from '@getodk/common/jr-resources/JRResourceURL.ts';
|
|
3
|
+
import type { StaticNode } from '../../../../integration/xpath/static-dom/StaticNode.ts';
|
|
4
|
+
import { parseStaticDocumentFromDOMSubtree } from '../../../shared/parseStaticDocumentFromDOMSubtree.ts';
|
|
5
|
+
import type { DOMSecondaryInstanceElement } from '../../../XFormDOM.ts';
|
|
6
|
+
import { SecondaryInstanceDefinition } from '../SecondaryInstanceDefinition.ts';
|
|
7
|
+
import { SecondaryInstanceRootDefinition } from '../SecondaryInstanceRootDefinition.ts';
|
|
8
|
+
import { SecondaryInstanceSource } from './SecondaryInstanceSource.ts';
|
|
9
|
+
|
|
10
|
+
export class BlankSecondaryInstanceSource extends SecondaryInstanceSource<'blank'> {
|
|
11
|
+
constructor(
|
|
12
|
+
instanceId: string,
|
|
13
|
+
resourceURL: JRResourceURL,
|
|
14
|
+
domElement: DOMSecondaryInstanceElement
|
|
15
|
+
) {
|
|
16
|
+
super('blank', instanceId, resourceURL, domElement);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* @todo there is really no sense in using the DOM for this, other than it was
|
|
21
|
+
* quicker/more ergonomic than constructing the requisite {@link StaticNode}
|
|
22
|
+
* structures directly. Pretty good sign those constructor signatures could
|
|
23
|
+
* use some TLC!
|
|
24
|
+
*/
|
|
25
|
+
parseDefinition(): SecondaryInstanceDefinition {
|
|
26
|
+
const xmlDocument = this.domElement.ownerDocument.implementation.createDocument(
|
|
27
|
+
XFORMS_NAMESPACE_URI,
|
|
28
|
+
'instance'
|
|
29
|
+
);
|
|
30
|
+
const instanceElement = xmlDocument.documentElement;
|
|
31
|
+
|
|
32
|
+
instanceElement.setAttribute('id', this.instanceId);
|
|
33
|
+
|
|
34
|
+
return parseStaticDocumentFromDOMSubtree(
|
|
35
|
+
SecondaryInstanceDefinition,
|
|
36
|
+
SecondaryInstanceRootDefinition,
|
|
37
|
+
instanceElement
|
|
38
|
+
);
|
|
39
|
+
}
|
|
40
|
+
}
|