@player-ui/player 0.8.0--canary.307.9621 → 0.8.0-next.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/Player.native.js +11630 -0
- package/dist/Player.native.js.map +1 -0
- package/dist/cjs/index.cjs +5626 -0
- package/dist/cjs/index.cjs.map +1 -0
- package/dist/{index.esm.js → index.legacy-esm.js} +2044 -1667
- package/dist/{index.cjs.js → index.mjs} +2052 -1761
- package/dist/index.mjs.map +1 -0
- package/package.json +29 -63
- package/src/__tests__/data.test.ts +498 -0
- package/src/__tests__/flow.test.ts +312 -0
- package/src/__tests__/helpers/action-exp.plugin.ts +22 -0
- package/src/__tests__/helpers/actions.flow.ts +67 -0
- package/src/__tests__/helpers/binding.plugin.ts +125 -0
- package/src/__tests__/helpers/expression.plugin.ts +88 -0
- package/src/__tests__/helpers/transform-plugin.ts +19 -0
- package/src/__tests__/helpers/validation.flow.ts +56 -0
- package/src/__tests__/player.test.ts +597 -0
- package/src/__tests__/string-resolver.test.ts +186 -0
- package/src/__tests__/validation.test.ts +3555 -0
- package/src/__tests__/view.test.ts +715 -0
- package/src/binding/__tests__/binding.test.ts +113 -0
- package/src/binding/__tests__/index.test.ts +208 -0
- package/src/binding/__tests__/resolver.test.ts +83 -0
- package/src/binding/binding.ts +6 -6
- package/src/binding/index.ts +34 -34
- package/src/binding/resolver.ts +19 -19
- package/src/binding/utils.ts +7 -7
- package/src/binding-grammar/__tests__/parser.test.ts +64 -0
- package/src/binding-grammar/__tests__/test-utils/ast-cases.ts +198 -0
- package/src/binding-grammar/__tests__/test-utils/perf-test.ts +66 -0
- package/src/binding-grammar/ast.ts +11 -11
- package/src/binding-grammar/custom/index.ts +19 -22
- package/src/binding-grammar/ebnf/index.ts +20 -21
- package/src/binding-grammar/ebnf/types.ts +13 -13
- package/src/binding-grammar/index.ts +4 -4
- package/src/binding-grammar/parsimmon/index.ts +14 -14
- package/src/controllers/constants/__tests__/index.test.ts +106 -0
- package/src/controllers/constants/index.ts +3 -3
- package/src/controllers/constants/utils.ts +4 -4
- package/src/controllers/data/controller.ts +22 -22
- package/src/controllers/data/index.ts +1 -1
- package/src/controllers/data/utils.ts +7 -7
- package/src/controllers/flow/__tests__/controller.test.ts +195 -0
- package/src/controllers/flow/__tests__/flow.test.ts +381 -0
- package/src/controllers/flow/controller.ts +13 -13
- package/src/controllers/flow/flow.ts +23 -23
- package/src/controllers/flow/index.ts +2 -2
- package/src/controllers/index.ts +5 -5
- package/src/controllers/validation/binding-tracker.ts +71 -59
- package/src/controllers/validation/controller.ts +104 -104
- package/src/controllers/validation/index.ts +2 -2
- package/src/controllers/view/asset-transform.ts +20 -20
- package/src/controllers/view/controller.ts +27 -27
- package/src/controllers/view/index.ts +4 -4
- package/src/controllers/view/store.ts +3 -3
- package/src/controllers/view/types.ts +7 -7
- package/src/data/__tests__/__snapshots__/dependency-tracker.test.ts.snap +64 -0
- package/src/data/__tests__/dependency-tracker.test.ts +146 -0
- package/src/data/__tests__/local-model.test.ts +46 -0
- package/src/data/__tests__/model.test.ts +78 -0
- package/src/data/dependency-tracker.ts +16 -16
- package/src/data/index.ts +4 -4
- package/src/data/local-model.ts +6 -6
- package/src/data/model.ts +17 -17
- package/src/data/noop-model.ts +1 -1
- package/src/expressions/__tests__/__snapshots__/parser.test.ts.snap +854 -0
- package/src/expressions/__tests__/evaluator-functions.test.ts +47 -0
- package/src/expressions/__tests__/evaluator.test.ts +410 -0
- package/src/expressions/__tests__/parser.test.ts +115 -0
- package/src/expressions/__tests__/utils.test.ts +44 -0
- package/src/expressions/evaluator-functions.ts +6 -6
- package/src/expressions/evaluator.ts +71 -67
- package/src/expressions/index.ts +4 -4
- package/src/expressions/parser.ts +102 -105
- package/src/expressions/types.ts +29 -21
- package/src/expressions/utils.ts +32 -21
- package/src/index.ts +13 -13
- package/src/logger/__tests__/consoleLogger.test.ts +46 -0
- package/src/logger/__tests__/noopLogger.test.ts +13 -0
- package/src/logger/__tests__/proxyLogger.test.ts +31 -0
- package/src/logger/__tests__/tapableLogger.test.ts +41 -0
- package/src/logger/consoleLogger.ts +9 -9
- package/src/logger/index.ts +5 -5
- package/src/logger/noopLogger.ts +1 -1
- package/src/logger/proxyLogger.ts +6 -6
- package/src/logger/tapableLogger.ts +7 -7
- package/src/logger/types.ts +2 -2
- package/src/player.ts +60 -58
- package/src/plugins/default-exp-plugin.ts +10 -10
- package/src/plugins/default-view-plugin.ts +29 -0
- package/src/plugins/flow-exp-plugin.ts +6 -6
- package/src/schema/__tests__/schema.test.ts +243 -0
- package/src/schema/index.ts +2 -2
- package/src/schema/schema.ts +24 -24
- package/src/schema/types.ts +4 -4
- package/src/string-resolver/__tests__/index.test.ts +361 -0
- package/src/string-resolver/index.ts +17 -17
- package/src/types.ts +17 -17
- package/src/utils/__tests__/replaceParams.test.ts +33 -0
- package/src/utils/index.ts +1 -1
- package/src/utils/replaceParams.ts +1 -1
- package/src/validator/__tests__/binding-map-splice.test.ts +53 -0
- package/src/validator/__tests__/validation-middleware.test.ts +127 -0
- package/src/validator/binding-map-splice.ts +5 -5
- package/src/validator/index.ts +4 -4
- package/src/validator/registry.ts +1 -1
- package/src/validator/types.ts +13 -13
- package/src/validator/validation-middleware.ts +15 -15
- package/src/view/__tests__/view.immutable.test.ts +269 -0
- package/src/view/__tests__/view.test.ts +959 -0
- package/src/view/builder/index.test.ts +69 -0
- package/src/view/builder/index.ts +3 -3
- package/src/view/index.ts +5 -5
- package/src/view/parser/__tests__/__snapshots__/parser.test.ts.snap +394 -0
- package/src/view/parser/__tests__/parser.test.ts +264 -0
- package/src/view/parser/index.ts +43 -33
- package/src/view/parser/types.ts +11 -11
- package/src/view/parser/utils.ts +5 -5
- package/src/view/plugins/__tests__/__snapshots__/template.test.ts.snap +278 -0
- package/src/view/plugins/__tests__/applicability.test.ts +265 -0
- package/src/view/plugins/__tests__/string.test.ts +122 -0
- package/src/view/plugins/__tests__/template.test.ts +724 -0
- package/src/view/plugins/applicability.ts +19 -19
- package/src/view/plugins/index.ts +4 -5
- package/src/view/plugins/options.ts +1 -1
- package/src/view/plugins/string-resolver.ts +22 -22
- package/src/view/plugins/switch.ts +22 -23
- package/src/view/plugins/template-plugin.ts +26 -27
- package/src/view/resolver/__tests__/dependencies.test.ts +321 -0
- package/src/view/resolver/__tests__/edgecases.test.ts +626 -0
- package/src/view/resolver/index.ts +42 -42
- package/src/view/resolver/types.ts +21 -20
- package/src/view/resolver/utils.ts +9 -9
- package/src/view/view.ts +32 -22
- package/types/binding/binding.d.ts +50 -0
- package/types/binding/index.d.ts +29 -0
- package/types/binding/resolver.d.ts +26 -0
- package/types/binding/utils.d.ts +12 -0
- package/types/binding-grammar/ast.d.ts +67 -0
- package/types/binding-grammar/custom/index.d.ts +4 -0
- package/types/binding-grammar/ebnf/index.d.ts +4 -0
- package/types/binding-grammar/ebnf/types.d.ts +75 -0
- package/types/binding-grammar/index.d.ts +5 -0
- package/types/binding-grammar/parsimmon/index.d.ts +4 -0
- package/types/controllers/constants/index.d.ts +45 -0
- package/types/controllers/constants/utils.d.ts +6 -0
- package/types/controllers/data/controller.d.ts +45 -0
- package/types/controllers/data/index.d.ts +2 -0
- package/types/controllers/data/utils.d.ts +14 -0
- package/types/controllers/flow/controller.d.ts +25 -0
- package/types/controllers/flow/flow.d.ts +50 -0
- package/types/controllers/flow/index.d.ts +3 -0
- package/types/controllers/index.d.ts +6 -0
- package/types/controllers/validation/binding-tracker.d.ts +32 -0
- package/types/controllers/validation/controller.d.ts +151 -0
- package/types/controllers/validation/index.d.ts +3 -0
- package/types/controllers/view/asset-transform.d.ts +19 -0
- package/types/controllers/view/controller.d.ts +37 -0
- package/types/controllers/view/index.d.ts +5 -0
- package/types/controllers/view/store.d.ts +20 -0
- package/types/controllers/view/types.d.ts +16 -0
- package/types/data/dependency-tracker.d.ts +49 -0
- package/types/data/index.d.ts +5 -0
- package/types/data/local-model.d.ts +16 -0
- package/types/data/model.d.ts +86 -0
- package/types/data/noop-model.d.ts +13 -0
- package/types/expressions/evaluator-functions.d.ts +15 -0
- package/types/expressions/evaluator.d.ts +52 -0
- package/types/expressions/index.d.ts +5 -0
- package/types/expressions/parser.d.ts +10 -0
- package/types/expressions/types.d.ts +144 -0
- package/types/expressions/utils.d.ts +12 -0
- package/types/index.d.ts +14 -0
- package/types/logger/consoleLogger.d.ts +17 -0
- package/types/logger/index.d.ts +6 -0
- package/types/logger/noopLogger.d.ts +10 -0
- package/types/logger/proxyLogger.d.ts +15 -0
- package/types/logger/tapableLogger.d.ts +23 -0
- package/types/logger/types.d.ts +6 -0
- package/types/player.d.ts +101 -0
- package/types/plugins/default-exp-plugin.d.ts +9 -0
- package/types/plugins/default-view-plugin.d.ts +9 -0
- package/types/plugins/flow-exp-plugin.d.ts +11 -0
- package/types/schema/index.d.ts +3 -0
- package/types/schema/schema.d.ts +36 -0
- package/types/schema/types.d.ts +38 -0
- package/types/string-resolver/index.d.ts +30 -0
- package/types/types.d.ts +73 -0
- package/types/utils/index.d.ts +2 -0
- package/types/utils/replaceParams.d.ts +9 -0
- package/types/validator/binding-map-splice.d.ts +10 -0
- package/types/validator/index.d.ts +5 -0
- package/types/validator/registry.d.ts +11 -0
- package/types/validator/types.d.ts +53 -0
- package/types/validator/validation-middleware.d.ts +36 -0
- package/types/view/builder/index.d.ts +35 -0
- package/types/view/index.d.ts +6 -0
- package/types/view/parser/index.d.ts +52 -0
- package/types/view/parser/types.d.ts +109 -0
- package/types/view/parser/utils.d.ts +6 -0
- package/types/view/plugins/applicability.d.ts +10 -0
- package/types/view/plugins/index.d.ts +5 -0
- package/types/view/plugins/options.d.ts +4 -0
- package/types/view/plugins/string-resolver.d.ts +13 -0
- package/types/view/plugins/switch.d.ts +14 -0
- package/types/view/plugins/template-plugin.d.ts +33 -0
- package/types/view/resolver/index.d.ts +73 -0
- package/types/view/resolver/types.d.ts +129 -0
- package/types/view/resolver/utils.d.ts +11 -0
- package/types/view/view.d.ts +37 -0
- package/dist/index.d.ts +0 -1814
- package/dist/player.dev.js +0 -11472
- package/dist/player.prod.js +0 -2
- package/src/view/plugins/plugin.ts +0 -21
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import { SyncBailHook, SyncHook, SyncWaterfallHook } from
|
|
2
|
-
import type { DeferredPromise } from
|
|
3
|
-
import defer from
|
|
1
|
+
import { SyncBailHook, SyncHook, SyncWaterfallHook } from "tapable-ts";
|
|
2
|
+
import type { DeferredPromise } from "p-defer";
|
|
3
|
+
import defer from "p-defer";
|
|
4
4
|
import type {
|
|
5
5
|
NavigationFlow,
|
|
6
6
|
NavigationFlowState,
|
|
7
7
|
NavigationFlowEndState,
|
|
8
|
-
} from
|
|
9
|
-
import type { Logger } from
|
|
8
|
+
} from "@player-ui/types";
|
|
9
|
+
import type { Logger } from "../../logger";
|
|
10
10
|
|
|
11
11
|
export interface NamedState {
|
|
12
12
|
/** The name of the navigation node */
|
|
@@ -22,7 +22,7 @@ export interface TransitionOptions {
|
|
|
22
22
|
}
|
|
23
23
|
export type TransitionFunction = (
|
|
24
24
|
name: string,
|
|
25
|
-
options?: TransitionOptions
|
|
25
|
+
options?: TransitionOptions,
|
|
26
26
|
) => void;
|
|
27
27
|
|
|
28
28
|
/** The Content navigation state machine */
|
|
@@ -70,7 +70,7 @@ export class FlowInstance {
|
|
|
70
70
|
options?: {
|
|
71
71
|
/** Logger instance to use */
|
|
72
72
|
logger?: Logger;
|
|
73
|
-
}
|
|
73
|
+
},
|
|
74
74
|
) {
|
|
75
75
|
this.id = id;
|
|
76
76
|
this.flow = flow;
|
|
@@ -78,21 +78,21 @@ export class FlowInstance {
|
|
|
78
78
|
this.history = [];
|
|
79
79
|
|
|
80
80
|
this.hooks.transition.tap(
|
|
81
|
-
|
|
81
|
+
"startPromise",
|
|
82
82
|
async (_oldState, nextState: NamedState) => {
|
|
83
83
|
const newState = nextState.value;
|
|
84
84
|
|
|
85
|
-
if (this.flowPromise && newState.state_type ===
|
|
85
|
+
if (this.flowPromise && newState.state_type === "END") {
|
|
86
86
|
this.flowPromise.resolve(newState);
|
|
87
87
|
}
|
|
88
|
-
}
|
|
88
|
+
},
|
|
89
89
|
);
|
|
90
90
|
}
|
|
91
91
|
|
|
92
92
|
/** Start the state machine */
|
|
93
93
|
public async start(): Promise<NavigationFlowEndState> {
|
|
94
94
|
if (this.flowPromise) {
|
|
95
|
-
this.log?.warn(
|
|
95
|
+
this.log?.warn("Already called start for flow");
|
|
96
96
|
|
|
97
97
|
return this.flowPromise.promise;
|
|
98
98
|
}
|
|
@@ -118,13 +118,13 @@ export class FlowInstance {
|
|
|
118
118
|
public transition(transitionValue: string, options?: TransitionOptions) {
|
|
119
119
|
if (this.isTransitioning) {
|
|
120
120
|
throw new Error(
|
|
121
|
-
`Transitioning while ongoing transition from ${this.currentState?.name} is in progress is not supported
|
|
121
|
+
`Transitioning while ongoing transition from ${this.currentState?.name} is in progress is not supported`,
|
|
122
122
|
);
|
|
123
123
|
}
|
|
124
124
|
|
|
125
|
-
if (this.currentState?.value.state_type ===
|
|
125
|
+
if (this.currentState?.value.state_type === "END") {
|
|
126
126
|
this.log?.warn(
|
|
127
|
-
`Skipping transition using ${transitionValue}. Already at and END state
|
|
127
|
+
`Skipping transition using ${transitionValue}. Already at and END state`,
|
|
128
128
|
);
|
|
129
129
|
|
|
130
130
|
return;
|
|
@@ -141,7 +141,7 @@ export class FlowInstance {
|
|
|
141
141
|
|
|
142
142
|
if (skipTransition) {
|
|
143
143
|
this.log?.debug(
|
|
144
|
-
`Skipping transition from ${this.currentState.name} b/c hook told us to
|
|
144
|
+
`Skipping transition from ${this.currentState.name} b/c hook told us to`,
|
|
145
145
|
);
|
|
146
146
|
return;
|
|
147
147
|
}
|
|
@@ -149,26 +149,26 @@ export class FlowInstance {
|
|
|
149
149
|
|
|
150
150
|
const state = this.hooks.beforeTransition.call(
|
|
151
151
|
this.currentState.value,
|
|
152
|
-
transitionValue
|
|
152
|
+
transitionValue,
|
|
153
153
|
);
|
|
154
154
|
|
|
155
|
-
if (!(
|
|
155
|
+
if (!("transitions" in state)) {
|
|
156
156
|
throw new Error(`No transitions defined for ${this.currentState.value}`);
|
|
157
157
|
}
|
|
158
158
|
|
|
159
159
|
const { transitions } = state;
|
|
160
|
-
const nextState = transitions[transitionValue] || transitions[
|
|
160
|
+
const nextState = transitions[transitionValue] || transitions["*"];
|
|
161
161
|
|
|
162
162
|
if (nextState === undefined) {
|
|
163
163
|
this.log?.warn(
|
|
164
|
-
`No transition from ${this.currentState.name} using ${transitionValue} or
|
|
164
|
+
`No transition from ${this.currentState.name} using ${transitionValue} or *`,
|
|
165
165
|
);
|
|
166
166
|
|
|
167
167
|
return;
|
|
168
168
|
}
|
|
169
169
|
|
|
170
170
|
this.log?.debug(
|
|
171
|
-
`Transitioning from ${this.currentState.name} to ${nextState} using ${transitionValue}
|
|
171
|
+
`Transitioning from ${this.currentState.name} to ${nextState} using ${transitionValue} `,
|
|
172
172
|
);
|
|
173
173
|
|
|
174
174
|
return this.pushHistory(nextState, options);
|
|
@@ -183,8 +183,8 @@ export class FlowInstance {
|
|
|
183
183
|
|
|
184
184
|
if (
|
|
185
185
|
!this.flow[stateName] ||
|
|
186
|
-
typeof nextState !==
|
|
187
|
-
!(
|
|
186
|
+
typeof nextState !== "object" ||
|
|
187
|
+
!("state_type" in nextState)
|
|
188
188
|
) {
|
|
189
189
|
this.log?.error(`Flow doesn't contain any states named: ${stateName}`);
|
|
190
190
|
|
|
@@ -205,7 +205,7 @@ export class FlowInstance {
|
|
|
205
205
|
|
|
206
206
|
// If the new state is an END state call the `onEnd` if it exists
|
|
207
207
|
|
|
208
|
-
if (newCurrentState.value.state_type ===
|
|
208
|
+
if (newCurrentState.value.state_type === "END" && this.flow.onEnd) {
|
|
209
209
|
this.hooks.onEnd.call(this.flow.onEnd);
|
|
210
210
|
}
|
|
211
211
|
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export * from
|
|
2
|
-
export * from
|
|
1
|
+
export * from "./flow";
|
|
2
|
+
export * from "./controller";
|
package/src/controllers/index.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export * from
|
|
2
|
-
export * from
|
|
3
|
-
export * from
|
|
4
|
-
export * from
|
|
5
|
-
export * from
|
|
1
|
+
export * from "./flow";
|
|
2
|
+
export * from "./validation";
|
|
3
|
+
export * from "./view";
|
|
4
|
+
export * from "./data/controller";
|
|
5
|
+
export * from "./constants";
|
|
@@ -1,14 +1,15 @@
|
|
|
1
|
-
import type { Validation } from
|
|
2
|
-
import type { ViewPlugin, Resolver, Node, ViewInstance } from
|
|
1
|
+
import type { Validation } from "@player-ui/types";
|
|
2
|
+
import type { ViewPlugin, Resolver, Node, ViewInstance } from "../../view";
|
|
3
|
+
import { NodeType } from "../../view";
|
|
3
4
|
import type {
|
|
4
5
|
BindingInstance,
|
|
5
6
|
BindingLike,
|
|
6
7
|
BindingFactory,
|
|
7
|
-
} from
|
|
8
|
-
import { isBinding } from
|
|
9
|
-
import type { ValidationResponse } from
|
|
8
|
+
} from "../../binding";
|
|
9
|
+
import { isBinding } from "../../binding";
|
|
10
|
+
import type { ValidationResponse } from "../../validator";
|
|
10
11
|
|
|
11
|
-
const CONTEXT =
|
|
12
|
+
const CONTEXT = "validation-binding-tracker";
|
|
12
13
|
|
|
13
14
|
export interface BindingTracker {
|
|
14
15
|
/** Get the bindings currently being tracked for validation */
|
|
@@ -67,25 +68,15 @@ export class ValidationBindingTrackerViewPlugin
|
|
|
67
68
|
|
|
68
69
|
let lastViewUpdateChangeSet: Set<BindingInstance> | undefined;
|
|
69
70
|
|
|
70
|
-
const nodeTree = new Map<Node.Node, Set<Node.Node>>();
|
|
71
|
-
|
|
72
71
|
/** Map of node to all bindings in children */
|
|
73
|
-
|
|
72
|
+
const lastComputedBindingTree = new Map<Node.Node, Set<BindingInstance>>();
|
|
74
73
|
let currentBindingTree = new Map<Node.Node, Set<BindingInstance>>();
|
|
75
74
|
|
|
76
75
|
/** Map of registered section nodes to bindings */
|
|
77
76
|
const lastSectionBindingTree = new Map<Node.Node, Set<BindingInstance>>();
|
|
78
77
|
|
|
79
|
-
/**
|
|
80
|
-
|
|
81
|
-
if (nodeTree.has(parent)) {
|
|
82
|
-
nodeTree.get(parent)?.add(child);
|
|
83
|
-
|
|
84
|
-
return;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
nodeTree.set(parent, new Set([child]));
|
|
88
|
-
}
|
|
78
|
+
/** Map of resolved nodes to their original nodes. */
|
|
79
|
+
const resolvedNodeMap: Map<Node.Node, Node.Node> = new Map();
|
|
89
80
|
|
|
90
81
|
resolver.hooks.beforeUpdate.tap(CONTEXT, (changes) => {
|
|
91
82
|
lastViewUpdateChangeSet = changes;
|
|
@@ -100,8 +91,8 @@ export class ValidationBindingTrackerViewPlugin
|
|
|
100
91
|
|
|
101
92
|
const intersection = new Set(
|
|
102
93
|
[...lastViewUpdateChangeSet].filter((b) =>
|
|
103
|
-
trackedBindingsForNode.has(b)
|
|
104
|
-
)
|
|
94
|
+
trackedBindingsForNode.has(b),
|
|
95
|
+
),
|
|
105
96
|
);
|
|
106
97
|
|
|
107
98
|
return intersection.size === 0;
|
|
@@ -158,7 +149,8 @@ export class ValidationBindingTrackerViewPlugin
|
|
|
158
149
|
|
|
159
150
|
const firstFieldEOW = eows?.find(
|
|
160
151
|
(eow) =>
|
|
161
|
-
eow.displayTarget ===
|
|
152
|
+
eow.displayTarget === "field" ||
|
|
153
|
+
eow.displayTarget === undefined,
|
|
162
154
|
);
|
|
163
155
|
|
|
164
156
|
return firstFieldEOW;
|
|
@@ -195,7 +187,7 @@ export class ValidationBindingTrackerViewPlugin
|
|
|
195
187
|
?._getValidationForBinding(binding)
|
|
196
188
|
?.get();
|
|
197
189
|
|
|
198
|
-
if (eow && eow.displayTarget ===
|
|
190
|
+
if (eow && eow.displayTarget === "section") {
|
|
199
191
|
validations.push(eow);
|
|
200
192
|
}
|
|
201
193
|
});
|
|
@@ -203,7 +195,7 @@ export class ValidationBindingTrackerViewPlugin
|
|
|
203
195
|
return validations;
|
|
204
196
|
},
|
|
205
197
|
register: (registerOptions) => {
|
|
206
|
-
if (registerOptions?.type ===
|
|
198
|
+
if (registerOptions?.type === "section") {
|
|
207
199
|
if (!sections.has(node)) {
|
|
208
200
|
sections.set(node, new Set());
|
|
209
201
|
}
|
|
@@ -214,46 +206,66 @@ export class ValidationBindingTrackerViewPlugin
|
|
|
214
206
|
};
|
|
215
207
|
});
|
|
216
208
|
|
|
217
|
-
resolver.hooks.afterNodeUpdate.tap(
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
209
|
+
resolver.hooks.afterNodeUpdate.tap(
|
|
210
|
+
CONTEXT,
|
|
211
|
+
(originalNode, parent, update) => {
|
|
212
|
+
// Compute the new tree for this node
|
|
213
|
+
// If it's not-updated, use the last known value
|
|
214
|
+
|
|
215
|
+
const { updated, node: resolvedNode } = update;
|
|
216
|
+
resolvedNodeMap.set(resolvedNode, originalNode);
|
|
217
|
+
|
|
218
|
+
if (updated) {
|
|
219
|
+
const newlyComputed = new Set(tracked.get(originalNode));
|
|
220
|
+
if (resolvedNode.type === NodeType.MultiNode) {
|
|
221
|
+
resolvedNode.values.forEach((value) =>
|
|
222
|
+
currentBindingTree
|
|
223
|
+
.get(value)
|
|
224
|
+
?.forEach((b) => newlyComputed.add(b)),
|
|
225
|
+
);
|
|
226
|
+
}
|
|
221
227
|
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
});
|
|
230
|
-
currentBindingTree.set(node, newlyComputed);
|
|
231
|
-
} else {
|
|
232
|
-
currentBindingTree.set(
|
|
233
|
-
node,
|
|
234
|
-
lastComputedBindingTree.get(node) ?? new Set()
|
|
235
|
-
);
|
|
236
|
-
}
|
|
228
|
+
if ("children" in resolvedNode && resolvedNode.children) {
|
|
229
|
+
resolvedNode.children.forEach((child) => {
|
|
230
|
+
currentBindingTree
|
|
231
|
+
.get(child.value)
|
|
232
|
+
?.forEach((b) => newlyComputed.add(b));
|
|
233
|
+
});
|
|
234
|
+
}
|
|
237
235
|
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
236
|
+
currentBindingTree.set(resolvedNode, newlyComputed);
|
|
237
|
+
} else {
|
|
238
|
+
currentBindingTree.set(
|
|
239
|
+
resolvedNode,
|
|
240
|
+
lastComputedBindingTree.get(originalNode) ?? new Set(),
|
|
241
|
+
);
|
|
242
|
+
}
|
|
241
243
|
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
244
|
+
if (originalNode === resolver.root) {
|
|
245
|
+
this.trackedBindings = new Set(currentBindingTree.get(resolvedNode));
|
|
246
|
+
lastComputedBindingTree.clear();
|
|
247
|
+
currentBindingTree.forEach((value, key) => {
|
|
248
|
+
const node = resolvedNodeMap.get(key);
|
|
249
|
+
if (node) {
|
|
250
|
+
lastComputedBindingTree.set(node, value);
|
|
251
|
+
}
|
|
247
252
|
});
|
|
248
|
-
lastSectionBindingTree.set(sectionNode, temp);
|
|
249
|
-
});
|
|
250
253
|
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
254
|
+
lastSectionBindingTree.clear();
|
|
255
|
+
sections.forEach((nodeSet, sectionNode) => {
|
|
256
|
+
const temp = new Set<BindingInstance>();
|
|
257
|
+
nodeSet.forEach((n) => {
|
|
258
|
+
tracked.get(n)?.forEach(temp.add, temp);
|
|
259
|
+
});
|
|
260
|
+
lastSectionBindingTree.set(sectionNode, temp);
|
|
261
|
+
});
|
|
262
|
+
|
|
263
|
+
tracked.clear();
|
|
264
|
+
sections.clear();
|
|
265
|
+
currentBindingTree = new Map();
|
|
266
|
+
}
|
|
267
|
+
},
|
|
268
|
+
);
|
|
257
269
|
}
|
|
258
270
|
|
|
259
271
|
apply(view: ViewInstance) {
|