@kaskad/component-tree 0.0.1

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 (134) hide show
  1. package/README.md +7 -0
  2. package/esm2022/index.js +12 -0
  3. package/esm2022/index.js.map +1 -0
  4. package/esm2022/kaskad-component-tree.js +5 -0
  5. package/esm2022/kaskad-component-tree.js.map +1 -0
  6. package/esm2022/lib/component-lookup/index.js +68 -0
  7. package/esm2022/lib/component-lookup/index.js.map +1 -0
  8. package/esm2022/lib/component-lookup/traverses/array-traverser.js +18 -0
  9. package/esm2022/lib/component-lookup/traverses/array-traverser.js.map +1 -0
  10. package/esm2022/lib/component-lookup/traverses/component-traverser.js +120 -0
  11. package/esm2022/lib/component-lookup/traverses/component-traverser.js.map +1 -0
  12. package/esm2022/lib/component-lookup/traverses/index.js +29 -0
  13. package/esm2022/lib/component-lookup/traverses/index.js.map +1 -0
  14. package/esm2022/lib/component-lookup/traverses/object-traverser.js +22 -0
  15. package/esm2022/lib/component-lookup/traverses/object-traverser.js.map +1 -0
  16. package/esm2022/lib/component-lookup/types.js +1 -0
  17. package/esm2022/lib/component-lookup/types.js.map +1 -0
  18. package/esm2022/lib/component-tree-api.js +121 -0
  19. package/esm2022/lib/component-tree-api.js.map +1 -0
  20. package/esm2022/lib/computation/computation-frame.js +27 -0
  21. package/esm2022/lib/computation/computation-frame.js.map +1 -0
  22. package/esm2022/lib/computation/computation-stack.js +83 -0
  23. package/esm2022/lib/computation/computation-stack.js.map +1 -0
  24. package/esm2022/lib/computation/index.js +3 -0
  25. package/esm2022/lib/computation/index.js.map +1 -0
  26. package/esm2022/lib/config.js +6 -0
  27. package/esm2022/lib/config.js.map +1 -0
  28. package/esm2022/lib/mobx/component.js +110 -0
  29. package/esm2022/lib/mobx/component.js.map +1 -0
  30. package/esm2022/lib/mobx/create-root-node.js +21 -0
  31. package/esm2022/lib/mobx/create-root-node.js.map +1 -0
  32. package/esm2022/lib/mobx/ref-space.js +25 -0
  33. package/esm2022/lib/mobx/ref-space.js.map +1 -0
  34. package/esm2022/lib/mobx/store.js +827 -0
  35. package/esm2022/lib/mobx/store.js.map +1 -0
  36. package/esm2022/lib/node/create-node-options.js +16 -0
  37. package/esm2022/lib/node/create-node-options.js.map +1 -0
  38. package/esm2022/lib/node/creators/array-creator.js +9 -0
  39. package/esm2022/lib/node/creators/array-creator.js.map +1 -0
  40. package/esm2022/lib/node/creators/command-creator.js +16 -0
  41. package/esm2022/lib/node/creators/command-creator.js.map +1 -0
  42. package/esm2022/lib/node/creators/component-creator.js +58 -0
  43. package/esm2022/lib/node/creators/component-creator.js.map +1 -0
  44. package/esm2022/lib/node/creators/leaf-creator.js +5 -0
  45. package/esm2022/lib/node/creators/leaf-creator.js.map +1 -0
  46. package/esm2022/lib/node/creators/map-creator.js +14 -0
  47. package/esm2022/lib/node/creators/map-creator.js.map +1 -0
  48. package/esm2022/lib/node/creators/object-creator.js +17 -0
  49. package/esm2022/lib/node/creators/object-creator.js.map +1 -0
  50. package/esm2022/lib/node/creators/set-creator.js +13 -0
  51. package/esm2022/lib/node/creators/set-creator.js.map +1 -0
  52. package/esm2022/lib/node/creators/shape-creator.js +15 -0
  53. package/esm2022/lib/node/creators/shape-creator.js.map +1 -0
  54. package/esm2022/lib/node/creators/variant-shape-creator.js +23 -0
  55. package/esm2022/lib/node/creators/variant-shape-creator.js.map +1 -0
  56. package/esm2022/lib/node/guards.js +5 -0
  57. package/esm2022/lib/node/guards.js.map +1 -0
  58. package/esm2022/lib/node/node-creation.js +47 -0
  59. package/esm2022/lib/node/node-creation.js.map +1 -0
  60. package/esm2022/lib/node/node-type.js +1 -0
  61. package/esm2022/lib/node/node-type.js.map +1 -0
  62. package/esm2022/lib/node/node.js +305 -0
  63. package/esm2022/lib/node/node.js.map +1 -0
  64. package/esm2022/lib/parsers/index.js +3 -0
  65. package/esm2022/lib/parsers/index.js.map +1 -0
  66. package/esm2022/lib/parsers/node-selector.types.js +1 -0
  67. package/esm2022/lib/parsers/node-selector.types.js.map +1 -0
  68. package/esm2022/lib/parsers/parse-component-selector.js +43 -0
  69. package/esm2022/lib/parsers/parse-component-selector.js.map +1 -0
  70. package/esm2022/lib/parsers/parse-node-selector.js +263 -0
  71. package/esm2022/lib/parsers/parse-node-selector.js.map +1 -0
  72. package/esm2022/lib/types/command.js +1 -0
  73. package/esm2022/lib/types/command.js.map +1 -0
  74. package/esm2022/lib/types/index.js +5 -0
  75. package/esm2022/lib/types/index.js.map +1 -0
  76. package/esm2022/lib/types/node.guards.js +7 -0
  77. package/esm2022/lib/types/node.guards.js.map +1 -0
  78. package/esm2022/lib/types/schema.js +1 -0
  79. package/esm2022/lib/types/schema.js.map +1 -0
  80. package/esm2022/lib/util/extract-node-value.js +45 -0
  81. package/esm2022/lib/util/extract-node-value.js.map +1 -0
  82. package/esm2022/lib/util/format-source.js +7 -0
  83. package/esm2022/lib/util/format-source.js.map +1 -0
  84. package/esm2022/lib/util/get-component.js +8 -0
  85. package/esm2022/lib/util/get-component.js.map +1 -0
  86. package/esm2022/lib/util/id-generator.js +10 -0
  87. package/esm2022/lib/util/id-generator.js.map +1 -0
  88. package/esm2022/lib/util/traverse-node.js +50 -0
  89. package/esm2022/lib/util/traverse-node.js.map +1 -0
  90. package/index.d.ts +11 -0
  91. package/kaskad-component-tree.d.ts +5 -0
  92. package/lib/component-lookup/index.d.ts +8 -0
  93. package/lib/component-lookup/traverses/array-traverser.d.ts +3 -0
  94. package/lib/component-lookup/traverses/component-traverser.d.ts +3 -0
  95. package/lib/component-lookup/traverses/index.d.ts +9 -0
  96. package/lib/component-lookup/traverses/object-traverser.d.ts +3 -0
  97. package/lib/component-lookup/types.d.ts +13 -0
  98. package/lib/component-tree-api.d.ts +21 -0
  99. package/lib/computation/computation-frame.d.ts +14 -0
  100. package/lib/computation/computation-stack.d.ts +48 -0
  101. package/lib/computation/index.d.ts +2 -0
  102. package/lib/config.d.ts +4 -0
  103. package/lib/mobx/component.d.ts +45 -0
  104. package/lib/mobx/create-root-node.d.ts +3 -0
  105. package/lib/mobx/ref-space.d.ts +10 -0
  106. package/lib/mobx/store.d.ts +238 -0
  107. package/lib/node/create-node-options.d.ts +12 -0
  108. package/lib/node/creators/array-creator.d.ts +4 -0
  109. package/lib/node/creators/command-creator.d.ts +4 -0
  110. package/lib/node/creators/component-creator.d.ts +4 -0
  111. package/lib/node/creators/leaf-creator.d.ts +4 -0
  112. package/lib/node/creators/map-creator.d.ts +4 -0
  113. package/lib/node/creators/object-creator.d.ts +4 -0
  114. package/lib/node/creators/set-creator.d.ts +4 -0
  115. package/lib/node/creators/shape-creator.d.ts +4 -0
  116. package/lib/node/creators/variant-shape-creator.d.ts +4 -0
  117. package/lib/node/guards.d.ts +3 -0
  118. package/lib/node/node-creation.d.ts +4 -0
  119. package/lib/node/node-type.d.ts +49 -0
  120. package/lib/node/node.d.ts +107 -0
  121. package/lib/parsers/index.d.ts +5 -0
  122. package/lib/parsers/node-selector.types.d.ts +25 -0
  123. package/lib/parsers/parse-component-selector.d.ts +8 -0
  124. package/lib/parsers/parse-node-selector.d.ts +87 -0
  125. package/lib/types/command.d.ts +3 -0
  126. package/lib/types/index.d.ts +4 -0
  127. package/lib/types/node.guards.d.ts +4 -0
  128. package/lib/types/schema.d.ts +13 -0
  129. package/lib/util/extract-node-value.d.ts +3 -0
  130. package/lib/util/format-source.d.ts +1 -0
  131. package/lib/util/get-component.d.ts +4 -0
  132. package/lib/util/id-generator.d.ts +5 -0
  133. package/lib/util/traverse-node.d.ts +26 -0
  134. package/package.json +26 -0
@@ -0,0 +1,305 @@
1
+ import { computed, makeObservable, observable, runInAction } from 'mobx';
2
+ import { ComputationStack } from '../computation';
3
+ import { componentTreeConfig } from '../config';
4
+ import { isNode } from './guards';
5
+ export class AbstractNode {
6
+ valueType;
7
+ position;
8
+ nodeType;
9
+ computationStack = new ComputationStack();
10
+ bindingSchema = null;
11
+ extraBinding = null;
12
+ disposers = [];
13
+ selfEvaluating = false;
14
+ selfFailed = false;
15
+ selfActivated = false;
16
+ constructor(valueType, structure, position) {
17
+ this.valueType = valueType;
18
+ this.position = position;
19
+ if (structure === undefined) {
20
+ throw new Error(`Node structure cannot be undefined`);
21
+ }
22
+ this._structure = structure;
23
+ this.nodeType = valueType.type;
24
+ makeObservable(this, {
25
+ _structure: observable.ref,
26
+ selfEvaluating: observable.ref,
27
+ selfFailed: observable.ref,
28
+ selfActivated: observable.ref,
29
+ evaluating: computed,
30
+ failed: computed,
31
+ fullyActivated: computed,
32
+ computationActivated: computed,
33
+ isSelfActivated: computed,
34
+ extractedValue: computed,
35
+ viewModel: computed,
36
+ }, { name: `Node-${this.valueType.type}` });
37
+ }
38
+ _structure;
39
+ get structure() {
40
+ return this._structure;
41
+ }
42
+ set structure(value) {
43
+ if (value === undefined) {
44
+ throw new Error(`Node structure cannot be undefined`);
45
+ }
46
+ runInAction(() => (this._structure = value));
47
+ }
48
+ get evaluating() {
49
+ return this.selfEvaluating || this.childrenEvaluating;
50
+ }
51
+ set evaluating(evaluating) {
52
+ this.selfEvaluating = evaluating;
53
+ }
54
+ get failed() {
55
+ return this.selfFailed || this.childrenFailed;
56
+ }
57
+ set failed(failed) {
58
+ this.selfFailed = failed;
59
+ }
60
+ get fullyActivated() {
61
+ return this.selfActivated && this.computationActivated && this.childrenActivated;
62
+ }
63
+ get computationActivated() {
64
+ return this.computationStack.allActivated;
65
+ }
66
+ get isSelfActivated() {
67
+ return this.selfActivated;
68
+ }
69
+ get viewModel() {
70
+ return this.extractedValue;
71
+ }
72
+ markActivated() {
73
+ runInAction(() => (this.selfActivated = true));
74
+ }
75
+ dispose() {
76
+ runInAction(() => {
77
+ // Dispose all computation frames in the stack
78
+ this.computationStack.dispose();
79
+ // run self-level disposers
80
+ this.disposers.forEach((disposer) => disposer());
81
+ this.disposers.length = 0; // reset array
82
+ });
83
+ // delegate to subclass for the child walk
84
+ this.disposeChildren();
85
+ }
86
+ }
87
+ export class LeafNode extends AbstractNode {
88
+ constructor(valueType, structure, position) {
89
+ super(valueType, structure, position);
90
+ }
91
+ get extractedValue() {
92
+ return this.structure;
93
+ }
94
+ get childrenEvaluating() {
95
+ return false;
96
+ }
97
+ get childrenFailed() {
98
+ return false;
99
+ }
100
+ get childrenActivated() {
101
+ return true;
102
+ }
103
+ getNodeByPath(path) {
104
+ // Leaf nodes cannot be traversed further
105
+ return path.length === 0 ? this : null;
106
+ }
107
+ disposeChildren() {
108
+ return;
109
+ }
110
+ }
111
+ export class CommandNode extends LeafNode {
112
+ inFlight = 0;
113
+ constructor(valueType, structure, position) {
114
+ super(valueType, structure, position);
115
+ makeObservable(this, {
116
+ inFlight: observable,
117
+ executing: computed,
118
+ });
119
+ }
120
+ get executing() {
121
+ return this.inFlight > 0;
122
+ }
123
+ get viewModel() {
124
+ return {
125
+ execute: this.#execute,
126
+ executing: this.executing,
127
+ failed: this.failed,
128
+ };
129
+ }
130
+ #execute = async (...args) => {
131
+ runInAction(() => this.inFlight++);
132
+ this.failed = false; // Reset failed state before execution
133
+ try {
134
+ return await componentTreeConfig.runCommand(this, ...args);
135
+ }
136
+ catch (error) {
137
+ this.failed = true; // Set failed state on error
138
+ throw error;
139
+ }
140
+ finally {
141
+ runInAction(() => this.inFlight--);
142
+ }
143
+ };
144
+ }
145
+ export class ArrayNode extends AbstractNode {
146
+ constructor(valueType, structure, position) {
147
+ super(valueType, structure, position);
148
+ }
149
+ get extractedValue() {
150
+ const value = this.structure;
151
+ if (!value)
152
+ return null;
153
+ return value.map((item) => item.extractedValue);
154
+ }
155
+ get childrenEvaluating() {
156
+ return this.structure ? this.structure.some((n) => n.evaluating) : false;
157
+ }
158
+ get childrenFailed() {
159
+ return this.structure ? this.structure.some((n) => n.failed) : false;
160
+ }
161
+ get childrenActivated() {
162
+ return this.structure ? this.structure.every((n) => n.fullyActivated) : true;
163
+ }
164
+ getNodeByPath(path) {
165
+ if (path.length === 0) {
166
+ return this;
167
+ }
168
+ const [head, ...tail] = path;
169
+ if (!this.structure)
170
+ return null;
171
+ const found = this.structure[head];
172
+ if (!found)
173
+ return null;
174
+ return found.getNodeByPath(tail);
175
+ }
176
+ disposeChildren() {
177
+ this.structure?.forEach((child) => isNode(child) && child.dispose());
178
+ }
179
+ }
180
+ export class AbstractObjectLikeNode extends AbstractNode {
181
+ constructor(valueType, structure, position) {
182
+ super(valueType, structure, position);
183
+ }
184
+ get childrenEvaluating() {
185
+ const obj = this.object();
186
+ return !!obj && Object.values(obj).some((n) => n.evaluating);
187
+ }
188
+ get childrenFailed() {
189
+ const obj = this.object();
190
+ return !!obj && Object.values(obj).some((n) => n.failed);
191
+ }
192
+ get childrenActivated() {
193
+ const obj = this.object();
194
+ return obj ? Object.values(obj).every((n) => n.fullyActivated) : true;
195
+ }
196
+ getNodeByPath(path) {
197
+ if (path.length === 0) {
198
+ return this;
199
+ }
200
+ const [head, ...tail] = path;
201
+ const obj = this.object();
202
+ if (!obj)
203
+ return null;
204
+ const found = obj[head];
205
+ if (!found)
206
+ return null;
207
+ return found.getNodeByPath(tail);
208
+ }
209
+ disposeChildren() {
210
+ const obj = this.object();
211
+ if (!obj)
212
+ return;
213
+ Object.values(obj).forEach((n) => n.dispose());
214
+ }
215
+ mapObjectExtracted() {
216
+ const obj = this.object();
217
+ if (!obj)
218
+ return null;
219
+ return Object.fromEntries(Object.entries(obj).map(([k, n]) => [k, n.extractedValue]));
220
+ }
221
+ }
222
+ export class MapNode extends AbstractObjectLikeNode {
223
+ constructor(valueType, structure, position) {
224
+ super(valueType, structure, position);
225
+ }
226
+ get extractedValue() {
227
+ return this.mapObjectExtracted();
228
+ }
229
+ object() {
230
+ return this.structure;
231
+ }
232
+ }
233
+ export class SetNode extends AbstractNode {
234
+ constructor(valueType, structure, position) {
235
+ super(valueType, structure, position);
236
+ }
237
+ get extractedValue() {
238
+ const value = this.structure;
239
+ if (!value)
240
+ return null;
241
+ const extractedValues = new Set();
242
+ value.forEach((item) => {
243
+ extractedValues.add(item.extractedValue);
244
+ });
245
+ return extractedValues;
246
+ }
247
+ get childrenEvaluating() {
248
+ return this.structure ? Array.from(this.structure).some((n) => n.evaluating) : false;
249
+ }
250
+ get childrenFailed() {
251
+ return this.structure ? Array.from(this.structure).some((n) => n.failed) : false;
252
+ }
253
+ get childrenActivated() {
254
+ return this.structure ? Array.from(this.structure).every((n) => n.fullyActivated) : true;
255
+ }
256
+ getNodeByPath(path) {
257
+ if (path.length === 0) {
258
+ return this;
259
+ }
260
+ // Sets don't support path traversal since they don't have indexed access
261
+ return null;
262
+ }
263
+ disposeChildren() {
264
+ this.structure?.forEach((child) => isNode(child) && child.dispose());
265
+ }
266
+ }
267
+ export class ObjectNode extends AbstractObjectLikeNode {
268
+ constructor(valueType, structure, position) {
269
+ super(valueType, structure, position);
270
+ }
271
+ get extractedValue() {
272
+ return this.mapObjectExtracted();
273
+ }
274
+ object() {
275
+ return this.structure;
276
+ }
277
+ }
278
+ export class ShapeNode extends AbstractObjectLikeNode {
279
+ constructor(valueType, structure, position) {
280
+ super(valueType, structure, position);
281
+ }
282
+ get extractedValue() {
283
+ return this.mapObjectExtracted();
284
+ }
285
+ object() {
286
+ return this.structure;
287
+ }
288
+ }
289
+ export class VariantShapeNode extends AbstractObjectLikeNode {
290
+ constructor(valueType, structure, position) {
291
+ super(valueType, structure, position);
292
+ }
293
+ get extractedValue() {
294
+ const base = this.mapObjectExtracted();
295
+ if (!base || !this.structure)
296
+ return null;
297
+ const kindField = `${this.valueType.shapeType}Type`;
298
+ return { ...base, [kindField]: this.structure.kind };
299
+ }
300
+ object() {
301
+ return this.structure?.fields ?? null;
302
+ }
303
+ }
304
+ // TNode is removed - use AbstractNode<ValueType> directly
305
+ //# sourceMappingURL=node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.js","sourceRoot":"","sources":["../../../../../../libs/component-tree/src/lib/node/node.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n ArrayValueType,\n BindingSchema,\n CommandValueType,\n MapValueType,\n NodePosition,\n ObjectValueType,\n SetValueType,\n ShapeValueType,\n ValueType,\n VariantShapeValueType,\n} from '@kaskad/types';\nimport { computed, IReactionDisposer, makeObservable, observable, runInAction } from 'mobx';\n\nimport { ComputationStack } from '../computation';\nimport { componentTreeConfig } from '../config';\nimport { isNode } from './guards';\nimport { NodeExtractedValue, NodeStructure, NodeViewModel } from './node-type';\n\nexport abstract class AbstractNode<T extends ValueType> {\n readonly nodeType: T['type'];\n public readonly computationStack = new ComputationStack();\n bindingSchema: BindingSchema | null = null;\n extraBinding?: BindingSchema | null = null;\n disposers: IReactionDisposer[] = [];\n protected selfEvaluating = false;\n protected selfFailed = false;\n protected selfActivated = false;\n\n protected constructor(\n public readonly valueType: T,\n structure: NodeStructure<T> | null,\n public position: NodePosition,\n ) {\n if (structure === undefined) {\n throw new Error(`Node structure cannot be undefined`);\n }\n\n this._structure = structure;\n this.nodeType = valueType.type;\n\n makeObservable<AbstractNode<T>, '_structure' | 'selfEvaluating' | 'selfFailed' | 'selfActivated'>(\n this,\n {\n _structure: observable.ref,\n selfEvaluating: observable.ref,\n selfFailed: observable.ref,\n selfActivated: observable.ref,\n evaluating: computed,\n failed: computed,\n fullyActivated: computed,\n computationActivated: computed,\n isSelfActivated: computed,\n extractedValue: computed,\n viewModel: computed,\n },\n { name: `Node-${this.valueType.type}` },\n );\n }\n\n private _structure!: NodeStructure<T> | null;\n\n get structure(): NodeStructure<T> | null {\n return this._structure;\n }\n\n set structure(value: NodeStructure<T>) {\n if (value === undefined) {\n throw new Error(`Node structure cannot be undefined`);\n }\n\n runInAction(() => (this._structure = value));\n }\n\n abstract get extractedValue(): NodeExtractedValue<T> | null;\n\n get evaluating(): boolean {\n return this.selfEvaluating || this.childrenEvaluating;\n }\n\n set evaluating(evaluating: boolean) {\n this.selfEvaluating = evaluating;\n }\n\n get failed(): boolean {\n return this.selfFailed || this.childrenFailed;\n }\n\n set failed(failed: boolean) {\n this.selfFailed = failed;\n }\n\n get fullyActivated(): boolean {\n return this.selfActivated && this.computationActivated && this.childrenActivated;\n }\n\n get computationActivated(): boolean {\n return this.computationStack.allActivated;\n }\n\n get isSelfActivated(): boolean {\n return this.selfActivated;\n }\n\n get viewModel(): NodeViewModel<T> | null {\n return this.extractedValue as NodeViewModel<T> | null;\n }\n\n protected abstract get childrenEvaluating(): boolean;\n\n protected abstract get childrenFailed(): boolean;\n\n protected abstract get childrenActivated(): boolean;\n\n markActivated(): void {\n runInAction(() => (this.selfActivated = true));\n }\n\n public dispose(): void {\n runInAction(() => {\n // Dispose all computation frames in the stack\n this.computationStack.dispose();\n\n // run self-level disposers\n this.disposers.forEach((disposer) => disposer());\n this.disposers.length = 0; // reset array\n });\n\n // delegate to subclass for the child walk\n this.disposeChildren();\n }\n\n /**\n * Find a sub-node by following a path of segments.\n * @param path Array of strings/numbers representing the path to traverse\n * @returns The found node or null if not found/traversal not possible\n */\n abstract getNodeByPath(path: (string | number)[]): AbstractNode<ValueType> | null;\n\n protected abstract disposeChildren(): void;\n}\n\nexport class LeafNode<T extends ValueType> extends AbstractNode<T> {\n constructor(valueType: T, structure: NodeStructure<T> | null, position: NodePosition) {\n super(valueType, structure, position);\n }\n\n get extractedValue(): NodeExtractedValue<T> | null {\n return this.structure;\n }\n\n protected get childrenEvaluating() {\n return false;\n }\n\n protected get childrenFailed() {\n return false;\n }\n\n protected get childrenActivated() {\n return true;\n }\n\n getNodeByPath(path: (string | number)[]): AbstractNode<ValueType> | null {\n // Leaf nodes cannot be traversed further\n return path.length === 0 ? (this as AbstractNode<ValueType>) : null;\n }\n\n protected disposeChildren(): void {\n return;\n }\n}\n\nexport class CommandNode extends LeafNode<CommandValueType> {\n inFlight = 0;\n\n constructor(valueType: CommandValueType, structure: NodeStructure<CommandValueType> | null, position: NodePosition) {\n super(valueType, structure, position);\n makeObservable(this, {\n inFlight: observable,\n executing: computed,\n });\n }\n\n get executing() {\n return this.inFlight > 0;\n }\n\n override get viewModel(): NodeViewModel<CommandValueType> {\n return {\n execute: this.#execute,\n executing: this.executing,\n failed: this.failed,\n };\n }\n\n #execute = async (...args: unknown[]) => {\n runInAction(() => this.inFlight++);\n this.failed = false; // Reset failed state before execution\n try {\n return await componentTreeConfig.runCommand(this, ...args);\n } catch (error) {\n this.failed = true; // Set failed state on error\n throw error;\n } finally {\n runInAction(() => this.inFlight--);\n }\n };\n}\n\nexport class ArrayNode extends AbstractNode<ArrayValueType> {\n constructor(valueType: ArrayValueType, structure: NodeStructure<ArrayValueType> | null, position: NodePosition) {\n super(valueType, structure, position);\n }\n\n get extractedValue(): NodeExtractedValue<ArrayValueType> | null {\n const value = this.structure;\n if (!value) return null;\n return value.map((item) => item.extractedValue);\n }\n\n protected get childrenEvaluating(): boolean {\n return this.structure ? this.structure.some((n) => n.evaluating) : false;\n }\n\n protected get childrenFailed(): boolean {\n return this.structure ? this.structure.some((n) => n.failed) : false;\n }\n\n protected get childrenActivated(): boolean {\n return this.structure ? this.structure.every((n) => n.fullyActivated) : true;\n }\n\n getNodeByPath(path: (string | number)[]): AbstractNode<ValueType> | null {\n if (path.length === 0) {\n return this;\n }\n\n const [head, ...tail] = path;\n if (!this.structure) return null;\n\n const found = this.structure[head as number];\n if (!found) return null;\n\n return found.getNodeByPath(tail);\n }\n\n protected disposeChildren(): void {\n this.structure?.forEach((child) => isNode(child) && child.dispose());\n }\n}\n\nexport abstract class AbstractObjectLikeNode<T extends ValueType> extends AbstractNode<T> {\n protected constructor(valueType: T, structure: NodeStructure<T> | null, position: NodePosition) {\n super(valueType, structure, position);\n }\n\n protected get childrenEvaluating(): boolean {\n const obj = this.object();\n return !!obj && Object.values(obj).some((n) => n.evaluating);\n }\n\n protected get childrenFailed(): boolean {\n const obj = this.object();\n return !!obj && Object.values(obj).some((n) => n.failed);\n }\n\n protected get childrenActivated(): boolean {\n const obj = this.object();\n return obj ? Object.values(obj).every((n) => n.fullyActivated) : true;\n }\n\n getNodeByPath(path: (string | number)[]): AbstractNode<ValueType> | null {\n if (path.length === 0) {\n return this as AbstractNode<ValueType>;\n }\n\n const [head, ...tail] = path;\n const obj = this.object();\n if (!obj) return null;\n\n const found = obj[head as string];\n if (!found) return null;\n\n return found.getNodeByPath(tail);\n }\n\n protected abstract object(): Record<string, AbstractNode<ValueType>> | null;\n\n protected disposeChildren(): void {\n const obj = this.object();\n if (!obj) return;\n Object.values(obj).forEach((n) => n.dispose());\n }\n\n protected mapObjectExtracted(): Record<string, unknown> | null {\n const obj = this.object();\n if (!obj) return null;\n return Object.fromEntries(Object.entries(obj).map(([k, n]) => [k, n.extractedValue]));\n }\n}\n\nexport class MapNode extends AbstractObjectLikeNode<MapValueType> {\n constructor(valueType: MapValueType, structure: NodeStructure<MapValueType> | null, position: NodePosition) {\n super(valueType, structure, position);\n }\n\n get extractedValue() {\n return this.mapObjectExtracted();\n }\n\n protected object() {\n return this.structure;\n }\n}\n\nexport class SetNode extends AbstractNode<SetValueType> {\n constructor(valueType: SetValueType, structure: NodeStructure<SetValueType> | null, position: NodePosition) {\n super(valueType, structure, position);\n }\n\n get extractedValue(): NodeExtractedValue<SetValueType> | null {\n const value = this.structure;\n if (!value) return null;\n const extractedValues = new Set<unknown>();\n value.forEach((item) => {\n extractedValues.add(item.extractedValue);\n });\n return extractedValues;\n }\n\n protected get childrenEvaluating(): boolean {\n return this.structure ? Array.from(this.structure).some((n) => n.evaluating) : false;\n }\n\n protected get childrenFailed(): boolean {\n return this.structure ? Array.from(this.structure).some((n) => n.failed) : false;\n }\n\n protected get childrenActivated(): boolean {\n return this.structure ? Array.from(this.structure).every((n) => n.fullyActivated) : true;\n }\n\n getNodeByPath(path: (string | number)[]): AbstractNode<ValueType> | null {\n if (path.length === 0) {\n return this;\n }\n\n // Sets don't support path traversal since they don't have indexed access\n return null;\n }\n\n protected disposeChildren(): void {\n this.structure?.forEach((child) => isNode(child) && child.dispose());\n }\n}\n\nexport class ObjectNode extends AbstractObjectLikeNode<ObjectValueType> {\n constructor(valueType: ObjectValueType, structure: NodeStructure<ObjectValueType> | null, position: NodePosition) {\n super(valueType, structure, position);\n }\n\n get extractedValue() {\n return this.mapObjectExtracted();\n }\n\n protected object() {\n return this.structure;\n }\n}\n\nexport class ShapeNode extends AbstractObjectLikeNode<ShapeValueType> {\n constructor(valueType: ShapeValueType, structure: NodeStructure<ShapeValueType> | null, position: NodePosition) {\n super(valueType, structure, position);\n }\n\n get extractedValue() {\n return this.mapObjectExtracted();\n }\n\n protected object() {\n return this.structure;\n }\n}\n\nexport class VariantShapeNode extends AbstractObjectLikeNode<VariantShapeValueType> {\n constructor(\n valueType: VariantShapeValueType,\n structure: NodeStructure<VariantShapeValueType> | null,\n position: NodePosition,\n ) {\n super(valueType, structure, position);\n }\n\n get extractedValue() {\n const base = this.mapObjectExtracted();\n if (!base || !this.structure) return null;\n const kindField = `${this.valueType.shapeType}Type`;\n return { ...base, [kindField]: this.structure.kind };\n }\n\n protected object() {\n return this.structure?.fields ?? null;\n }\n}\n\n// TNode is removed - use AbstractNode<ValueType> directly\n"]}
@@ -0,0 +1,3 @@
1
+ export { parseNodeSelector } from './parse-node-selector';
2
+ export { parseComponentSelector } from './parse-component-selector';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../libs/component-tree/src/lib/parsers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAK1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC","sourcesContent":["export { parseNodeSelector } from './parse-node-selector';\nexport type { PathPart, PathArray } from './parse-node-selector';\n\nexport type { NodeSelector, PathSegment } from './node-selector.types';\n\nexport { parseComponentSelector } from './parse-component-selector';\nexport type { SelectorSegment, SelectorSegmentModifier } from './parse-component-selector';\n"]}
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=node-selector.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-selector.types.js","sourceRoot":"","sources":["../../../../../../libs/component-tree/src/lib/parsers/node-selector.types.ts"],"names":[],"mappings":"","sourcesContent":["import { SelectorSegment } from './parse-component-selector';\n\nexport interface ComponentSelectorInfo {\n /**\n * Component selector segments (e.g., &ref, :Type, ^Parent with conditions).\n */\n selector: SelectorSegment[];\n /**\n * If true, uses ?-> instead of ->,\n * meaning it should return null instead of throwing if the component is not found.\n */\n optional: boolean;\n}\n\nexport interface NodeSelector {\n kind: 'property' | 'variable';\n head: string;\n tail: PathSegment[];\n /**\n * If present, the selector references another component.\n */\n component?: ComponentSelectorInfo;\n}\n\nexport interface PathSegment {\n key: string | number;\n optional: boolean;\n}\n"]}
@@ -0,0 +1,43 @@
1
+ const modifiers = [':', '^', '&'];
2
+ export function parseComponentSelector(selector) {
3
+ if (!selector.trim()) {
4
+ return [];
5
+ }
6
+ const result = [];
7
+ const parts = selector.split(/\s+/);
8
+ for (let i = 0; i < parts.length; i++) {
9
+ let part = parts[i];
10
+ if (part.includes('[')) {
11
+ while (!part.endsWith(']') && i < parts.length - 1) {
12
+ i++;
13
+ part += ' ' + parts[i];
14
+ }
15
+ }
16
+ result.push(parseSelectorSegment(part));
17
+ }
18
+ return result;
19
+ }
20
+ function parseSelectorSegment(rawSegment) {
21
+ const segment = {
22
+ qualifier: '',
23
+ modifier: null,
24
+ conditions: [],
25
+ };
26
+ // Extract :nth(N) pseudo-selector
27
+ const nthMatch = rawSegment.match(/:nth\((-?\d+)\)/);
28
+ if (nthMatch) {
29
+ segment.index = parseInt(nthMatch[1], 10);
30
+ rawSegment = rawSegment.replace(/:nth\(-?\d+\)/, '');
31
+ }
32
+ const conditionsMatch = rawSegment.match(/\[(.*?)]/g);
33
+ if (conditionsMatch) {
34
+ segment.conditions = conditionsMatch.map((item) => item.slice(1, -1).split('='));
35
+ const conditionStart = rawSegment.indexOf('[');
36
+ rawSegment = rawSegment.slice(0, conditionStart);
37
+ }
38
+ const firstChar = rawSegment[0];
39
+ segment.modifier = modifiers.includes(firstChar) ? firstChar : null;
40
+ segment.qualifier = rawSegment.replace(/^[:^&]/, '');
41
+ return segment;
42
+ }
43
+ //# sourceMappingURL=parse-component-selector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-component-selector.js","sourceRoot":"","sources":["../../../../../../libs/component-tree/src/lib/parsers/parse-component-selector.ts"],"names":[],"mappings":"AASA,MAAM,SAAS,GAA8B,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAE7D,MAAM,UAAU,sBAAsB,CAAC,QAAgB;IACrD,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;QACrB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,MAAM,GAAsB,EAAE,CAAC;IACrC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAEpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,IAAI,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACnD,CAAC,EAAE,CAAC;gBACJ,IAAI,IAAI,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1C,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,oBAAoB,CAAC,UAAkB;IAC9C,MAAM,OAAO,GAAoB;QAC/B,SAAS,EAAE,EAAE;QACb,QAAQ,EAAE,IAAI;QACd,UAAU,EAAE,EAAE;KACf,CAAC;IAEF,kCAAkC;IAClC,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACrD,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC1C,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,MAAM,eAAe,GAAG,UAAU,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAEtD,IAAI,eAAe,EAAE,CAAC;QACpB,OAAO,CAAC,UAAU,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QAEjF,MAAM,cAAc,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC/C,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC,CAA4B,CAAC;IAE3D,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;IACpE,OAAO,CAAC,SAAS,GAAG,UAAU,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IAErD,OAAO,OAAO,CAAC;AACjB,CAAC","sourcesContent":["export type SelectorSegmentModifier = null | ':' | '^' | '&';\n\nexport interface SelectorSegment {\n qualifier: string;\n modifier: SelectorSegmentModifier;\n conditions: string[][];\n index?: number;\n}\n\nconst modifiers: SelectorSegmentModifier[] = [':', '^', '&'];\n\nexport function parseComponentSelector(selector: string): SelectorSegment[] {\n if (!selector.trim()) {\n return [];\n }\n\n const result: SelectorSegment[] = [];\n const parts = selector.split(/\\s+/);\n\n for (let i = 0; i < parts.length; i++) {\n let part = parts[i];\n if (part.includes('[')) {\n while (!part.endsWith(']') && i < parts.length - 1) {\n i++;\n part += ' ' + parts[i];\n }\n }\n result.push(parseSelectorSegment(part));\n }\n\n return result;\n}\n\nfunction parseSelectorSegment(rawSegment: string): SelectorSegment {\n const segment: SelectorSegment = {\n qualifier: '',\n modifier: null,\n conditions: [],\n };\n\n // Extract :nth(N) pseudo-selector\n const nthMatch = rawSegment.match(/:nth\\((-?\\d+)\\)/);\n if (nthMatch) {\n segment.index = parseInt(nthMatch[1], 10);\n rawSegment = rawSegment.replace(/:nth\\(-?\\d+\\)/, '');\n }\n\n const conditionsMatch = rawSegment.match(/\\[(.*?)]/g);\n\n if (conditionsMatch) {\n segment.conditions = conditionsMatch.map((item) => item.slice(1, -1).split('='));\n\n const conditionStart = rawSegment.indexOf('[');\n rawSegment = rawSegment.slice(0, conditionStart);\n }\n\n const firstChar = rawSegment[0] as SelectorSegmentModifier;\n\n segment.modifier = modifiers.includes(firstChar) ? firstChar : null;\n segment.qualifier = rawSegment.replace(/^[:^&]/, '');\n\n return segment;\n}\n"]}