@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.
Files changed (214) hide show
  1. package/dist/Player.native.js +11630 -0
  2. package/dist/Player.native.js.map +1 -0
  3. package/dist/cjs/index.cjs +5626 -0
  4. package/dist/cjs/index.cjs.map +1 -0
  5. package/dist/{index.esm.js → index.legacy-esm.js} +2044 -1667
  6. package/dist/{index.cjs.js → index.mjs} +2052 -1761
  7. package/dist/index.mjs.map +1 -0
  8. package/package.json +29 -63
  9. package/src/__tests__/data.test.ts +498 -0
  10. package/src/__tests__/flow.test.ts +312 -0
  11. package/src/__tests__/helpers/action-exp.plugin.ts +22 -0
  12. package/src/__tests__/helpers/actions.flow.ts +67 -0
  13. package/src/__tests__/helpers/binding.plugin.ts +125 -0
  14. package/src/__tests__/helpers/expression.plugin.ts +88 -0
  15. package/src/__tests__/helpers/transform-plugin.ts +19 -0
  16. package/src/__tests__/helpers/validation.flow.ts +56 -0
  17. package/src/__tests__/player.test.ts +597 -0
  18. package/src/__tests__/string-resolver.test.ts +186 -0
  19. package/src/__tests__/validation.test.ts +3555 -0
  20. package/src/__tests__/view.test.ts +715 -0
  21. package/src/binding/__tests__/binding.test.ts +113 -0
  22. package/src/binding/__tests__/index.test.ts +208 -0
  23. package/src/binding/__tests__/resolver.test.ts +83 -0
  24. package/src/binding/binding.ts +6 -6
  25. package/src/binding/index.ts +34 -34
  26. package/src/binding/resolver.ts +19 -19
  27. package/src/binding/utils.ts +7 -7
  28. package/src/binding-grammar/__tests__/parser.test.ts +64 -0
  29. package/src/binding-grammar/__tests__/test-utils/ast-cases.ts +198 -0
  30. package/src/binding-grammar/__tests__/test-utils/perf-test.ts +66 -0
  31. package/src/binding-grammar/ast.ts +11 -11
  32. package/src/binding-grammar/custom/index.ts +19 -22
  33. package/src/binding-grammar/ebnf/index.ts +20 -21
  34. package/src/binding-grammar/ebnf/types.ts +13 -13
  35. package/src/binding-grammar/index.ts +4 -4
  36. package/src/binding-grammar/parsimmon/index.ts +14 -14
  37. package/src/controllers/constants/__tests__/index.test.ts +106 -0
  38. package/src/controllers/constants/index.ts +3 -3
  39. package/src/controllers/constants/utils.ts +4 -4
  40. package/src/controllers/data/controller.ts +22 -22
  41. package/src/controllers/data/index.ts +1 -1
  42. package/src/controllers/data/utils.ts +7 -7
  43. package/src/controllers/flow/__tests__/controller.test.ts +195 -0
  44. package/src/controllers/flow/__tests__/flow.test.ts +381 -0
  45. package/src/controllers/flow/controller.ts +13 -13
  46. package/src/controllers/flow/flow.ts +23 -23
  47. package/src/controllers/flow/index.ts +2 -2
  48. package/src/controllers/index.ts +5 -5
  49. package/src/controllers/validation/binding-tracker.ts +71 -59
  50. package/src/controllers/validation/controller.ts +104 -104
  51. package/src/controllers/validation/index.ts +2 -2
  52. package/src/controllers/view/asset-transform.ts +20 -20
  53. package/src/controllers/view/controller.ts +27 -27
  54. package/src/controllers/view/index.ts +4 -4
  55. package/src/controllers/view/store.ts +3 -3
  56. package/src/controllers/view/types.ts +7 -7
  57. package/src/data/__tests__/__snapshots__/dependency-tracker.test.ts.snap +64 -0
  58. package/src/data/__tests__/dependency-tracker.test.ts +146 -0
  59. package/src/data/__tests__/local-model.test.ts +46 -0
  60. package/src/data/__tests__/model.test.ts +78 -0
  61. package/src/data/dependency-tracker.ts +16 -16
  62. package/src/data/index.ts +4 -4
  63. package/src/data/local-model.ts +6 -6
  64. package/src/data/model.ts +17 -17
  65. package/src/data/noop-model.ts +1 -1
  66. package/src/expressions/__tests__/__snapshots__/parser.test.ts.snap +854 -0
  67. package/src/expressions/__tests__/evaluator-functions.test.ts +47 -0
  68. package/src/expressions/__tests__/evaluator.test.ts +410 -0
  69. package/src/expressions/__tests__/parser.test.ts +115 -0
  70. package/src/expressions/__tests__/utils.test.ts +44 -0
  71. package/src/expressions/evaluator-functions.ts +6 -6
  72. package/src/expressions/evaluator.ts +71 -67
  73. package/src/expressions/index.ts +4 -4
  74. package/src/expressions/parser.ts +102 -105
  75. package/src/expressions/types.ts +29 -21
  76. package/src/expressions/utils.ts +32 -21
  77. package/src/index.ts +13 -13
  78. package/src/logger/__tests__/consoleLogger.test.ts +46 -0
  79. package/src/logger/__tests__/noopLogger.test.ts +13 -0
  80. package/src/logger/__tests__/proxyLogger.test.ts +31 -0
  81. package/src/logger/__tests__/tapableLogger.test.ts +41 -0
  82. package/src/logger/consoleLogger.ts +9 -9
  83. package/src/logger/index.ts +5 -5
  84. package/src/logger/noopLogger.ts +1 -1
  85. package/src/logger/proxyLogger.ts +6 -6
  86. package/src/logger/tapableLogger.ts +7 -7
  87. package/src/logger/types.ts +2 -2
  88. package/src/player.ts +60 -58
  89. package/src/plugins/default-exp-plugin.ts +10 -10
  90. package/src/plugins/default-view-plugin.ts +29 -0
  91. package/src/plugins/flow-exp-plugin.ts +6 -6
  92. package/src/schema/__tests__/schema.test.ts +243 -0
  93. package/src/schema/index.ts +2 -2
  94. package/src/schema/schema.ts +24 -24
  95. package/src/schema/types.ts +4 -4
  96. package/src/string-resolver/__tests__/index.test.ts +361 -0
  97. package/src/string-resolver/index.ts +17 -17
  98. package/src/types.ts +17 -17
  99. package/src/utils/__tests__/replaceParams.test.ts +33 -0
  100. package/src/utils/index.ts +1 -1
  101. package/src/utils/replaceParams.ts +1 -1
  102. package/src/validator/__tests__/binding-map-splice.test.ts +53 -0
  103. package/src/validator/__tests__/validation-middleware.test.ts +127 -0
  104. package/src/validator/binding-map-splice.ts +5 -5
  105. package/src/validator/index.ts +4 -4
  106. package/src/validator/registry.ts +1 -1
  107. package/src/validator/types.ts +13 -13
  108. package/src/validator/validation-middleware.ts +15 -15
  109. package/src/view/__tests__/view.immutable.test.ts +269 -0
  110. package/src/view/__tests__/view.test.ts +959 -0
  111. package/src/view/builder/index.test.ts +69 -0
  112. package/src/view/builder/index.ts +3 -3
  113. package/src/view/index.ts +5 -5
  114. package/src/view/parser/__tests__/__snapshots__/parser.test.ts.snap +394 -0
  115. package/src/view/parser/__tests__/parser.test.ts +264 -0
  116. package/src/view/parser/index.ts +43 -33
  117. package/src/view/parser/types.ts +11 -11
  118. package/src/view/parser/utils.ts +5 -5
  119. package/src/view/plugins/__tests__/__snapshots__/template.test.ts.snap +278 -0
  120. package/src/view/plugins/__tests__/applicability.test.ts +265 -0
  121. package/src/view/plugins/__tests__/string.test.ts +122 -0
  122. package/src/view/plugins/__tests__/template.test.ts +724 -0
  123. package/src/view/plugins/applicability.ts +19 -19
  124. package/src/view/plugins/index.ts +4 -5
  125. package/src/view/plugins/options.ts +1 -1
  126. package/src/view/plugins/string-resolver.ts +22 -22
  127. package/src/view/plugins/switch.ts +22 -23
  128. package/src/view/plugins/template-plugin.ts +26 -27
  129. package/src/view/resolver/__tests__/dependencies.test.ts +321 -0
  130. package/src/view/resolver/__tests__/edgecases.test.ts +626 -0
  131. package/src/view/resolver/index.ts +42 -42
  132. package/src/view/resolver/types.ts +21 -20
  133. package/src/view/resolver/utils.ts +9 -9
  134. package/src/view/view.ts +32 -22
  135. package/types/binding/binding.d.ts +50 -0
  136. package/types/binding/index.d.ts +29 -0
  137. package/types/binding/resolver.d.ts +26 -0
  138. package/types/binding/utils.d.ts +12 -0
  139. package/types/binding-grammar/ast.d.ts +67 -0
  140. package/types/binding-grammar/custom/index.d.ts +4 -0
  141. package/types/binding-grammar/ebnf/index.d.ts +4 -0
  142. package/types/binding-grammar/ebnf/types.d.ts +75 -0
  143. package/types/binding-grammar/index.d.ts +5 -0
  144. package/types/binding-grammar/parsimmon/index.d.ts +4 -0
  145. package/types/controllers/constants/index.d.ts +45 -0
  146. package/types/controllers/constants/utils.d.ts +6 -0
  147. package/types/controllers/data/controller.d.ts +45 -0
  148. package/types/controllers/data/index.d.ts +2 -0
  149. package/types/controllers/data/utils.d.ts +14 -0
  150. package/types/controllers/flow/controller.d.ts +25 -0
  151. package/types/controllers/flow/flow.d.ts +50 -0
  152. package/types/controllers/flow/index.d.ts +3 -0
  153. package/types/controllers/index.d.ts +6 -0
  154. package/types/controllers/validation/binding-tracker.d.ts +32 -0
  155. package/types/controllers/validation/controller.d.ts +151 -0
  156. package/types/controllers/validation/index.d.ts +3 -0
  157. package/types/controllers/view/asset-transform.d.ts +19 -0
  158. package/types/controllers/view/controller.d.ts +37 -0
  159. package/types/controllers/view/index.d.ts +5 -0
  160. package/types/controllers/view/store.d.ts +20 -0
  161. package/types/controllers/view/types.d.ts +16 -0
  162. package/types/data/dependency-tracker.d.ts +49 -0
  163. package/types/data/index.d.ts +5 -0
  164. package/types/data/local-model.d.ts +16 -0
  165. package/types/data/model.d.ts +86 -0
  166. package/types/data/noop-model.d.ts +13 -0
  167. package/types/expressions/evaluator-functions.d.ts +15 -0
  168. package/types/expressions/evaluator.d.ts +52 -0
  169. package/types/expressions/index.d.ts +5 -0
  170. package/types/expressions/parser.d.ts +10 -0
  171. package/types/expressions/types.d.ts +144 -0
  172. package/types/expressions/utils.d.ts +12 -0
  173. package/types/index.d.ts +14 -0
  174. package/types/logger/consoleLogger.d.ts +17 -0
  175. package/types/logger/index.d.ts +6 -0
  176. package/types/logger/noopLogger.d.ts +10 -0
  177. package/types/logger/proxyLogger.d.ts +15 -0
  178. package/types/logger/tapableLogger.d.ts +23 -0
  179. package/types/logger/types.d.ts +6 -0
  180. package/types/player.d.ts +101 -0
  181. package/types/plugins/default-exp-plugin.d.ts +9 -0
  182. package/types/plugins/default-view-plugin.d.ts +9 -0
  183. package/types/plugins/flow-exp-plugin.d.ts +11 -0
  184. package/types/schema/index.d.ts +3 -0
  185. package/types/schema/schema.d.ts +36 -0
  186. package/types/schema/types.d.ts +38 -0
  187. package/types/string-resolver/index.d.ts +30 -0
  188. package/types/types.d.ts +73 -0
  189. package/types/utils/index.d.ts +2 -0
  190. package/types/utils/replaceParams.d.ts +9 -0
  191. package/types/validator/binding-map-splice.d.ts +10 -0
  192. package/types/validator/index.d.ts +5 -0
  193. package/types/validator/registry.d.ts +11 -0
  194. package/types/validator/types.d.ts +53 -0
  195. package/types/validator/validation-middleware.d.ts +36 -0
  196. package/types/view/builder/index.d.ts +35 -0
  197. package/types/view/index.d.ts +6 -0
  198. package/types/view/parser/index.d.ts +52 -0
  199. package/types/view/parser/types.d.ts +109 -0
  200. package/types/view/parser/utils.d.ts +6 -0
  201. package/types/view/plugins/applicability.d.ts +10 -0
  202. package/types/view/plugins/index.d.ts +5 -0
  203. package/types/view/plugins/options.d.ts +4 -0
  204. package/types/view/plugins/string-resolver.d.ts +13 -0
  205. package/types/view/plugins/switch.d.ts +14 -0
  206. package/types/view/plugins/template-plugin.d.ts +33 -0
  207. package/types/view/resolver/index.d.ts +73 -0
  208. package/types/view/resolver/types.d.ts +129 -0
  209. package/types/view/resolver/utils.d.ts +11 -0
  210. package/types/view/view.d.ts +37 -0
  211. package/dist/index.d.ts +0 -1814
  212. package/dist/player.dev.js +0 -11472
  213. package/dist/player.prod.js +0 -2
  214. package/src/view/plugins/plugin.ts +0 -21
@@ -1,12 +1,12 @@
1
- import { SyncBailHook, SyncHook, SyncWaterfallHook } from 'tapable-ts';
2
- import type { DeferredPromise } from 'p-defer';
3
- import defer from 'p-defer';
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 '@player-ui/types';
9
- import type { Logger } from '../../logger';
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
- 'startPromise',
81
+ "startPromise",
82
82
  async (_oldState, nextState: NamedState) => {
83
83
  const newState = nextState.value;
84
84
 
85
- if (this.flowPromise && newState.state_type === 'END') {
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('Already called start for flow');
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 === 'END') {
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 (!('transitions' in state)) {
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 !== 'object' ||
187
- !('state_type' in nextState)
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 === 'END' && this.flow.onEnd) {
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 './flow';
2
- export * from './controller';
1
+ export * from "./flow";
2
+ export * from "./controller";
@@ -1,5 +1,5 @@
1
- export * from './flow';
2
- export * from './validation';
3
- export * from './view';
4
- export * from './data/controller';
5
- export * from './constants';
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 '@player-ui/types';
2
- import type { ViewPlugin, Resolver, Node, ViewInstance } from '../../view';
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 '../../binding';
8
- import { isBinding } from '../../binding';
9
- import type { ValidationResponse } from '../../validator';
8
+ } from "../../binding";
9
+ import { isBinding } from "../../binding";
10
+ import type { ValidationResponse } from "../../validator";
10
11
 
11
- const CONTEXT = 'validation-binding-tracker';
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
- let lastComputedBindingTree = new Map<Node.Node, Set<BindingInstance>>();
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
- /** Add the given child to the parent's tree. Create the parent entry if none exists */
80
- function addToTree(child: Node.Node, parent: Node.Node) {
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 === 'field' || eow.displayTarget === undefined
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 === 'section') {
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 === 'section') {
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(CONTEXT, (node, parent, update) => {
218
- if (parent) {
219
- addToTree(node, parent);
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
- // Compute the new tree for this node
223
- // If it's not-updated, use the last known value
224
-
225
- if (update.updated) {
226
- const newlyComputed = new Set(tracked.get(node));
227
- nodeTree.get(node)?.forEach((child) => {
228
- currentBindingTree.get(child)?.forEach((b) => newlyComputed.add(b));
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
- if (node === resolver.root) {
239
- this.trackedBindings = new Set(currentBindingTree.get(node));
240
- lastComputedBindingTree = currentBindingTree;
236
+ currentBindingTree.set(resolvedNode, newlyComputed);
237
+ } else {
238
+ currentBindingTree.set(
239
+ resolvedNode,
240
+ lastComputedBindingTree.get(originalNode) ?? new Set(),
241
+ );
242
+ }
241
243
 
242
- lastSectionBindingTree.clear();
243
- sections.forEach((nodeSet, sectionNode) => {
244
- const temp = new Set<BindingInstance>();
245
- nodeSet.forEach((n) => {
246
- tracked.get(n)?.forEach(temp.add, temp);
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
- nodeTree.clear();
252
- tracked.clear();
253
- sections.clear();
254
- currentBindingTree = new Map();
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) {