@getodk/xforms-engine 0.15.0 → 0.16.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 (94) hide show
  1. package/dist/client/AttributeNode.d.ts +2 -5
  2. package/dist/client/BaseNode.d.ts +5 -0
  3. package/dist/client/form/FormInstanceConfig.d.ts +15 -0
  4. package/dist/index.js +395 -231
  5. package/dist/index.js.map +1 -1
  6. package/dist/instance/Attribute.d.ts +17 -11
  7. package/dist/instance/Group.d.ts +0 -2
  8. package/dist/instance/InputControl.d.ts +2 -0
  9. package/dist/instance/PrimaryInstance.d.ts +0 -2
  10. package/dist/instance/Root.d.ts +0 -2
  11. package/dist/instance/UploadControl.d.ts +0 -2
  12. package/dist/instance/abstract/InstanceNode.d.ts +2 -2
  13. package/dist/instance/abstract/ValueNode.d.ts +2 -1
  14. package/dist/instance/attachments/buildAttributes.d.ts +6 -2
  15. package/dist/instance/hierarchy.d.ts +1 -2
  16. package/dist/instance/internal-api/AttributeContext.d.ts +6 -0
  17. package/dist/instance/internal-api/InstanceConfig.d.ts +2 -0
  18. package/dist/instance/internal-api/InstanceValueContext.d.ts +6 -0
  19. package/dist/instance/internal-api/serialization/ClientReactiveSerializableAttributeNode.d.ts +0 -1
  20. package/dist/instance/internal-api/serialization/ClientReactiveSerializableValueNode.d.ts +4 -0
  21. package/dist/instance/repeat/RepeatInstance.d.ts +0 -2
  22. package/dist/lib/codecs/items/SingleValueItemCodec.d.ts +1 -1
  23. package/dist/lib/reactivity/createInstanceValueState.d.ts +4 -1
  24. package/dist/lib/reactivity/node-state/createSharedNodeState.d.ts +2 -2
  25. package/dist/lib/xml-serialization.d.ts +1 -1
  26. package/dist/parse/XFormDOM.d.ts +3 -0
  27. package/dist/parse/expression/ActionComputationExpression.d.ts +4 -0
  28. package/dist/parse/model/ActionDefinition.d.ts +15 -0
  29. package/dist/parse/model/AttributeDefinition.d.ts +3 -1
  30. package/dist/parse/model/BindPreloadDefinition.d.ts +6 -10
  31. package/dist/parse/model/Event.d.ts +8 -0
  32. package/dist/parse/model/LeafNodeDefinition.d.ts +5 -2
  33. package/dist/parse/model/ModelActionMap.d.ts +9 -0
  34. package/dist/parse/model/ModelDefinition.d.ts +8 -1
  35. package/dist/parse/model/NoteNodeDefinition.d.ts +3 -2
  36. package/dist/parse/model/RangeNodeDefinition.d.ts +2 -1
  37. package/dist/parse/model/RootDefinition.d.ts +1 -0
  38. package/dist/solid.js +395 -231
  39. package/dist/solid.js.map +1 -1
  40. package/package.json +21 -17
  41. package/src/client/AttributeNode.ts +2 -5
  42. package/src/client/BaseNode.ts +6 -0
  43. package/src/client/form/FormInstanceConfig.ts +17 -0
  44. package/src/client/validation.ts +1 -1
  45. package/src/entrypoints/FormInstance.ts +1 -0
  46. package/src/instance/Attribute.ts +45 -45
  47. package/src/instance/Group.ts +1 -10
  48. package/src/instance/InputControl.ts +8 -1
  49. package/src/instance/ModelValue.ts +7 -1
  50. package/src/instance/Note.ts +6 -1
  51. package/src/instance/PrimaryInstance.ts +1 -11
  52. package/src/instance/RangeControl.ts +6 -1
  53. package/src/instance/RankControl.ts +7 -1
  54. package/src/instance/Root.ts +1 -10
  55. package/src/instance/SelectControl.ts +6 -1
  56. package/src/instance/TriggerControl.ts +6 -1
  57. package/src/instance/UploadControl.ts +1 -10
  58. package/src/instance/abstract/DescendantNode.ts +0 -5
  59. package/src/instance/abstract/InstanceNode.ts +2 -2
  60. package/src/instance/abstract/ValueNode.ts +2 -1
  61. package/src/instance/attachments/buildAttributes.ts +11 -4
  62. package/src/instance/children/normalizeChildInitOptions.ts +1 -1
  63. package/src/instance/hierarchy.ts +1 -3
  64. package/src/instance/internal-api/AttributeContext.ts +6 -0
  65. package/src/instance/internal-api/InstanceConfig.ts +6 -1
  66. package/src/instance/internal-api/InstanceValueContext.ts +6 -0
  67. package/src/instance/internal-api/serialization/ClientReactiveSerializableAttributeNode.ts +0 -1
  68. package/src/instance/internal-api/serialization/ClientReactiveSerializableValueNode.ts +4 -0
  69. package/src/instance/repeat/RepeatInstance.ts +1 -10
  70. package/src/lib/client-reactivity/instance-state/createValueNodeInstanceState.ts +2 -1
  71. package/src/lib/client-reactivity/instance-state/prepareInstancePayload.ts +1 -0
  72. package/src/lib/codecs/NoteCodec.ts +1 -1
  73. package/src/lib/codecs/items/SingleValueItemCodec.ts +1 -3
  74. package/src/lib/reactivity/createInstanceValueState.ts +152 -53
  75. package/src/lib/reactivity/node-state/createSharedNodeState.ts +2 -2
  76. package/src/lib/xml-serialization.ts +9 -1
  77. package/src/parse/XFormDOM.ts +9 -0
  78. package/src/parse/body/GroupElementDefinition.ts +1 -1
  79. package/src/parse/body/control/InputControlDefinition.ts +1 -1
  80. package/src/parse/expression/ActionComputationExpression.ts +12 -0
  81. package/src/parse/model/ActionDefinition.ts +70 -0
  82. package/src/parse/model/AttributeDefinition.ts +3 -2
  83. package/src/parse/model/AttributeDefinitionMap.ts +1 -1
  84. package/src/parse/model/BindDefinition.ts +1 -6
  85. package/src/parse/model/BindPreloadDefinition.ts +44 -12
  86. package/src/parse/model/Event.ts +9 -0
  87. package/src/parse/model/LeafNodeDefinition.ts +5 -1
  88. package/src/parse/model/ModelActionMap.ts +37 -0
  89. package/src/parse/model/ModelDefinition.ts +18 -3
  90. package/src/parse/model/NoteNodeDefinition.ts +5 -2
  91. package/src/parse/model/RangeNodeDefinition.ts +5 -2
  92. package/src/parse/model/RootDefinition.ts +22 -4
  93. package/dist/lib/reactivity/createAttributeValueState.d.ts +0 -15
  94. package/src/lib/reactivity/createAttributeValueState.ts +0 -189
@@ -10,25 +10,24 @@ import { RuntimeValueSetter, RuntimeValueState } from '../lib/codecs/ValueCodec.
10
10
  import { CurrentState } from '../lib/reactivity/node-state/createCurrentState.ts';
11
11
  import { EngineState } from '../lib/reactivity/node-state/createEngineState.ts';
12
12
  import { SharedNodeState } from '../lib/reactivity/node-state/createSharedNodeState.ts';
13
+ import { ReactiveScope } from '../lib/reactivity/scope.ts';
13
14
  import { SimpleAtomicState } from '../lib/reactivity/types.ts';
14
15
  import { AttributeDefinition } from '../parse/model/AttributeDefinition.ts';
15
- import { DescendantNodeSharedStateSpec } from './abstract/DescendantNode.ts';
16
- import { InstanceNode } from './abstract/InstanceNode.ts';
17
- import { AnyParentNode } from './hierarchy.ts';
16
+ import { AnyChildNode, AnyNode } from './hierarchy.ts';
18
17
  import { AttributeContext } from './internal-api/AttributeContext.ts';
18
+ import { InstanceConfig } from './internal-api/InstanceConfig.ts';
19
19
  import { DecodeInstanceValue } from './internal-api/InstanceValueContext.ts';
20
20
  import { ClientReactiveSerializableAttributeNode } from './internal-api/serialization/ClientReactiveSerializableAttributeNode.ts';
21
+ import { PrimaryInstance } from './PrimaryInstance.ts';
21
22
  import { Root } from './Root.ts';
22
- export interface AttributeStateSpec extends DescendantNodeSharedStateSpec {
23
- readonly children: null;
24
- readonly attributes: null;
23
+ export interface AttributeStateSpec {
25
24
  readonly value: SimpleAtomicState<string>;
26
25
  readonly instanceValue: Accessor<string>;
27
- readonly label: null;
28
- readonly hint: null;
29
- readonly valueOptions: null;
26
+ readonly relevant: Accessor<boolean>;
30
27
  }
31
- export declare class Attribute extends InstanceNode<AttributeDefinition, AttributeStateSpec, AnyParentNode, null> implements AttributeNode, ClientReactiveSerializableAttributeNode, AttributeContext, XFormsXPathAttribute {
28
+ export declare class Attribute implements AttributeNode, ClientReactiveSerializableAttributeNode, AttributeContext, XFormsXPathAttribute {
29
+ readonly owner: AnyNode;
30
+ readonly definition: AttributeDefinition;
32
31
  readonly instanceNode: StaticAttribute;
33
32
  readonly [XPathNodeKindKey] = "attribute";
34
33
  protected readonly state: SharedNodeState<AttributeStateSpec>;
@@ -46,13 +45,20 @@ export declare class Attribute extends InstanceNode<AttributeDefinition, Attribu
46
45
  protected readonly setValueState: RuntimeValueSetter<RuntimeInputValue<'string'>>;
47
46
  readonly evaluator: EngineXPathEvaluator;
48
47
  readonly getActiveLanguage: Accessor<ActiveLanguage>;
48
+ readonly contextNode: AnyNode;
49
+ readonly scope: ReactiveScope;
50
+ readonly rootDocument: PrimaryInstance;
51
+ readonly instanceConfig: InstanceConfig;
49
52
  readonly root: Root;
50
53
  readonly isRelevant: Accessor<boolean>;
51
54
  readonly isAttached: Accessor<boolean>;
52
55
  readonly isReadonly: Accessor<boolean>;
53
56
  readonly hasReadonlyAncestor: Accessor<boolean>;
54
57
  readonly hasNonRelevantAncestor: Accessor<boolean>;
55
- constructor(parent: AnyParentNode, definition: AttributeDefinition, instanceNode: StaticAttribute);
58
+ readonly contextReference: () => string;
59
+ constructor(owner: AnyNode, definition: AttributeDefinition, instanceNode: StaticAttribute);
56
60
  setValue(value: string): Root;
57
61
  getChildren(): readonly [];
62
+ getXPathChildNodes(): readonly AnyChildNode[];
63
+ getXPathValue(): string;
58
64
  }
@@ -26,7 +26,6 @@ interface GroupStateSpec extends DescendantNodeSharedStateSpec {
26
26
  }
27
27
  export declare class Group extends DescendantNode<GroupDefinition, GroupStateSpec, GeneralParentNode, GeneralChildNode> implements GroupNode, XFormsXPathElement, EvaluationContext, ClientReactiveSerializableParentNode<GeneralChildNode> {
28
28
  private readonly childrenState;
29
- private readonly attributeState;
30
29
  readonly [XPathNodeKindKey] = "element";
31
30
  protected readonly state: SharedNodeState<GroupStateSpec>;
32
31
  protected engineState: EngineState<GroupStateSpec>;
@@ -38,6 +37,5 @@ export declare class Group extends DescendantNode<GroupDefinition, GroupStateSpe
38
37
  readonly instanceState: InstanceState;
39
38
  constructor(parent: GeneralParentNode, instanceNode: StaticElement | null, definition: GroupDefinition);
40
39
  getChildren(): readonly GeneralChildNode[];
41
- getAttributes(): readonly Attribute[];
42
40
  }
43
41
  export {};
@@ -10,6 +10,7 @@ import { CurrentState } from '../lib/reactivity/node-state/createCurrentState.ts
10
10
  import { EngineState } from '../lib/reactivity/node-state/createEngineState.ts';
11
11
  import { SharedNodeState } from '../lib/reactivity/node-state/createSharedNodeState.ts';
12
12
  import { ValueNode, ValueNodeStateSpec } from './abstract/ValueNode.ts';
13
+ import { Attribute } from './Attribute.ts';
13
14
  import { GeneralParentNode } from './hierarchy.ts';
14
15
  import { EvaluationContext } from './internal-api/EvaluationContext.ts';
15
16
  import { ClientReactiveSerializableValueNode } from './internal-api/serialization/ClientReactiveSerializableValueNode.ts';
@@ -21,6 +22,7 @@ export type AnyInputDefinition = {
21
22
  interface InputControlStateSpec<V extends ValueType> extends ValueNodeStateSpec<RuntimeValue<V>> {
22
23
  readonly label: Accessor<TextRange<'label'> | null>;
23
24
  readonly hint: Accessor<TextRange<'hint'> | null>;
25
+ readonly attributes: Accessor<readonly Attribute[]>;
24
26
  readonly valueOptions: null;
25
27
  }
26
28
  export declare class InputControl<V extends ValueType = ValueType> extends ValueNode<V, InputDefinition<V>, RuntimeValue<V>, RuntimeInputValue<V>> implements InputNode<V>, XFormsXPathElement, EvaluationContext, ValidationContext, ClientReactiveSerializableValueNode {
@@ -87,7 +87,6 @@ export declare class PrimaryInstance<Mode extends FormInstanceInitializationMode
87
87
  readonly isAttached: Accessor<boolean>;
88
88
  readonly evaluator: EngineXPathEvaluator;
89
89
  readonly contextNode: this;
90
- private readonly attributeState;
91
90
  constructor(options: PrimaryInstanceOptions<Mode>);
92
91
  /**
93
92
  * @todo Note that this method's signature is intentionally derived from
@@ -110,6 +109,5 @@ export declare class PrimaryInstance<Mode extends FormInstanceInitializationMode
110
109
  */
111
110
  setLanguage(language: FormLanguage): FormLanguage;
112
111
  prepareInstancePayload<PayloadType extends InstancePayloadType = 'monolithic'>(options?: InstancePayloadOptions<PayloadType>): Promise<InstancePayload<PayloadType>>;
113
- getAttributes(): readonly Attribute[];
114
112
  }
115
113
  export {};
@@ -36,7 +36,6 @@ interface RootStateSpec {
36
36
  }
37
37
  export declare class Root extends DescendantNode<RootDefinition, RootStateSpec, PrimaryInstance, GeneralChildNode> implements RootNode, XFormsXPathElement, EvaluationContext, TranslationContext, ClientReactiveSerializableParentNode<GeneralChildNode> {
38
38
  private readonly childrenState;
39
- private readonly attributeState;
40
39
  readonly [XPathNodeKindKey] = "element";
41
40
  protected readonly state: SharedNodeState<RootStateSpec>;
42
41
  protected readonly engineState: EngineState<RootStateSpec>;
@@ -57,7 +56,6 @@ export declare class Root extends DescendantNode<RootDefinition, RootStateSpec,
57
56
  readonly languages: FormLanguages;
58
57
  constructor(parent: PrimaryInstance);
59
58
  getChildren(): readonly GeneralChildNode[];
60
- getAttributes(): readonly Attribute[];
61
59
  setLanguage(language: FormLanguage): Root;
62
60
  prepareInstancePayload<PayloadType extends InstancePayloadType = 'monolithic'>(options?: InstancePayloadOptions<PayloadType>): Promise<InstancePayload<PayloadType>>;
63
61
  }
@@ -39,7 +39,6 @@ export declare class UploadControl extends DescendantNode<UploadDefinition<'bina
39
39
  static from(parent: GeneralParentNode, instanceNode: StaticLeafElement | null, definition: UploadDefinition): UploadControl;
40
40
  private readonly validation;
41
41
  private readonly instanceAttachment;
42
- private readonly attributeState;
43
42
  readonly [XPathNodeKindKey] = "element";
44
43
  readonly getXPathValue: () => InstanceAttachmentFileName;
45
44
  protected readonly state: SharedNodeState<UploadControlStateSpec>;
@@ -57,6 +56,5 @@ export declare class UploadControl extends DescendantNode<UploadDefinition<'bina
57
56
  isBlank(): boolean;
58
57
  getChildren(): readonly [];
59
58
  setValue(value: InstanceAttachmentRuntimeValue): Root;
60
- getAttributes(): readonly Attribute[];
61
59
  }
62
60
  export {};
@@ -124,11 +124,11 @@ export declare abstract class InstanceNode<Definition extends AnyNodeDefinition,
124
124
  * (though for those nodes it will always be empty). This affords consistency
125
125
  * and efficiency of interface for those internal uses.
126
126
  */
127
- abstract getChildren(this: AnyInstanceNode): ReadonlyArray<Exclude<AnyChildNode, Attribute>>;
127
+ abstract getChildren(this: AnyInstanceNode): readonly AnyChildNode[];
128
128
  /**
129
129
  * @todo Values as text nodes(?)
130
130
  */
131
- getXPathChildNodes(): ReadonlyArray<Exclude<AnyChildNode, Attribute>>;
131
+ getXPathChildNodes(): readonly AnyChildNode[];
132
132
  getXPathValue(): string;
133
133
  }
134
134
  export {};
@@ -14,6 +14,7 @@ import { SharedNodeState } from '../../lib/reactivity/node-state/createSharedNod
14
14
  import { SimpleAtomicState } from '../../lib/reactivity/types.ts';
15
15
  import { SharedValidationState } from '../../lib/reactivity/validation/createValidation.ts';
16
16
  import { LeafNodeDefinition } from '../../parse/model/LeafNodeDefinition.ts';
17
+ import { Attribute } from '../Attribute.ts';
17
18
  import { GeneralParentNode } from '../hierarchy.ts';
18
19
  import { EvaluationContext } from '../internal-api/EvaluationContext.ts';
19
20
  import { DecodeInstanceValue, InstanceValueContext } from '../internal-api/InstanceValueContext.ts';
@@ -23,7 +24,7 @@ import { DescendantNodeStateSpec, DescendantNode } from './DescendantNode.ts';
23
24
  export type ValueNodeDefinition<V extends ValueType> = LeafNodeDefinition<V>;
24
25
  export interface ValueNodeStateSpec<RuntimeValue> extends DescendantNodeStateSpec<RuntimeValue> {
25
26
  readonly children: null;
26
- readonly attributes: null;
27
+ readonly attributes: Accessor<readonly Attribute[]>;
27
28
  readonly value: SimpleAtomicState<RuntimeValue>;
28
29
  readonly instanceValue: Accessor<string>;
29
30
  }
@@ -1,3 +1,7 @@
1
1
  import { Attribute } from '../Attribute';
2
- import { AnyParentNode } from '../hierarchy';
3
- export declare function buildAttributes(parent: AnyParentNode): Attribute[];
2
+ import { AnyNode } from '../hierarchy.ts';
3
+ import { InputControl } from '../InputControl.ts';
4
+ import { ModelValue } from '../ModelValue.ts';
5
+ import { Note } from '../Note.ts';
6
+ import { RangeControl } from '../RangeControl.ts';
7
+ export declare function buildAttributes(owner: AnyNode | InputControl<any> | ModelValue<any> | Note<any> | RangeControl<any>): Attribute[];
@@ -1,4 +1,3 @@
1
- import { Attribute } from './Attribute.ts';
2
1
  import { Group } from './Group.ts';
3
2
  import { AnyInputControl } from './InputControl.ts';
4
3
  import { AnyModelValue } from './ModelValue.ts';
@@ -17,6 +16,6 @@ export type RepeatRange = RepeatRangeControlled | RepeatRangeUncontrolled;
17
16
  export type AnyNode = PrimaryInstance | Root | Group | RepeatRange | RepeatInstance | AnyNote | AnyModelValue | AnyInputControl | AnyRangeControl | RankControl | SelectControl | TriggerControl | UploadControl;
18
17
  export type AnyParentNode = PrimaryInstance | Root | Group | RepeatRange | RepeatInstance;
19
18
  export type GeneralParentNode = Root | Group | RepeatInstance;
20
- export type AnyChildNode = Root | Group | RepeatRange | RepeatInstance | AnyModelValue | AnyNote | AnyInputControl | AnyRangeControl | RankControl | SelectControl | TriggerControl | UploadControl | Attribute;
19
+ export type AnyChildNode = Root | Group | RepeatRange | RepeatInstance | AnyModelValue | AnyNote | AnyInputControl | AnyRangeControl | RankControl | SelectControl | TriggerControl | UploadControl;
21
20
  export type GeneralChildNode = Group | RepeatRange | AnyModelValue | AnyNote | AnyInputControl | AnyRangeControl | RankControl | SelectControl | TriggerControl | UploadControl;
22
21
  export type AnyValueNode = AnyModelValue | AnyNote | AnyInputControl | AnyRangeControl | RankControl | SelectControl | TriggerControl | UploadControl;
@@ -1,11 +1,15 @@
1
+ import { Accessor } from 'solid-js';
1
2
  import { FormInstanceInitializationMode } from '../../client/index.ts';
2
3
  import { StaticAttribute } from '../../integration/xpath/static-dom/StaticAttribute.ts';
3
4
  import { ReactiveScope } from '../../lib/reactivity/scope.ts';
4
5
  import { BindComputationExpression } from '../../parse/expression/BindComputationExpression.ts';
5
6
  import { AnyBindPreloadDefinition } from '../../parse/model/BindPreloadDefinition.ts';
7
+ import { ModelDefinition } from '../../parse/model/ModelDefinition.ts';
6
8
  import { EvaluationContext } from './EvaluationContext.ts';
9
+ import { InstanceConfig } from './InstanceConfig.ts';
7
10
  export interface InstanceAttributeContextDocument {
8
11
  readonly initializationMode: FormInstanceInitializationMode;
12
+ readonly isAttached: Accessor<boolean>;
9
13
  }
10
14
  export type DecodeInstanceValue = (value: string) => string;
11
15
  interface InstanceAttributeContextDefinitionBind {
@@ -16,12 +20,14 @@ interface InstanceAttributeContextDefinitionBind {
16
20
  export interface InstanceAttributeContextDefinition {
17
21
  readonly bind: InstanceAttributeContextDefinitionBind;
18
22
  readonly template: StaticAttribute;
23
+ readonly model: ModelDefinition;
19
24
  }
20
25
  export interface AttributeContext extends EvaluationContext {
21
26
  readonly scope: ReactiveScope;
22
27
  readonly rootDocument: InstanceAttributeContextDocument;
23
28
  readonly definition: InstanceAttributeContextDefinition;
24
29
  readonly instanceNode: StaticAttribute;
30
+ readonly instanceConfig: InstanceConfig;
25
31
  readonly decodeInstanceValue: DecodeInstanceValue;
26
32
  isReadonly(): boolean;
27
33
  isRelevant(): boolean;
@@ -1,4 +1,5 @@
1
1
  import { InstanceAttachmentFileNameFactory } from '../../client/attachments/InstanceAttachmentsConfig.ts';
2
+ import { PreloadProperties } from '../../client/form/FormInstanceConfig.ts';
2
3
  import { OpaqueReactiveObjectFactory } from '../../client/OpaqueReactiveObjectFactory.ts';
3
4
  export interface InstanceConfig {
4
5
  /**
@@ -6,4 +7,5 @@ export interface InstanceConfig {
6
7
  */
7
8
  readonly clientStateFactory: OpaqueReactiveObjectFactory;
8
9
  readonly computeAttachmentName: InstanceAttachmentFileNameFactory;
10
+ readonly preloadProperties: PreloadProperties;
9
11
  }
@@ -1,11 +1,15 @@
1
+ import { Accessor } from 'solid-js';
1
2
  import { FormInstanceInitializationMode } from '../../client/index.ts';
2
3
  import { StaticLeafElement } from '../../integration/xpath/static-dom/StaticElement.ts';
3
4
  import { ReactiveScope } from '../../lib/reactivity/scope.ts';
4
5
  import { BindComputationExpression } from '../../parse/expression/BindComputationExpression.ts';
5
6
  import { AnyBindPreloadDefinition } from '../../parse/model/BindPreloadDefinition.ts';
7
+ import { ModelDefinition } from '../../parse/model/ModelDefinition.ts';
6
8
  import { EvaluationContext } from './EvaluationContext.ts';
9
+ import { InstanceConfig } from './InstanceConfig.ts';
7
10
  export interface InstanceValueContextDocument {
8
11
  readonly initializationMode: FormInstanceInitializationMode;
12
+ readonly isAttached: Accessor<boolean>;
9
13
  }
10
14
  export type DecodeInstanceValue = (value: string) => string;
11
15
  interface InstanceValueContextDefinitionBind {
@@ -16,12 +20,14 @@ interface InstanceValueContextDefinitionBind {
16
20
  export interface InstanceValueContextDefinition {
17
21
  readonly bind: InstanceValueContextDefinitionBind;
18
22
  readonly template: StaticLeafElement;
23
+ readonly model: ModelDefinition;
19
24
  }
20
25
  export interface InstanceValueContext extends EvaluationContext {
21
26
  readonly scope: ReactiveScope;
22
27
  readonly rootDocument: InstanceValueContextDocument;
23
28
  readonly definition: InstanceValueContextDefinition;
24
29
  readonly instanceNode: StaticLeafElement | null;
30
+ readonly instanceConfig: InstanceConfig;
25
31
  readonly decodeInstanceValue: DecodeInstanceValue;
26
32
  isReadonly(): boolean;
27
33
  isRelevant(): boolean;
@@ -2,7 +2,6 @@ import { InstanceState } from '../../../client/serialization/InstanceState.ts';
2
2
  import { QualifiedName } from '../../../lib/names/QualifiedName.ts';
3
3
  export type SerializedInstanceValue = string;
4
4
  interface ClientReactiveSerializableAttributeNodeCurrentState {
5
- get relevant(): boolean;
6
5
  get instanceValue(): SerializedInstanceValue;
7
6
  }
8
7
  interface ClientReactiveSerializableAttributeNodeDefinition {
@@ -1,5 +1,7 @@
1
1
  import { InstanceState } from '../../../client/serialization/InstanceState.ts';
2
2
  import { QualifiedName } from '../../../lib/names/QualifiedName.ts';
3
+ import { BindDefinition } from '../../../parse/model/BindDefinition.ts';
4
+ import { Attribute } from '../../Attribute.ts';
3
5
  import { ClientReactiveSerializableChildNode, ClientReactiveSerializableParentNode } from './ClientReactiveSerializableParentNode.ts';
4
6
  export type SerializedInstanceValue = string;
5
7
  interface ClientReactiveSerializableValueNodeCurrentState {
@@ -8,9 +10,11 @@ interface ClientReactiveSerializableValueNodeCurrentState {
8
10
  * @todo Consider moving into {@link InstanceState}
9
11
  */
10
12
  get instanceValue(): SerializedInstanceValue;
13
+ get attributes(): readonly Attribute[];
11
14
  }
12
15
  interface ClientReactiveSerializableValueNodeDefinition {
13
16
  readonly qualifiedName: QualifiedName;
17
+ readonly bind: BindDefinition;
14
18
  }
15
19
  export interface ClientReactiveSerializableValueNode {
16
20
  readonly definition: ClientReactiveSerializableValueNodeDefinition;
@@ -30,7 +30,6 @@ interface RepeatInstanceOptions {
30
30
  export declare class RepeatInstance extends DescendantNode<AnyRepeatDefinition, RepeatInstanceStateSpec, RepeatRange, GeneralChildNode> implements RepeatInstanceNode, XFormsXPathElement, EvaluationContext, ClientReactiveSerializableTemplatedNode {
31
31
  readonly parent: RepeatRange;
32
32
  private readonly childrenState;
33
- private readonly attributeState;
34
33
  private readonly currentIndex;
35
34
  readonly [XPathNodeKindKey] = "element";
36
35
  protected readonly state: SharedNodeState<RepeatInstanceStateSpec>;
@@ -67,6 +66,5 @@ export declare class RepeatInstance extends DescendantNode<AnyRepeatDefinition,
67
66
  readonly instanceState: InstanceState;
68
67
  constructor(parent: RepeatRange, instanceNode: StaticElement | null, options: RepeatInstanceOptions);
69
68
  getChildren(): readonly GeneralChildNode[];
70
- getAttributes(): readonly Attribute[];
71
69
  }
72
70
  export {};
@@ -4,7 +4,7 @@ export type SingleValueSelectRuntimeValues = readonly [] | readonly [string];
4
4
  /**
5
5
  * @see {@link encodeValueFactory}
6
6
  */
7
- type SingleValueSelectCodecValues = SingleValueSelectRuntimeValues | readonly string[];
7
+ type SingleValueSelectCodecValues = readonly string[];
8
8
  /**
9
9
  * Value codec implementation for `<select1>` controls.
10
10
  *
@@ -1,5 +1,7 @@
1
+ import { AttributeContext } from '../../instance/internal-api/AttributeContext.ts';
1
2
  import { InstanceValueContext } from '../../instance/internal-api/InstanceValueContext.ts';
2
3
  import { SimpleAtomicState } from './types.ts';
4
+ type ValueContext = AttributeContext | InstanceValueContext;
3
5
  export type InstanceValueState = SimpleAtomicState<string>;
4
6
  /**
5
7
  * Provides a consistent interface for value nodes of any type which:
@@ -12,4 +14,5 @@ export type InstanceValueState = SimpleAtomicState<string>;
12
14
  * nodes defined with one
13
15
  * - prevents downstream writes to nodes in a readonly state
14
16
  */
15
- export declare const createInstanceValueState: (context: InstanceValueContext) => InstanceValueState;
17
+ export declare const createInstanceValueState: (context: ValueContext) => InstanceValueState;
18
+ export {};
@@ -5,8 +5,8 @@ import { CurrentState } from './createCurrentState.ts';
5
5
  import { EngineState } from './createEngineState.ts';
6
6
  import { MutablePropertySpec, SpecifiedState, StateSpec } from './createSpecifiedState.ts';
7
7
  type MutableKeyOf<Spec extends StateSpec> = {
8
- [K in string & keyof Spec]: Spec[K] extends MutablePropertySpec<any> ? K : never;
9
- }[string & keyof Spec];
8
+ [K in Extract<keyof Spec, string>]: Spec[K] extends MutablePropertySpec<any> ? K : never;
9
+ }[Extract<keyof Spec, string>];
10
10
  type SetEnginePropertyState<Spec extends StateSpec> = <K extends MutableKeyOf<Spec>>(key: K, newValue: SpecifiedState<Spec>[K]) => SpecifiedState<Spec>[K];
11
11
  export interface SharedNodeState<Spec extends StateSpec> {
12
12
  readonly spec: Spec;
@@ -42,5 +42,5 @@ export type EscapedXMLText = string & {
42
42
  export declare const escapeXMLText: <Text extends string>(text: Exclude<Text, EscapedXMLText>, attr?: boolean) => EscapedXMLText;
43
43
  export declare const serializeAttributeXML: (qualifiedName: QualifiedName, xmlValue: EscapedXMLText) => string;
44
44
  export declare const serializeParentElementXML: (qualifiedName: QualifiedName, children: readonly GeneralChildNode[], attributes: readonly Attribute[], namespaceDeclarations?: NamespaceDeclarationMap) => string;
45
- export declare const serializeLeafElementXML: (qualifiedName: QualifiedName, xmlValue: EscapedXMLText, namespaceDeclarations?: NamespaceDeclarationMap) => string;
45
+ export declare const serializeLeafElementXML: (qualifiedName: QualifiedName, xmlValue: EscapedXMLText, attributes: readonly Attribute[], namespaceDeclarations?: NamespaceDeclarationMap) => string;
46
46
  export {};
@@ -1,6 +1,8 @@
1
1
  import { KnownAttributeLocalNamedElement } from '../../../common/types/dom.ts';
2
2
  interface DOMBindElement extends KnownAttributeLocalNamedElement<'bind', 'nodeset'> {
3
3
  }
4
+ interface DOMSetValueElement extends KnownAttributeLocalNamedElement<'setvalue', 'event'> {
5
+ }
4
6
  export interface DOMItextTranslationElement extends KnownAttributeLocalNamedElement<'translation', 'lang'> {
5
7
  }
6
8
  export interface DOMSecondaryInstanceElement extends KnownAttributeLocalNamedElement<'instance', 'id'> {
@@ -23,6 +25,7 @@ export declare class XFormDOM {
23
25
  readonly title: Element;
24
26
  readonly model: Element;
25
27
  readonly binds: readonly DOMBindElement[];
28
+ readonly setValues: readonly DOMSetValueElement[];
26
29
  readonly primaryInstance: Element;
27
30
  readonly primaryInstanceRoot: Element;
28
31
  readonly itextTranslationElements: readonly DOMItextTranslationElement[];
@@ -0,0 +1,4 @@
1
+ import { DependentExpression, DependentExpressionResultType } from './abstract/DependentExpression.ts';
2
+ export declare class ActionComputationExpression<Type extends DependentExpressionResultType> extends DependentExpression<Type> {
3
+ constructor(resultType: Type, expression: string);
4
+ }
@@ -0,0 +1,15 @@
1
+ import { ActionComputationExpression } from '../expression/ActionComputationExpression.ts';
2
+ import { XFormEvent } from './Event.ts';
3
+ import { ModelDefinition } from './ModelDefinition.ts';
4
+ export declare class ActionDefinition {
5
+ readonly element: Element;
6
+ static getRef(model: ModelDefinition, setValueElement: Element): string | null;
7
+ static getValue(element: Element): string;
8
+ static isKnownEvent: (event: XFormEvent) => event is XFormEvent;
9
+ static getEvents(element: Element): XFormEvent[];
10
+ readonly ref: string;
11
+ readonly events: XFormEvent[];
12
+ readonly computation: ActionComputationExpression<'string'>;
13
+ readonly source: string | undefined;
14
+ constructor(model: ModelDefinition, element: Element, source?: string);
15
+ }
@@ -2,9 +2,11 @@ import { StaticAttribute } from '../../integration/xpath/static-dom/StaticAttrib
2
2
  import { NamespaceDeclarationMap, NamedNodeDefinition } from '../../lib/names/NamespaceDeclarationMap.ts';
3
3
  import { QualifiedName } from '../../lib/names/QualifiedName.ts';
4
4
  import { BindDefinition } from './BindDefinition.ts';
5
+ import { ModelDefinition } from './ModelDefinition.ts';
5
6
  import { NodeDefinition } from './NodeDefinition.ts';
6
7
  import { RootDefinition } from './RootDefinition.ts';
7
8
  export declare class AttributeDefinition extends NodeDefinition<'attribute'> implements NamedNodeDefinition {
9
+ readonly model: ModelDefinition;
8
10
  readonly template: StaticAttribute;
9
11
  private readonly serializedXML;
10
12
  readonly value: string;
@@ -17,6 +19,6 @@ export declare class AttributeDefinition extends NodeDefinition<'attribute'> imp
17
19
  readonly children: null;
18
20
  readonly attributes: null;
19
21
  readonly qualifiedName: QualifiedName;
20
- constructor(root: RootDefinition, bind: BindDefinition, template: StaticAttribute);
22
+ constructor(model: ModelDefinition, bind: BindDefinition, template: StaticAttribute);
21
23
  serializeAttributeXML(): string;
22
24
  }
@@ -1,6 +1,9 @@
1
1
  import { PartiallyKnownString } from '../../../../common/types/string/PartiallyKnownString.ts';
2
+ import { AttributeContext } from '../../instance/internal-api/AttributeContext.ts';
3
+ import { InstanceValueContext } from '../../instance/internal-api/InstanceValueContext.ts';
2
4
  import { BindElement } from './BindElement.ts';
3
- type PartiallyKnownPreloadParameter<Known extends string> = PartiallyKnownString<NonNullable<Known>> | Extract<Known, null>;
5
+ import { XFormEvent } from './Event.ts';
6
+ type PartiallyKnownPreloadParameter<Known extends string> = PartiallyKnownString<NonNullable<Known>>;
4
7
  interface PreloadParametersByType {
5
8
  readonly uid: string | null;
6
9
  readonly date: PartiallyKnownPreloadParameter<'today'>;
@@ -22,20 +25,13 @@ interface PreloadInput<Type extends PreloadType> {
22
25
  *
23
26
  * - {@link type}, a `jr:preload`
24
27
  * - {@link parameter}, an associated `jr:preloadParams` value
25
- *
26
- * @todo It would probably make sense for the _definition_ to also convey:
27
- *
28
- * 1. Which {@link https://getodk.github.io/xforms-spec/#events | event} the
29
- * preload is semantically associated with (noting that the spec may be a tad
30
- * overzealous about this association).
31
- *
32
- * 2. The constant XPath expression (or other computation?) expressed by the
33
- * combined {@link type} and {@link parameter}.
34
28
  */
35
29
  export declare class BindPreloadDefinition<Type extends PreloadType> implements PreloadInput<Type> {
36
30
  static from(bindElement: BindElement): AnyBindPreloadDefinition | null;
37
31
  readonly type: Type;
38
32
  readonly parameter: PreloadParameter<Type>;
33
+ readonly event: XFormEvent;
34
+ getValue(context: AttributeContext | InstanceValueContext): string | undefined;
39
35
  private constructor();
40
36
  }
41
37
  export type AnyBindPreloadDefinition = BindPreloadDefinition<'uid'> | BindPreloadDefinition<'timestamp'> | BindPreloadDefinition<'property'> | BindPreloadDefinition<string>;
@@ -0,0 +1,8 @@
1
+ export declare const XFORM_EVENT: {
2
+ readonly odkInstanceLoad: "odk-instance-load";
3
+ readonly odkInstanceFirstLoad: "odk-instance-first-load";
4
+ readonly odkNewRepeat: "odk-new-repeat";
5
+ readonly xformsRevalidate: "xforms-revalidate";
6
+ readonly xformsValueChanged: "xforms-value-changed";
7
+ };
8
+ export type XFormEvent = (typeof XFORM_EVENT)[keyof typeof XFORM_EVENT];
@@ -3,17 +3,20 @@ import { StaticLeafElement } from '../../integration/xpath/static-dom/StaticElem
3
3
  import { NamespaceDeclarationMap, NamedSubtreeDefinition } from '../../lib/names/NamespaceDeclarationMap.ts';
4
4
  import { QualifiedName } from '../../lib/names/QualifiedName.ts';
5
5
  import { AnyBodyElementDefinition, ControlElementDefinition } from '../body/BodyDefinition.ts';
6
+ import { AttributeDefinitionMap } from './AttributeDefinitionMap.ts';
6
7
  import { BindDefinition } from './BindDefinition.ts';
7
8
  import { DescendentNodeDefinition } from './DescendentNodeDefinition.ts';
9
+ import { ModelDefinition } from './ModelDefinition.ts';
8
10
  import { ParentNodeDefinition } from './NodeDefinition.ts';
9
11
  export declare class LeafNodeDefinition<V extends ValueType = ValueType> extends DescendentNodeDefinition<'leaf-node', ControlElementDefinition | null> implements NamedSubtreeDefinition {
12
+ readonly model: ModelDefinition;
10
13
  readonly template: StaticLeafElement;
11
14
  readonly type = "leaf-node";
12
15
  readonly valueType: V;
13
16
  readonly namespaceDeclarations: NamespaceDeclarationMap;
14
17
  readonly qualifiedName: QualifiedName;
15
18
  readonly children: null;
16
- readonly attributes: null;
17
- constructor(parent: ParentNodeDefinition, bind: BindDefinition, bodyElement: AnyBodyElementDefinition | null, template: StaticLeafElement);
19
+ readonly attributes: AttributeDefinitionMap;
20
+ constructor(model: ModelDefinition, parent: ParentNodeDefinition, bind: BindDefinition, bodyElement: AnyBodyElementDefinition | null, template: StaticLeafElement);
18
21
  toJSON(): Omit<this, "parent" | "toJSON" | "bind" | "root" | "bodyElement">;
19
22
  }
@@ -0,0 +1,9 @@
1
+ import { ActionDefinition } from './ActionDefinition.ts';
2
+ import { ModelDefinition } from './ModelDefinition.ts';
3
+ export declare class ModelActionMap extends Map<string, ActionDefinition> {
4
+ static fromModel(model: ModelDefinition): ModelActionMap;
5
+ static getKey(ref: string): string;
6
+ protected constructor(model: ModelDefinition);
7
+ get(ref: string): ActionDefinition | undefined;
8
+ add(action: ActionDefinition): void;
9
+ }
@@ -4,21 +4,28 @@ import { TextChunkExpression } from '../expression/TextChunkExpression.ts';
4
4
  import { XFormDefinition } from '../XFormDefinition.ts';
5
5
  import { ChunkExpressionsByItextId } from './generateItextChunks.ts';
6
6
  import { ItextTranslationsDefinition } from './ItextTranslationsDefinition.ts';
7
+ import { ModelActionMap } from './ModelActionMap.ts';
7
8
  import { ModelBindMap } from './ModelBindMap.ts';
8
9
  import { AnyNodeDefinition } from './NodeDefinition.ts';
9
10
  import { NodeDefinitionMap } from './nodeDefinitionMap.ts';
10
11
  import { RootDefinition } from './RootDefinition.ts';
12
+ type XformsRevalidateListener = () => void;
11
13
  export declare class ModelDefinition {
12
14
  readonly form: XFormDefinition;
13
15
  readonly binds: ModelBindMap;
16
+ readonly actions: ModelActionMap;
14
17
  readonly root: RootDefinition;
15
18
  readonly nodes: NodeDefinitionMap;
16
19
  readonly instance: StaticDocument;
17
20
  readonly itextTranslations: ItextTranslationsDefinition;
18
21
  readonly itextChunks: Map<string, ChunkExpressionsByItextId>;
22
+ readonly xformsRevalidateListeners: Map<string, XformsRevalidateListener>;
19
23
  constructor(form: XFormDefinition);
20
24
  getNodeDefinition(nodeset: string): AnyNodeDefinition;
21
25
  getRootDefinition(instance: StaticDocument): RootDefinition;
22
- toJSON(): Omit<this, "form" | "toJSON" | "getNodeDefinition" | "getRootDefinition" | "getTranslationChunks">;
26
+ registerXformsRevalidateListener(ref: string, listener: XformsRevalidateListener): void;
27
+ triggerXformsRevalidateListeners(): void;
23
28
  getTranslationChunks(itextId: string, activeLanguage: ActiveLanguage): ReadonlyArray<TextChunkExpression<'string'>>;
29
+ toJSON(): Omit<this, "form" | "toJSON" | "getNodeDefinition" | "getRootDefinition" | "registerXformsRevalidateListener" | "triggerXformsRevalidateListeners" | "getTranslationChunks">;
24
30
  }
31
+ export {};
@@ -8,6 +8,7 @@ import { HintDefinition } from '../text/HintDefinition.ts';
8
8
  import { LabelDefinition } from '../text/LabelDefinition.ts';
9
9
  import { BindDefinition } from './BindDefinition.ts';
10
10
  import { LeafNodeDefinition } from './LeafNodeDefinition.ts';
11
+ import { ModelDefinition } from './ModelDefinition.ts';
11
12
  import { ParentNodeDefinition } from './NodeDefinition.ts';
12
13
  export type NoteReadonlyDefinition = BindComputationExpression<'readonly'> & ConstantTruthyDependentExpression;
13
14
  export interface NoteBindDefinition<V extends ValueType> extends BindDefinition<V> {
@@ -27,6 +28,6 @@ export declare class NoteNodeDefinition<V extends ValueType = ValueType> extends
27
28
  readonly bind: NoteBindDefinition<V>;
28
29
  readonly bodyElement: InputControlDefinition;
29
30
  readonly noteTextDefinition: NoteTextDefinition;
30
- static from<V extends ValueType>(parent: ParentNodeDefinition, bind: BindDefinition<V>, bodyElement: AnyBodyElementDefinition | null, node: StaticLeafElement): NoteNodeDefinition<V> | null;
31
- constructor(parent: ParentNodeDefinition, bind: NoteBindDefinition<V>, bodyElement: InputControlDefinition, noteTextDefinition: NoteTextDefinition, template: StaticLeafElement);
31
+ static from<V extends ValueType>(model: ModelDefinition, parent: ParentNodeDefinition, bind: BindDefinition<V>, bodyElement: AnyBodyElementDefinition | null, node: StaticLeafElement): NoteNodeDefinition<V> | null;
32
+ constructor(model: ModelDefinition, parent: ParentNodeDefinition, bind: NoteBindDefinition<V>, bodyElement: InputControlDefinition, noteTextDefinition: NoteTextDefinition, template: StaticLeafElement);
32
33
  }
@@ -4,6 +4,7 @@ import { RuntimeValue } from '../../lib/codecs/getSharedValueCodec.ts';
4
4
  import { RangeControlBoundsDefinition, RangeControlDefinition } from '../body/control/RangeControlDefinition.ts';
5
5
  import { BindDefinition } from './BindDefinition.ts';
6
6
  import { LeafNodeDefinition } from './LeafNodeDefinition.ts';
7
+ import { ModelDefinition } from './ModelDefinition.ts';
7
8
  import { ParentNodeDefinition } from './NodeDefinition.ts';
8
9
  declare const RANGE_VALUE_TYPES: readonly ["decimal", "int"];
9
10
  export type RangeValueType = (typeof RANGE_VALUE_TYPES)[number];
@@ -34,7 +35,7 @@ declare class RangeNodeBoundsDefinition<V extends RangeValueType = RangeValueTyp
34
35
  export declare class RangeNodeDefinition<V extends RangeValueType = RangeValueType> extends LeafNodeDefinition<V> implements RangeLeafNodeDefinition<V> {
35
36
  readonly bind: BindDefinition<V>;
36
37
  readonly bodyElement: RangeControlDefinition;
37
- static from<V extends ValueType>(parent: ParentNodeDefinition, bind: BindDefinition<V>, bodyElement: RangeControlDefinition, node: StaticLeafElement): RangeNodeDefinition<Extract<V, RangeValueType>>;
38
+ static from<V extends ValueType>(model: ModelDefinition, parent: ParentNodeDefinition, bind: BindDefinition<V>, bodyElement: RangeControlDefinition, node: StaticLeafElement): RangeNodeDefinition<Extract<V, RangeValueType>>;
38
39
  readonly bounds: RangeNodeBoundsDefinition<V>;
39
40
  private constructor();
40
41
  }
@@ -23,6 +23,7 @@ export declare class RootDefinition extends NodeDefinition<'root'> {
23
23
  readonly children: readonly ChildNodeDefinition[];
24
24
  readonly isTranslated = false;
25
25
  constructor(form: XFormDefinition, model: ModelDefinition, submission: SubmissionDefinition, classes: BodyClassList);
26
+ private mapActions;
26
27
  buildSubtree(parent: ParentNodeDefinition, node: StaticElement): readonly ChildNodeDefinition[];
27
28
  toJSON(): Omit<this, "form" | "toJSON" | "bind" | "model" | "root" | "bodyElement" | "buildSubtree">;
28
29
  }