@lionweb/class-core 0.6.13-beta.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/LICENSE +201 -0
- package/README.md +157 -0
- package/dist/base-types.d.ts +167 -0
- package/dist/base-types.d.ts.map +1 -0
- package/dist/base-types.js +147 -0
- package/dist/base-types.js.map +1 -0
- package/dist/convenience.d.ts +49 -0
- package/dist/convenience.d.ts.map +1 -0
- package/dist/convenience.js +75 -0
- package/dist/convenience.js.map +1 -0
- package/dist/deltas/appliers.d.ts +42 -0
- package/dist/deltas/appliers.d.ts.map +1 -0
- package/dist/deltas/appliers.js +274 -0
- package/dist/deltas/appliers.js.map +1 -0
- package/dist/deltas/base.d.ts +6 -0
- package/dist/deltas/base.d.ts.map +1 -0
- package/dist/deltas/base.js +18 -0
- package/dist/deltas/base.js.map +1 -0
- package/dist/deltas/handlers.d.ts +17 -0
- package/dist/deltas/handlers.d.ts.map +1 -0
- package/dist/deltas/handlers.js +43 -0
- package/dist/deltas/handlers.js.map +1 -0
- package/dist/deltas/index.d.ts +7 -0
- package/dist/deltas/index.d.ts.map +1 -0
- package/dist/deltas/index.js +23 -0
- package/dist/deltas/index.js.map +1 -0
- package/dist/deltas/inverters.d.ts +7 -0
- package/dist/deltas/inverters.d.ts.map +1 -0
- package/dist/deltas/inverters.js +82 -0
- package/dist/deltas/inverters.js.map +1 -0
- package/dist/deltas/serialization/base.d.ts +7 -0
- package/dist/deltas/serialization/base.d.ts.map +1 -0
- package/dist/deltas/serialization/base.js +18 -0
- package/dist/deltas/serialization/base.js.map +1 -0
- package/dist/deltas/serialization/deserializer.g.d.ts +5 -0
- package/dist/deltas/serialization/deserializer.g.d.ts.map +1 -0
- package/dist/deltas/serialization/deserializer.g.js +164 -0
- package/dist/deltas/serialization/deserializer.g.js.map +1 -0
- package/dist/deltas/serialization/index.d.ts +5 -0
- package/dist/deltas/serialization/index.d.ts.map +1 -0
- package/dist/deltas/serialization/index.js +21 -0
- package/dist/deltas/serialization/index.js.map +1 -0
- package/dist/deltas/serialization/serializer-helpers.d.ts +12 -0
- package/dist/deltas/serialization/serializer-helpers.d.ts.map +1 -0
- package/dist/deltas/serialization/serializer-helpers.js +28 -0
- package/dist/deltas/serialization/serializer-helpers.js.map +1 -0
- package/dist/deltas/serialization/serializer.g.d.ts +4 -0
- package/dist/deltas/serialization/serializer.g.d.ts.map +1 -0
- package/dist/deltas/serialization/serializer.g.js +208 -0
- package/dist/deltas/serialization/serializer.g.js.map +1 -0
- package/dist/deltas/serialization/types.g.d.ts +147 -0
- package/dist/deltas/serialization/types.g.d.ts.map +1 -0
- package/dist/deltas/serialization/types.g.js +18 -0
- package/dist/deltas/serialization/types.g.js.map +1 -0
- package/dist/deltas/types.g.d.ts +149 -0
- package/dist/deltas/types.g.d.ts.map +1 -0
- package/dist/deltas/types.g.js +180 -0
- package/dist/deltas/types.g.js.map +1 -0
- package/dist/deserializer.d.ts +27 -0
- package/dist/deserializer.d.ts.map +1 -0
- package/dist/deserializer.js +168 -0
- package/dist/deserializer.js.map +1 -0
- package/dist/duplicator.d.ts +19 -0
- package/dist/duplicator.d.ts.map +1 -0
- package/dist/duplicator.js +87 -0
- package/dist/duplicator.js.map +1 -0
- package/dist/id-mapping.d.ts +19 -0
- package/dist/id-mapping.d.ts.map +1 -0
- package/dist/id-mapping.js +44 -0
- package/dist/id-mapping.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +28 -0
- package/dist/index.js.map +1 -0
- package/dist/linking.d.ts +20 -0
- package/dist/linking.d.ts.map +1 -0
- package/dist/linking.js +18 -0
- package/dist/linking.js.map +1 -0
- package/dist/lionCore_builtins.g.d.ts +35 -0
- package/dist/lionCore_builtins.g.d.ts.map +1 -0
- package/dist/lionCore_builtins.g.js +96 -0
- package/dist/lionCore_builtins.g.js.map +1 -0
- package/dist/serializer.d.ts +17 -0
- package/dist/serializer.d.ts.map +1 -0
- package/dist/serializer.js +70 -0
- package/dist/serializer.js.map +1 -0
- package/dist/textualizer.d.ts +7 -0
- package/dist/textualizer.d.ts.map +1 -0
- package/dist/textualizer.js +82 -0
- package/dist/textualizer.js.map +1 -0
- package/dist/value-managers/annotations.d.ts +33 -0
- package/dist/value-managers/annotations.d.ts.map +1 -0
- package/dist/value-managers/annotations.js +192 -0
- package/dist/value-managers/annotations.js.map +1 -0
- package/dist/value-managers/base.d.ts +53 -0
- package/dist/value-managers/base.d.ts.map +1 -0
- package/dist/value-managers/base.js +102 -0
- package/dist/value-managers/base.js.map +1 -0
- package/dist/value-managers/containments.d.ts +58 -0
- package/dist/value-managers/containments.d.ts.map +1 -0
- package/dist/value-managers/containments.js +408 -0
- package/dist/value-managers/containments.js.map +1 -0
- package/dist/value-managers/index.d.ts +6 -0
- package/dist/value-managers/index.d.ts.map +1 -0
- package/dist/value-managers/index.js +22 -0
- package/dist/value-managers/index.js.map +1 -0
- package/dist/value-managers/properties.d.ts +24 -0
- package/dist/value-managers/properties.d.ts.map +1 -0
- package/dist/value-managers/properties.js +191 -0
- package/dist/value-managers/properties.js.map +1 -0
- package/dist/value-managers/references.d.ts +58 -0
- package/dist/value-managers/references.d.ts.map +1 -0
- package/dist/value-managers/references.js +346 -0
- package/dist/value-managers/references.js.map +1 -0
- package/package.json +35 -0
- package/src/base-types.ts +353 -0
- package/src/convenience.ts +101 -0
- package/src/deltas/appliers.ts +317 -0
- package/src/deltas/base.ts +23 -0
- package/src/deltas/handlers.ts +64 -0
- package/src/deltas/index.ts +23 -0
- package/src/deltas/inverters.ts +111 -0
- package/src/deltas/serialization/base.ts +26 -0
- package/src/deltas/serialization/deserializer.g.ts +193 -0
- package/src/deltas/serialization/index.ts +22 -0
- package/src/deltas/serialization/serializer-helpers.ts +36 -0
- package/src/deltas/serialization/serializer.g.ts +272 -0
- package/src/deltas/serialization/types.g.ts +209 -0
- package/src/deltas/types.g.ts +231 -0
- package/src/deserializer.ts +234 -0
- package/src/duplicator.ts +111 -0
- package/src/id-mapping.ts +58 -0
- package/src/index.ts +29 -0
- package/src/linking.ts +39 -0
- package/src/lionCore_builtins.g.ts +141 -0
- package/src/serializer.ts +86 -0
- package/src/textualizer.ts +104 -0
- package/src/value-managers/annotations.ts +139 -0
- package/src/value-managers/base.ts +123 -0
- package/src/value-managers/containments.ts +323 -0
- package/src/value-managers/index.ts +22 -0
- package/src/value-managers/properties.ts +127 -0
- package/src/value-managers/references.ts +268 -0
|
@@ -0,0 +1,317 @@
|
|
|
1
|
+
// Copyright 2025 TRUMPF Laser SE and other contributors
|
|
2
|
+
//
|
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License")
|
|
4
|
+
// you may not use this file except in compliance with the License.
|
|
5
|
+
// You may obtain a copy of the License at
|
|
6
|
+
//
|
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
//
|
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
// See the License for the specific language governing permissions and
|
|
13
|
+
// limitations under the License.
|
|
14
|
+
//
|
|
15
|
+
// SPDX-FileCopyrightText: 2025 TRUMPF Laser SE and other contributors
|
|
16
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
17
|
+
|
|
18
|
+
import {
|
|
19
|
+
AnnotationAddedDelta,
|
|
20
|
+
AnnotationDeletedDelta,
|
|
21
|
+
AnnotationMovedFromOtherParentDelta,
|
|
22
|
+
AnnotationMovedInSameParentDelta,
|
|
23
|
+
AnnotationReplacedDelta,
|
|
24
|
+
ChildAddedDelta,
|
|
25
|
+
ChildDeletedDelta,
|
|
26
|
+
ChildMovedDelta,
|
|
27
|
+
ChildMovedInSameContainmentDelta,
|
|
28
|
+
ChildReplacedDelta,
|
|
29
|
+
NoOpDelta,
|
|
30
|
+
PropertyAddedDelta,
|
|
31
|
+
PropertyChangedDelta,
|
|
32
|
+
PropertyDeletedDelta,
|
|
33
|
+
ReferenceAddedDelta,
|
|
34
|
+
ReferenceDeletedDelta,
|
|
35
|
+
ReferenceMovedDelta,
|
|
36
|
+
ReferenceMovedInSameReferenceDelta,
|
|
37
|
+
ReferenceReplacedDelta
|
|
38
|
+
} from "./types.g.js";
|
|
39
|
+
import {
|
|
40
|
+
MultiContainmentValueManager,
|
|
41
|
+
MultiReferenceValueManager,
|
|
42
|
+
SingleContainmentValueManager,
|
|
43
|
+
SingleReferenceValueManager
|
|
44
|
+
} from "../value-managers/index.js";
|
|
45
|
+
import {INodeBase} from "../base-types.js";
|
|
46
|
+
import {IdMapping} from "../id-mapping.js";
|
|
47
|
+
import {SingleRef, unresolved} from "@lionweb/core";
|
|
48
|
+
import {IDelta} from "./base.js";
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* @return a function that applies a given {@link Delta}, given an optional {@link IdMapping ID mapping}.
|
|
53
|
+
* If an {@link IdMapping} is provided, the {@link INodeBase nodes} relevant for the delta are looked up from that;
|
|
54
|
+
* otherwise, the delta is applied directly to (object-)referenced nodes.
|
|
55
|
+
*
|
|
56
|
+
* This is an internal function, solely meant to DRY the delta application with and without lookup in
|
|
57
|
+
*/
|
|
58
|
+
const deltaApplier = (idMapping?: IdMapping) =>
|
|
59
|
+
(delta: IDelta): void => {
|
|
60
|
+
|
|
61
|
+
const lookupNodeFrom = (node: INodeBase) => {
|
|
62
|
+
if (idMapping === undefined) {
|
|
63
|
+
return node
|
|
64
|
+
}
|
|
65
|
+
const lookup = idMapping.fromId(node.id);
|
|
66
|
+
if (lookup === undefined) {
|
|
67
|
+
throw new Error(`look up of node with id=${node.id} failed: node doesn't exist in ID mapping`);
|
|
68
|
+
}
|
|
69
|
+
if (node.classifier !== lookup.classifier) {
|
|
70
|
+
throw new Error(`look up of node with id=${node.id} failed: looked-up node has a different classifier than the original one`);
|
|
71
|
+
}
|
|
72
|
+
return lookup;
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
const lookupNodeRefFrom = <T extends INodeBase>(nodeRef: SingleRef<T>): SingleRef<T> => {
|
|
76
|
+
if (idMapping === undefined) {
|
|
77
|
+
return nodeRef
|
|
78
|
+
}
|
|
79
|
+
return nodeRef === unresolved
|
|
80
|
+
? unresolved
|
|
81
|
+
: lookupNodeFrom(nodeRef) as SingleRef<T>
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
if (delta instanceof NoOpDelta) {
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
if (delta instanceof PropertyAddedDelta) {
|
|
89
|
+
lookupNodeFrom(delta.container).getPropertyValueManager(delta.property).setDirectly(delta.value);
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
if (delta instanceof PropertyChangedDelta) {
|
|
93
|
+
lookupNodeFrom(delta.container).getPropertyValueManager(delta.property).setDirectly(delta.newValue);
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
if (delta instanceof PropertyDeletedDelta) {
|
|
97
|
+
lookupNodeFrom(delta.container).getPropertyValueManager(delta.property).setDirectly(undefined);
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
if (delta instanceof ChildAddedDelta) {
|
|
102
|
+
const valueManager = lookupNodeFrom(delta.parent).getContainmentValueManager(delta.containment);
|
|
103
|
+
const newChild = lookupNodeFrom(delta.newChild);
|
|
104
|
+
if (delta.containment.multiple) {
|
|
105
|
+
(valueManager as MultiContainmentValueManager<INodeBase>).insertAtIndexDirectly(newChild, delta.index);
|
|
106
|
+
} else {
|
|
107
|
+
(valueManager as SingleContainmentValueManager<INodeBase>).setDirectly(newChild);
|
|
108
|
+
}
|
|
109
|
+
newChild.attachTo(delta.parent, delta.containment);
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
if (delta instanceof ChildReplacedDelta) {
|
|
113
|
+
const valueManager = lookupNodeFrom(delta.parent).getContainmentValueManager(delta.containment);
|
|
114
|
+
const replacedChild = lookupNodeFrom(delta.replacedChild);
|
|
115
|
+
const newChild = lookupNodeFrom(delta.newChild);
|
|
116
|
+
if (delta.containment.multiple) {
|
|
117
|
+
const multiValueManager = valueManager as MultiContainmentValueManager<INodeBase>;
|
|
118
|
+
multiValueManager.removeDirectly(replacedChild); // should be at index delta.index
|
|
119
|
+
multiValueManager.insertAtIndexDirectly(newChild, delta.index);
|
|
120
|
+
} else {
|
|
121
|
+
(valueManager as SingleContainmentValueManager<INodeBase>).setDirectly(newChild);
|
|
122
|
+
}
|
|
123
|
+
replacedChild.detach();
|
|
124
|
+
newChild.attachTo(delta.parent, delta.containment);
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
if (delta instanceof ChildMovedDelta) {
|
|
128
|
+
const oldValueManager = delta.oldParent.getContainmentValueManager(delta.oldContainment);
|
|
129
|
+
const child = lookupNodeFrom(delta.child);
|
|
130
|
+
if (delta.oldContainment.multiple) {
|
|
131
|
+
(oldValueManager as MultiContainmentValueManager<INodeBase>).removeDirectly(child); // should be at index delta.oldIndex
|
|
132
|
+
} else {
|
|
133
|
+
(oldValueManager as SingleContainmentValueManager<INodeBase>).setDirectly(undefined);
|
|
134
|
+
}
|
|
135
|
+
const newValueManager = delta.newParent.getContainmentValueManager(delta.newContainment);
|
|
136
|
+
if (delta.newContainment.multiple) {
|
|
137
|
+
(newValueManager as MultiContainmentValueManager<INodeBase>).insertAtIndexDirectly(child, delta.newIndex);
|
|
138
|
+
} else {
|
|
139
|
+
(newValueManager as SingleContainmentValueManager<INodeBase>).setDirectly(child);
|
|
140
|
+
}
|
|
141
|
+
child.detach();
|
|
142
|
+
child.attachTo(delta.newParent, delta.newContainment);
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
if (delta instanceof ChildMovedInSameContainmentDelta) {
|
|
146
|
+
const valueManager = lookupNodeFrom(delta.parent).getContainmentValueManager(delta.containment) as MultiContainmentValueManager<INodeBase>;
|
|
147
|
+
valueManager.moveDirectly(delta.oldIndex, delta.newIndex);
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
if (delta instanceof ChildDeletedDelta) {
|
|
151
|
+
const valueManager = lookupNodeFrom(delta.parent).getContainmentValueManager(delta.containment);
|
|
152
|
+
if (delta.containment.multiple) {
|
|
153
|
+
const multiValueManager = valueManager as MultiContainmentValueManager<INodeBase>;
|
|
154
|
+
multiValueManager.removeDirectly(lookupNodeFrom(delta.deletedChild));
|
|
155
|
+
} else {
|
|
156
|
+
(valueManager as SingleContainmentValueManager<INodeBase>).setDirectly(undefined);
|
|
157
|
+
}
|
|
158
|
+
delta.deletedChild.detach();
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
if (delta instanceof ReferenceAddedDelta) {
|
|
163
|
+
const valueManager = lookupNodeFrom(delta.container).getReferenceValueManager(delta.reference);
|
|
164
|
+
const newTarget = lookupNodeRefFrom(delta.newTarget);
|
|
165
|
+
if (delta.reference.multiple) {
|
|
166
|
+
(valueManager as MultiReferenceValueManager<INodeBase>).insertAtIndexDirectly(newTarget, delta.index);
|
|
167
|
+
} else {
|
|
168
|
+
(valueManager as SingleReferenceValueManager<INodeBase>).setDirectly(newTarget);
|
|
169
|
+
}
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
if (delta instanceof ReferenceReplacedDelta) {
|
|
173
|
+
const valueManager = lookupNodeFrom(delta.container).getReferenceValueManager(delta.reference);
|
|
174
|
+
const replacedTarget = lookupNodeRefFrom(delta.replacedTarget);
|
|
175
|
+
const newTarget = lookupNodeRefFrom(delta.newTarget);
|
|
176
|
+
if (delta.reference.multiple) {
|
|
177
|
+
const multiValueManager = valueManager as MultiReferenceValueManager<INodeBase>;
|
|
178
|
+
multiValueManager.removeDirectly(replacedTarget); // should be at index delta.index
|
|
179
|
+
multiValueManager.insertAtIndexDirectly(newTarget, delta.index);
|
|
180
|
+
} else {
|
|
181
|
+
(valueManager as SingleReferenceValueManager<INodeBase>).setDirectly(newTarget);
|
|
182
|
+
}
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
if (delta instanceof ReferenceMovedDelta) {
|
|
186
|
+
const oldValueManager = lookupNodeFrom(delta.oldContainer).getReferenceValueManager(delta.oldReference);
|
|
187
|
+
const target = lookupNodeRefFrom(delta.target);
|
|
188
|
+
if (delta.oldReference.multiple) {
|
|
189
|
+
(oldValueManager as MultiReferenceValueManager<INodeBase>).removeDirectly(target); // should be at index delta.oldIndex
|
|
190
|
+
} else {
|
|
191
|
+
(oldValueManager as SingleReferenceValueManager<INodeBase>).setDirectly(undefined);
|
|
192
|
+
}
|
|
193
|
+
const newValueManager = lookupNodeFrom(delta.newContainer).getReferenceValueManager(delta.newReference);
|
|
194
|
+
if (delta.newReference.multiple) {
|
|
195
|
+
(newValueManager as MultiReferenceValueManager<INodeBase>).insertAtIndexDirectly(target, delta.newIndex);
|
|
196
|
+
} else {
|
|
197
|
+
(newValueManager as SingleReferenceValueManager<INodeBase>).setDirectly(target);
|
|
198
|
+
}
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
if (delta instanceof ReferenceMovedInSameReferenceDelta) {
|
|
202
|
+
const valueManager = lookupNodeFrom(delta.container).getReferenceValueManager(delta.reference) as MultiReferenceValueManager<INodeBase>;
|
|
203
|
+
valueManager.moveDirectly(delta.oldIndex, delta.newIndex);
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
if (delta instanceof ReferenceDeletedDelta) {
|
|
207
|
+
const valueManager = lookupNodeFrom(delta.container).getReferenceValueManager(delta.reference);
|
|
208
|
+
const deletedTarget = lookupNodeRefFrom(delta.deletedTarget);
|
|
209
|
+
if (delta.reference.multiple) {
|
|
210
|
+
const multiValueManager = valueManager as MultiReferenceValueManager<INodeBase>;
|
|
211
|
+
multiValueManager.removeDirectly(deletedTarget);
|
|
212
|
+
} else {
|
|
213
|
+
(valueManager as SingleReferenceValueManager<INodeBase>).setDirectly(undefined);
|
|
214
|
+
}
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
if (delta instanceof AnnotationAddedDelta) {
|
|
219
|
+
lookupNodeFrom(delta.parent).annotationsValueManager.insertAtIndexDirectly(delta.newAnnotation, delta.index);
|
|
220
|
+
delta.newAnnotation.attachTo(delta.parent, null);
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
if (delta instanceof AnnotationDeletedDelta) {
|
|
224
|
+
lookupNodeFrom(delta.parent).annotationsValueManager.removeDirectly(delta.deletedAnnotation); // should be at index delta.index
|
|
225
|
+
delta.deletedAnnotation.detach();
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
if (delta instanceof AnnotationReplacedDelta) {
|
|
229
|
+
const valueManager = lookupNodeFrom(delta.parent).annotationsValueManager;
|
|
230
|
+
valueManager.removeDirectly(delta.replacedAnnotation); // should be at index delta.index
|
|
231
|
+
delta.replacedAnnotation.detach();
|
|
232
|
+
valueManager.insertAtIndexDirectly(delta.newAnnotation, delta.index);
|
|
233
|
+
delta.newAnnotation.attachTo(delta.parent, null);
|
|
234
|
+
return;
|
|
235
|
+
}
|
|
236
|
+
if (delta instanceof AnnotationMovedFromOtherParentDelta) {
|
|
237
|
+
lookupNodeFrom(delta.oldParent).annotationsValueManager.removeDirectly(delta.movedAnnotation); // should be at index delta.index
|
|
238
|
+
delta.movedAnnotation.detach();
|
|
239
|
+
lookupNodeFrom(delta.newParent).annotationsValueManager.insertAtIndexDirectly(delta.movedAnnotation, delta.newIndex);
|
|
240
|
+
delta.movedAnnotation.attachTo(delta.newParent, null);
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
if (delta instanceof AnnotationMovedInSameParentDelta) {
|
|
244
|
+
const valueManager = lookupNodeFrom(delta.parent).annotationsValueManager;
|
|
245
|
+
valueManager.moveDirectly(delta.oldIndex, delta.newIndex);
|
|
246
|
+
return;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
throw new Error(`application of delta of class ${delta.constructor.name} not implemented`);
|
|
250
|
+
|
|
251
|
+
};
|
|
252
|
+
|
|
253
|
+
|
|
254
|
+
/**
|
|
255
|
+
* Applies the given {@link Delta deltas} to the {@link INodeBase nodes} (object-)referenced in the deltas.
|
|
256
|
+
*/
|
|
257
|
+
export const applyDeltas = (deltas: IDelta[]): void => {
|
|
258
|
+
deltas.forEach(applyDelta);
|
|
259
|
+
};
|
|
260
|
+
|
|
261
|
+
|
|
262
|
+
/**
|
|
263
|
+
* Applies the given {@link Delta delta} to the {@link INodeBase nodes} (object-)referenced in the delta.
|
|
264
|
+
*/
|
|
265
|
+
export const applyDelta = deltaApplier()
|
|
266
|
+
|
|
267
|
+
|
|
268
|
+
/**
|
|
269
|
+
* Applies the given {@link Delta deltas} to {@link INodeBase nodes} given as the values of a {@link IdMapping ID mapping id → node}.
|
|
270
|
+
* Note that the deltas are *not* applied to the original nodes (object-)referenced by the deltas, but to the nodes present in the ID mapping.
|
|
271
|
+
* These can be distinct from the original nodes, e.g. after a roundtrip to an external model processor.
|
|
272
|
+
*
|
|
273
|
+
* @usage should look as follows.
|
|
274
|
+
*
|
|
275
|
+
* ```typescript
|
|
276
|
+
* const {roots, idMapping} = deserializeAsLDMModelWithMapping(serializationChunk, handleDelta);
|
|
277
|
+
* applyDeltasWithLookup(idMapping, deltas);
|
|
278
|
+
* ```
|
|
279
|
+
*/
|
|
280
|
+
export const applyDeltasWithLookup = (idMapping: IdMapping, deltas: IDelta[]): void => {
|
|
281
|
+
deltas.forEach((delta) => applyDeltaWithLookup(idMapping, delta));
|
|
282
|
+
};
|
|
283
|
+
|
|
284
|
+
|
|
285
|
+
/**
|
|
286
|
+
* Applies the given {@link Delta delta} to {@link nodes INodeBase} given as the values of a {@link IdMapping ID mapping id → node}.
|
|
287
|
+
* Note that the delta is *not* applied to the original nodes (object-)referenced by the deltas, but to the nodes present in the ID mapping.
|
|
288
|
+
* These can be distinct from the original nodes, e.g. after a roundtrip to an external model processor. *
|
|
289
|
+
* @usage should look as follows.
|
|
290
|
+
*
|
|
291
|
+
* ```typescript
|
|
292
|
+
* const {roots, idMapping} = deserializeAsLDMModelWithMapping(serializationChunk, handleDelta);
|
|
293
|
+
* applyDeltaWithLookup(idMapping, delta);
|
|
294
|
+
* ```
|
|
295
|
+
*/
|
|
296
|
+
export const applyDeltaWithLookup = (idMapping: IdMapping, delta: IDelta): void =>
|
|
297
|
+
deltaApplier(idMapping)(delta)
|
|
298
|
+
|
|
299
|
+
|
|
300
|
+
/**
|
|
301
|
+
* Updates the given {@link IdMapping ID mapping} with the given {@link IDelta delta}.
|
|
302
|
+
* This is important if the delta adds a newly-created node to the model.
|
|
303
|
+
* (This function is here to avoid that {@link IdMapping} needs to know about {@link IDelta delta types}.)
|
|
304
|
+
*/
|
|
305
|
+
export const updateIdMappingWithDelta = (idMapping: IdMapping, delta: IDelta) => {
|
|
306
|
+
if (delta instanceof ChildAddedDelta) {
|
|
307
|
+
idMapping.updateWith(delta.newChild);
|
|
308
|
+
}
|
|
309
|
+
if (delta instanceof ChildReplacedDelta) {
|
|
310
|
+
idMapping.updateWith(delta.newChild);
|
|
311
|
+
}
|
|
312
|
+
if (delta instanceof AnnotationAddedDelta) {
|
|
313
|
+
idMapping.updateWith(delta.newAnnotation);
|
|
314
|
+
}
|
|
315
|
+
// (nothing to be done: no need –yet?- to take deleted child nodes out of the ID mapping)
|
|
316
|
+
};
|
|
317
|
+
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
// Copyright 2025 TRUMPF Laser SE and other contributors
|
|
2
|
+
//
|
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License")
|
|
4
|
+
// you may not use this file except in compliance with the License.
|
|
5
|
+
// You may obtain a copy of the License at
|
|
6
|
+
//
|
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
//
|
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
// See the License for the specific language governing permissions and
|
|
13
|
+
// limitations under the License.
|
|
14
|
+
//
|
|
15
|
+
// SPDX-FileCopyrightText: 2025 TRUMPF Laser SE and other contributors
|
|
16
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Super interface for all delta types.
|
|
20
|
+
*/
|
|
21
|
+
export interface IDelta {
|
|
22
|
+
}
|
|
23
|
+
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
// Copyright 2025 TRUMPF Laser SE and other contributors
|
|
2
|
+
//
|
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License")
|
|
4
|
+
// you may not use this file except in compliance with the License.
|
|
5
|
+
// You may obtain a copy of the License at
|
|
6
|
+
//
|
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
//
|
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
// See the License for the specific language governing permissions and
|
|
13
|
+
// limitations under the License.
|
|
14
|
+
//
|
|
15
|
+
// SPDX-FileCopyrightText: 2025 TRUMPF Laser SE and other contributors
|
|
16
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
17
|
+
|
|
18
|
+
import {IDelta} from "./base.js";
|
|
19
|
+
import {serializeDelta} from "./serialization/index.js";
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* A type for functions that handle deltas.
|
|
24
|
+
*/
|
|
25
|
+
export type DeltaHandler = (delta: IDelta) => void;
|
|
26
|
+
|
|
27
|
+
export const collectingDeltaHandler = (printSerializations = false): [DeltaHandler, IDelta[]] => {
|
|
28
|
+
const deltas: IDelta[] = [];
|
|
29
|
+
const handleDelta: DeltaHandler = (delta) => {
|
|
30
|
+
deltas.push(delta);
|
|
31
|
+
if (printSerializations) {
|
|
32
|
+
console.log(JSON.stringify(serializeDelta(delta), null, 4));
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
return [handleDelta, deltas];
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* An interface for {@link DeltaHandler delta handlers} that can be switched on and off — “latching”.
|
|
41
|
+
*/
|
|
42
|
+
export interface LatchingDeltaHandler extends DeltaHandler {
|
|
43
|
+
latch(emitDeltas: boolean): void;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* @return a latching version of the given {@link DeltaHandler delta handler}.
|
|
48
|
+
*/
|
|
49
|
+
export const latching = (handleDelta: DeltaHandler): LatchingDeltaHandler => {
|
|
50
|
+
let emitDeltas = false;
|
|
51
|
+
return Object.assign(
|
|
52
|
+
(delta: IDelta) => {
|
|
53
|
+
if (emitDeltas) {
|
|
54
|
+
handleDelta(delta);
|
|
55
|
+
}
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
latch(emitDeltas_: boolean) {
|
|
59
|
+
emitDeltas = emitDeltas_;
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
);
|
|
63
|
+
};
|
|
64
|
+
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
// Copyright 2025 TRUMPF Laser SE and other contributors
|
|
2
|
+
//
|
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License")
|
|
4
|
+
// you may not use this file except in compliance with the License.
|
|
5
|
+
// You may obtain a copy of the License at
|
|
6
|
+
//
|
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
//
|
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
// See the License for the specific language governing permissions and
|
|
13
|
+
// limitations under the License.
|
|
14
|
+
//
|
|
15
|
+
// SPDX-FileCopyrightText: 2025 TRUMPF Laser SE and other contributors
|
|
16
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
17
|
+
|
|
18
|
+
export * from "./appliers.js";
|
|
19
|
+
export * from "./base.js";
|
|
20
|
+
export * from "./handlers.js";
|
|
21
|
+
export * from "./inverters.js";
|
|
22
|
+
export * from "./types.g.js";
|
|
23
|
+
export * from "./serialization/index.js";
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
// Copyright 2025 TRUMPF Laser SE and other contributors
|
|
2
|
+
//
|
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License")
|
|
4
|
+
// you may not use this file except in compliance with the License.
|
|
5
|
+
// You may obtain a copy of the License at
|
|
6
|
+
//
|
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
//
|
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
// See the License for the specific language governing permissions and
|
|
13
|
+
// limitations under the License.
|
|
14
|
+
//
|
|
15
|
+
// SPDX-FileCopyrightText: 2025 TRUMPF Laser SE and other contributors
|
|
16
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
17
|
+
|
|
18
|
+
import {
|
|
19
|
+
AnnotationAddedDelta,
|
|
20
|
+
AnnotationDeletedDelta,
|
|
21
|
+
AnnotationMovedFromOtherParentDelta,
|
|
22
|
+
AnnotationMovedInSameParentDelta,
|
|
23
|
+
AnnotationReplacedDelta,
|
|
24
|
+
ChildAddedDelta,
|
|
25
|
+
ChildDeletedDelta,
|
|
26
|
+
ChildMovedDelta,
|
|
27
|
+
ChildMovedInSameContainmentDelta,
|
|
28
|
+
ChildReplacedDelta,
|
|
29
|
+
NoOpDelta,
|
|
30
|
+
PropertyAddedDelta,
|
|
31
|
+
PropertyChangedDelta,
|
|
32
|
+
PropertyDeletedDelta,
|
|
33
|
+
ReferenceAddedDelta,
|
|
34
|
+
ReferenceDeletedDelta,
|
|
35
|
+
ReferenceMovedDelta,
|
|
36
|
+
ReferenceMovedInSameReferenceDelta,
|
|
37
|
+
ReferenceReplacedDelta
|
|
38
|
+
} from "./types.g.js";
|
|
39
|
+
import {IDelta} from "./base.js";
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* @return the inverted version of the given {@link IDelta delta}
|
|
44
|
+
* in the sense that it undoes that delta after it has been applied.
|
|
45
|
+
*/
|
|
46
|
+
export const invertDelta = (delta: IDelta): IDelta => {
|
|
47
|
+
if (delta instanceof NoOpDelta) {
|
|
48
|
+
return delta;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
if (delta instanceof PropertyAddedDelta) {
|
|
52
|
+
return new PropertyDeletedDelta(delta.container, delta.property, delta.value);
|
|
53
|
+
}
|
|
54
|
+
if (delta instanceof PropertyChangedDelta) {
|
|
55
|
+
return new PropertyChangedDelta(delta.container, delta.property, delta.newValue, delta.oldValue);
|
|
56
|
+
}
|
|
57
|
+
if (delta instanceof PropertyDeletedDelta) {
|
|
58
|
+
return new PropertyAddedDelta(delta.container, delta.property, delta.oldValue);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
if (delta instanceof ChildAddedDelta) {
|
|
62
|
+
return new ChildDeletedDelta(delta.parent, delta.containment, delta.index, delta.newChild);
|
|
63
|
+
}
|
|
64
|
+
if (delta instanceof ChildReplacedDelta) {
|
|
65
|
+
return new ChildReplacedDelta(delta.parent, delta.containment, delta.index, delta.newChild, delta.replacedChild);
|
|
66
|
+
}
|
|
67
|
+
if (delta instanceof ChildMovedDelta) {
|
|
68
|
+
return new ChildMovedDelta(delta.newParent, delta.newContainment, delta.newIndex, delta.oldParent, delta.oldContainment, delta.oldIndex, delta.child);
|
|
69
|
+
}
|
|
70
|
+
if (delta instanceof ChildMovedInSameContainmentDelta) {
|
|
71
|
+
return new ChildMovedInSameContainmentDelta(delta.parent, delta.containment, delta.newIndex, delta.oldIndex, delta.child);
|
|
72
|
+
}
|
|
73
|
+
if (delta instanceof ChildDeletedDelta) {
|
|
74
|
+
return new ChildAddedDelta(delta.parent, delta.containment, delta.index, delta.deletedChild);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
if (delta instanceof ReferenceAddedDelta) {
|
|
78
|
+
return new ReferenceDeletedDelta(delta.container, delta.reference, delta.index, delta.newTarget);
|
|
79
|
+
}
|
|
80
|
+
if (delta instanceof ReferenceReplacedDelta) {
|
|
81
|
+
return new ReferenceReplacedDelta(delta.container, delta.reference, delta.index, delta.newTarget, delta.replacedTarget);
|
|
82
|
+
}
|
|
83
|
+
if (delta instanceof ReferenceMovedDelta) {
|
|
84
|
+
return new ReferenceMovedDelta(delta.newContainer, delta.newReference, delta.newIndex, delta.oldContainer, delta.oldReference, delta.oldIndex, delta.target);
|
|
85
|
+
}
|
|
86
|
+
if (delta instanceof ReferenceMovedInSameReferenceDelta) {
|
|
87
|
+
return new ReferenceMovedInSameReferenceDelta(delta.container, delta.reference, delta.newIndex, delta.oldIndex, delta.target);
|
|
88
|
+
}
|
|
89
|
+
if (delta instanceof ReferenceDeletedDelta) {
|
|
90
|
+
return new ReferenceAddedDelta(delta.container, delta.reference, delta.index, delta.deletedTarget);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
if (delta instanceof AnnotationAddedDelta) {
|
|
94
|
+
return new AnnotationDeletedDelta(delta.parent, delta.index, delta.newAnnotation);
|
|
95
|
+
}
|
|
96
|
+
if (delta instanceof AnnotationDeletedDelta) {
|
|
97
|
+
return new AnnotationAddedDelta(delta.parent, delta.index, delta.deletedAnnotation);
|
|
98
|
+
}
|
|
99
|
+
if (delta instanceof AnnotationReplacedDelta) {
|
|
100
|
+
return new AnnotationReplacedDelta(delta.parent, delta.index, delta.newAnnotation, delta.replacedAnnotation);
|
|
101
|
+
}
|
|
102
|
+
if (delta instanceof AnnotationMovedFromOtherParentDelta) {
|
|
103
|
+
return new AnnotationMovedFromOtherParentDelta(delta.newParent, delta.newIndex, delta.oldParent, delta.oldIndex, delta.movedAnnotation);
|
|
104
|
+
}
|
|
105
|
+
if (delta instanceof AnnotationMovedInSameParentDelta) {
|
|
106
|
+
return new AnnotationMovedInSameParentDelta(delta.parent, delta.newIndex, delta.oldIndex, delta.movedAnnotation);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
throw new Error(`inversion of delta of class ${delta.constructor.name} not implemented`);
|
|
110
|
+
}
|
|
111
|
+
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
// Copyright 2025 TRUMPF Laser SE and other contributors
|
|
2
|
+
//
|
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License")
|
|
4
|
+
// you may not use this file except in compliance with the License.
|
|
5
|
+
// You may obtain a copy of the License at
|
|
6
|
+
//
|
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
//
|
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
// See the License for the specific language governing permissions and
|
|
13
|
+
// limitations under the License.
|
|
14
|
+
//
|
|
15
|
+
// SPDX-FileCopyrightText: 2025 TRUMPF Laser SE and other contributors
|
|
16
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
17
|
+
|
|
18
|
+
import {SerializedDelta} from "./types.g.js";
|
|
19
|
+
import {IDelta} from "../base.js";
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* A type for functions that deserialize {@link SerializedDelta serialized deltas} into “proper” {@link IDelta deltas}.
|
|
24
|
+
*/
|
|
25
|
+
export type DeltaDeserializer = (delta: SerializedDelta) => IDelta;
|
|
26
|
+
|