@lionweb/class-core 0.7.0-beta.12 → 0.7.0-beta.13
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/CHANGELOG.md +4 -1
- package/README.md +6 -6
- package/dist/LionCore_builtins.g.d.ts +2 -2
- package/dist/LionCore_builtins.g.d.ts.map +1 -1
- package/dist/LionCore_builtins.g.js +1 -1
- package/dist/LionCore_builtins.g.js.map +1 -1
- package/dist/base-types.d.ts +7 -7
- package/dist/base-types.d.ts.map +1 -1
- package/dist/base-types.js +3 -3
- package/dist/base-types.js.map +1 -1
- package/dist/convenience.d.ts +7 -7
- package/dist/convenience.d.ts.map +1 -1
- package/dist/convenience.js +7 -7
- package/dist/convenience.js.map +1 -1
- package/dist/deltas/appliers.d.ts +2 -2
- package/dist/deltas/appliers.d.ts.map +1 -1
- package/dist/deltas/appliers.js +5 -2
- package/dist/deltas/appliers.js.map +1 -1
- package/dist/deltas/compositor.d.ts +51 -0
- package/dist/deltas/compositor.d.ts.map +1 -0
- package/dist/deltas/compositor.js +95 -0
- package/dist/deltas/compositor.js.map +1 -0
- package/dist/deltas/index.d.ts +2 -1
- package/dist/deltas/index.d.ts.map +1 -1
- package/dist/deltas/index.js +2 -1
- package/dist/deltas/index.js.map +1 -1
- package/dist/deltas/receivers.d.ts +39 -0
- package/dist/deltas/receivers.d.ts.map +1 -0
- package/dist/deltas/receivers.js +59 -0
- package/dist/deltas/receivers.js.map +1 -0
- package/dist/deserializer.d.ts +5 -5
- package/dist/deserializer.d.ts.map +1 -1
- package/dist/deserializer.js +8 -8
- package/dist/deserializer.js.map +1 -1
- package/dist/factory.d.ts +2 -2
- package/dist/factory.d.ts.map +1 -1
- package/dist/factory.js +2 -2
- package/dist/factory.js.map +1 -1
- package/dist/value-managers/base.d.ts +2 -2
- package/dist/value-managers/base.js +4 -4
- package/dist/value-managers/base.js.map +1 -1
- package/package.json +4 -4
- package/src/LionCore_builtins.g.ts +2 -2
- package/src/base-types.ts +6 -6
- package/src/convenience.ts +10 -10
- package/src/deltas/appliers.ts +5 -2
- package/src/deltas/compositor.ts +107 -0
- package/src/deltas/index.ts +3 -1
- package/src/deltas/receivers.ts +91 -0
- package/src/deserializer.ts +9 -9
- package/src/factory.ts +3 -3
- package/src/value-managers/base.ts +4 -4
- package/dist/deltas/handlers.d.ts +0 -17
- package/dist/deltas/handlers.d.ts.map +0 -1
- package/dist/deltas/handlers.js +0 -43
- package/dist/deltas/handlers.js.map +0 -1
- package/src/deltas/handlers.ts +0 -64
package/dist/deltas/index.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
export * from "./appliers.js";
|
|
2
2
|
export * from "./base.js";
|
|
3
|
-
export * from "./
|
|
3
|
+
export * from "./compositor.js";
|
|
4
4
|
export * from "./inverters.js";
|
|
5
|
+
export * from "./receivers.js";
|
|
5
6
|
export * from "./types.g.js";
|
|
6
7
|
export * from "./serialization/index.js";
|
|
7
8
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/deltas/index.ts"],"names":[],"mappings":"AAiBA,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAC1B,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/deltas/index.ts"],"names":[],"mappings":"AAiBA,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,0BAA0B,CAAC"}
|
package/dist/deltas/index.js
CHANGED
|
@@ -16,8 +16,9 @@
|
|
|
16
16
|
// SPDX-License-Identifier: Apache-2.0
|
|
17
17
|
export * from "./appliers.js";
|
|
18
18
|
export * from "./base.js";
|
|
19
|
-
export * from "./
|
|
19
|
+
export * from "./compositor.js";
|
|
20
20
|
export * from "./inverters.js";
|
|
21
|
+
export * from "./receivers.js";
|
|
21
22
|
export * from "./types.g.js";
|
|
22
23
|
export * from "./serialization/index.js";
|
|
23
24
|
//# sourceMappingURL=index.js.map
|
package/dist/deltas/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/deltas/index.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,EAAE;AACF,iEAAiE;AACjE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,iDAAiD;AACjD,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;AACjC,EAAE;AACF,sEAAsE;AACtE,sCAAsC;AAEtC,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAC1B,cAAc,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/deltas/index.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,EAAE;AACF,iEAAiE;AACjE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,iDAAiD;AACjD,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;AACjC,EAAE;AACF,sEAAsE;AACtE,sCAAsC;AAEtC,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,0BAA0B,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { IDelta } from "./base.js";
|
|
2
|
+
/**
|
|
3
|
+
* A type for functions that receive deltas.
|
|
4
|
+
*/
|
|
5
|
+
export type DeltaReceiver = (delta: IDelta) => void;
|
|
6
|
+
/**
|
|
7
|
+
* Legacy alias for {@link DeltaReceiver}.
|
|
8
|
+
*/
|
|
9
|
+
export type DeltaHandler = (delta: IDelta) => void;
|
|
10
|
+
/**
|
|
11
|
+
* @return a tuple consisting of a {@link DeltaReceiver} implementation (as 1st member) that pushes any received delta unto the tuple's 2nd member: an array of {@link IDelta deltas}.
|
|
12
|
+
* @param printSerializations determines whether the deltas are serialized as JSON and printed to the JavaScript console.
|
|
13
|
+
*/
|
|
14
|
+
export declare const collectingDeltaReceiver: (printSerializations?: boolean) => [DeltaReceiver, IDelta[]];
|
|
15
|
+
/**
|
|
16
|
+
* Legacy alias for {@link collectingDeltaReceiver}.
|
|
17
|
+
*/
|
|
18
|
+
export declare const collectingDeltaHandler: (printSerializations?: boolean) => [DeltaReceiver, IDelta[]];
|
|
19
|
+
/**
|
|
20
|
+
* An interface for {@link DeltaReceiver delta receivers} that can be switched on and off — “latchingDeltaReceiverFrom”.
|
|
21
|
+
*/
|
|
22
|
+
export interface LatchingDeltaReceiver extends DeltaReceiver {
|
|
23
|
+
latch(emitDeltas: boolean): void;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Legacy alias for {@link LatchingDeltaReceiver}.
|
|
27
|
+
*/
|
|
28
|
+
export interface LatchingDeltaHandler extends LatchingDeltaReceiver {
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* @return a latching version of the given {@link DeltaReceiver delta receiver}.
|
|
32
|
+
*/
|
|
33
|
+
export declare const latchingDeltaReceiverFrom: (receiveDelta: DeltaReceiver) => LatchingDeltaReceiver;
|
|
34
|
+
/**
|
|
35
|
+
* @return a {@link DeltaReceiver delta receiver} implementation that forwards received deltas to the given {@link DeltaReceiver delta receivers}.
|
|
36
|
+
* This is necessary e.g. for combining using the delta protocol with an undo mechanism.
|
|
37
|
+
*/
|
|
38
|
+
export declare const deltaReceiverForwardingTo: (...deltaReceivers: DeltaReceiver[]) => DeltaReceiver;
|
|
39
|
+
//# sourceMappingURL=receivers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"receivers.d.ts","sourceRoot":"","sources":["../../src/deltas/receivers.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAGlC;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;AAEpD;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;AAEnD;;;GAGG;AACH,eAAO,MAAM,uBAAuB,GAAI,6BAA2B,KAAG,CAAC,aAAa,EAAE,MAAM,EAAE,CAS7F,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,sBAAsB,qCAdmC,CAAC,aAAa,EAAE,MAAM,EAAE,CAcjC,CAAC;AAE9D;;GAEG;AACH,MAAM,WAAW,qBAAsB,SAAQ,aAAa;IACxD,KAAK,CAAC,UAAU,EAAE,OAAO,GAAG,IAAI,CAAC;CACpC;AAED;;GAEG;AACH,MAAM,WAAW,oBAAqB,SAAQ,qBAAqB;CAAG;AAEtE;;GAEG;AACH,eAAO,MAAM,yBAAyB,GAAI,cAAc,aAAa,KAAG,qBAcvE,CAAC;AAGF;;;GAGG;AACH,eAAO,MAAM,yBAAyB,GAAI,GAAG,gBAAgB,aAAa,EAAE,KAAG,aAG1E,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
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
|
+
import { serializeDelta } from "./serialization/index.js";
|
|
18
|
+
/**
|
|
19
|
+
* @return a tuple consisting of a {@link DeltaReceiver} implementation (as 1st member) that pushes any received delta unto the tuple's 2nd member: an array of {@link IDelta deltas}.
|
|
20
|
+
* @param printSerializations determines whether the deltas are serialized as JSON and printed to the JavaScript console.
|
|
21
|
+
*/
|
|
22
|
+
export const collectingDeltaReceiver = (printSerializations = false) => {
|
|
23
|
+
const deltas = [];
|
|
24
|
+
const receiveDelta = (delta) => {
|
|
25
|
+
deltas.push(delta);
|
|
26
|
+
if (printSerializations) {
|
|
27
|
+
console.log(JSON.stringify(serializeDelta(delta), null, 4));
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
return [receiveDelta, deltas];
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Legacy alias for {@link collectingDeltaReceiver}.
|
|
34
|
+
*/
|
|
35
|
+
export const collectingDeltaHandler = collectingDeltaReceiver;
|
|
36
|
+
;
|
|
37
|
+
/**
|
|
38
|
+
* @return a latching version of the given {@link DeltaReceiver delta receiver}.
|
|
39
|
+
*/
|
|
40
|
+
export const latchingDeltaReceiverFrom = (receiveDelta) => {
|
|
41
|
+
let emitDeltas = false;
|
|
42
|
+
return Object.assign((delta) => {
|
|
43
|
+
if (emitDeltas) {
|
|
44
|
+
receiveDelta(delta);
|
|
45
|
+
}
|
|
46
|
+
}, {
|
|
47
|
+
latch(emitDeltas_) {
|
|
48
|
+
emitDeltas = emitDeltas_;
|
|
49
|
+
},
|
|
50
|
+
});
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* @return a {@link DeltaReceiver delta receiver} implementation that forwards received deltas to the given {@link DeltaReceiver delta receivers}.
|
|
54
|
+
* This is necessary e.g. for combining using the delta protocol with an undo mechanism.
|
|
55
|
+
*/
|
|
56
|
+
export const deltaReceiverForwardingTo = (...deltaReceivers) => (delta) => {
|
|
57
|
+
deltaReceivers.forEach((receiveDelta) => receiveDelta(delta));
|
|
58
|
+
};
|
|
59
|
+
//# sourceMappingURL=receivers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"receivers.js","sourceRoot":"","sources":["../../src/deltas/receivers.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,EAAE;AACF,iEAAiE;AACjE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,iDAAiD;AACjD,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;AACjC,EAAE;AACF,sEAAsE;AACtE,sCAAsC;AAGtC,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAYzD;;;GAGG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,mBAAmB,GAAG,KAAK,EAA6B,EAAE;IAC9F,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,YAAY,GAAkB,CAAC,KAAK,EAAE,EAAE;QAC1C,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnB,IAAI,mBAAmB,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAChE,CAAC;IACL,CAAC,CAAC;IACF,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;AAClC,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,uBAAuB,CAAC;AAYQ,CAAC;AAEvE;;GAEG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,YAA2B,EAAyB,EAAE;IAC5F,IAAI,UAAU,GAAG,KAAK,CAAC;IACvB,OAAO,MAAM,CAAC,MAAM,CAChB,CAAC,KAAa,EAAE,EAAE;QACd,IAAI,UAAU,EAAE,CAAC;YACb,YAAY,CAAC,KAAK,CAAC,CAAC;QACxB,CAAC;IACL,CAAC,EACD;QACI,KAAK,CAAC,WAAoB;YACtB,UAAU,GAAG,WAAW,CAAC;QAC7B,CAAC;KACJ,CACJ,CAAC;AACN,CAAC,CAAC;AAGF;;;GAGG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,GAAG,cAA+B,EAAiB,EAAE,CAC3F,CAAC,KAAK,EAAE,EAAE;IACN,cAAc,CAAC,OAAO,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;AAClE,CAAC,CAAC"}
|
package/dist/deserializer.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { PropertyValueDeserializer, SimplisticHandler } from "@lionweb/core";
|
|
2
2
|
import { LionWebJsonChunk } from "@lionweb/json";
|
|
3
|
-
import {
|
|
3
|
+
import { DeltaReceiver, IdMapping, ILanguageBase, INodeBase } from "./index.js";
|
|
4
4
|
/**
|
|
5
5
|
* A type for deserializer functions that are parametrized in their return type.
|
|
6
6
|
*/
|
|
@@ -16,13 +16,13 @@ export type RootsWithIdMapping = {
|
|
|
16
16
|
/**
|
|
17
17
|
* @return a {@link Deserializer} function for the given languages (given as {@link ILanguageBase}s) that returns a {@link RootsWithIdMapping}.
|
|
18
18
|
* @param languageBases the {@link ILanguageBase}s for (at least) all the languages used in the {@link LionWebJsonChunk} to deserialize, minus LionCore M3 and built-ins.
|
|
19
|
-
* @param
|
|
19
|
+
* @param receiveDelta an optional {@link DeltaReceiver} that will be injected in all {@link INodeBase nodes} created.
|
|
20
20
|
*/
|
|
21
|
-
export declare const nodeBaseDeserializerWithIdMapping: (languageBases: ILanguageBase[],
|
|
21
|
+
export declare const nodeBaseDeserializerWithIdMapping: (languageBases: ILanguageBase[], receiveDelta?: DeltaReceiver) => Deserializer<RootsWithIdMapping>;
|
|
22
22
|
/**
|
|
23
23
|
* @return a {@link Deserializer} function for the languages (given as {@link ILanguageBase}s) that returns the roots (of type {@link INodeBase}) of the deserialized model.
|
|
24
24
|
* @param languageBases the {@link ILanguageBase}s for (at least) all the languages used in the {@link LionWebJsonChunk} to deserialize, minus LionCore M3 and built-ins.
|
|
25
|
-
* @param
|
|
25
|
+
* @param receiveDelta an optional {@link DeltaReceiver} that will be injected in all {@link INodeBase nodes} created.
|
|
26
26
|
*/
|
|
27
|
-
export declare const nodeBaseDeserializer: (languageBases: ILanguageBase[],
|
|
27
|
+
export declare const nodeBaseDeserializer: (languageBases: ILanguageBase[], receiveDelta?: DeltaReceiver) => Deserializer<INodeBase[]>;
|
|
28
28
|
//# sourceMappingURL=deserializer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deserializer.d.ts","sourceRoot":"","sources":["../src/deserializer.ts"],"names":[],"mappings":"AAiBA,OAAO,EAUH,yBAAyB,EAEzB,iBAAiB,EAEpB,MAAM,eAAe,CAAA;AACtB,OAAO,EAAa,gBAAgB,EAAmB,MAAM,eAAe,CAAA;AAG5E,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"deserializer.d.ts","sourceRoot":"","sources":["../src/deserializer.ts"],"names":[],"mappings":"AAiBA,OAAO,EAUH,yBAAyB,EAEzB,iBAAiB,EAEpB,MAAM,eAAe,CAAA;AACtB,OAAO,EAAa,gBAAgB,EAAmB,MAAM,eAAe,CAAA;AAG5E,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAI/E;;GAEG;AACH,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,CAC1B,kBAAkB,EAAE,gBAAgB,EACpC,cAAc,CAAC,EAAE,SAAS,EAAE,EAC5B,yBAAyB,CAAC,EAAE,yBAAyB,EACrD,cAAc,CAAC,EAAE,iBAAiB,KACjC,CAAC,CAAC;AAkBP;;;GAGG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IAAC,SAAS,EAAE,SAAS,CAAA;CAAE,CAAC;AAG9E;;;;GAIG;AACH,eAAO,MAAM,iCAAiC,GAAI,eAAe,aAAa,EAAE,EAAE,eAAe,aAAa,KAAG,YAAY,CAAC,kBAAkB,CA0I/I,CAAC;AAGF;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,GAAI,eAAe,aAAa,EAAE,EAAE,eAAe,aAAa,KAAG,YAAY,CAAC,SAAS,EAAE,CAS3H,CAAA"}
|
package/dist/deserializer.js
CHANGED
|
@@ -24,19 +24,19 @@ const languageBaseLookupFor = (languageBases) => (language) => {
|
|
|
24
24
|
}
|
|
25
25
|
return languageBase;
|
|
26
26
|
};
|
|
27
|
-
const factoryLookupFor = (languageBases,
|
|
27
|
+
const factoryLookupFor = (languageBases, receiveDelta) => {
|
|
28
28
|
const lookup = languageBaseLookupFor(languageBases);
|
|
29
|
-
return (language) => lookup(language).factory(
|
|
29
|
+
return (language) => lookup(language).factory(receiveDelta);
|
|
30
30
|
};
|
|
31
31
|
/**
|
|
32
32
|
* @return a {@link Deserializer} function for the given languages (given as {@link ILanguageBase}s) that returns a {@link RootsWithIdMapping}.
|
|
33
33
|
* @param languageBases the {@link ILanguageBase}s for (at least) all the languages used in the {@link LionWebJsonChunk} to deserialize, minus LionCore M3 and built-ins.
|
|
34
|
-
* @param
|
|
34
|
+
* @param receiveDelta an optional {@link DeltaReceiver} that will be injected in all {@link INodeBase nodes} created.
|
|
35
35
|
*/
|
|
36
|
-
export const nodeBaseDeserializerWithIdMapping = (languageBases,
|
|
36
|
+
export const nodeBaseDeserializerWithIdMapping = (languageBases, receiveDelta) => {
|
|
37
37
|
const symbolTable = new MemoisingSymbolTable(languageBases.map(({ language }) => language));
|
|
38
38
|
const languageBaseFor = languageBaseLookupFor(languageBases);
|
|
39
|
-
const factoryFor = factoryLookupFor(languageBases,
|
|
39
|
+
const factoryFor = factoryLookupFor(languageBases, receiveDelta);
|
|
40
40
|
return (serializationChunk, dependentNodes = [], propertyValueDeserializer = new BuiltinPropertyValueDeserializer(), problemsHandler = defaultSimplisticHandler) => {
|
|
41
41
|
const nodesToInstall = [];
|
|
42
42
|
const createNode = ({ id, classifier: classifierMetaPointer, properties, containments, references, annotations }) => {
|
|
@@ -160,10 +160,10 @@ export const nodeBaseDeserializerWithIdMapping = (languageBases, handleDelta) =>
|
|
|
160
160
|
/**
|
|
161
161
|
* @return a {@link Deserializer} function for the languages (given as {@link ILanguageBase}s) that returns the roots (of type {@link INodeBase}) of the deserialized model.
|
|
162
162
|
* @param languageBases the {@link ILanguageBase}s for (at least) all the languages used in the {@link LionWebJsonChunk} to deserialize, minus LionCore M3 and built-ins.
|
|
163
|
-
* @param
|
|
163
|
+
* @param receiveDelta an optional {@link DeltaReceiver} that will be injected in all {@link INodeBase nodes} created.
|
|
164
164
|
*/
|
|
165
|
-
export const nodeBaseDeserializer = (languageBases,
|
|
166
|
-
const deserializerWithIdMapping = nodeBaseDeserializerWithIdMapping(languageBases,
|
|
165
|
+
export const nodeBaseDeserializer = (languageBases, receiveDelta) => {
|
|
166
|
+
const deserializerWithIdMapping = nodeBaseDeserializerWithIdMapping(languageBases, receiveDelta);
|
|
167
167
|
return (serializationChunk, dependentNodes = [], propertyValueDeserializer = new BuiltinPropertyValueDeserializer(), problemsHandler = defaultSimplisticHandler) => deserializerWithIdMapping(serializationChunk, dependentNodes, propertyValueDeserializer, problemsHandler).roots;
|
|
168
168
|
};
|
|
169
169
|
//# sourceMappingURL=deserializer.js.map
|
package/dist/deserializer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deserializer.js","sourceRoot":"","sources":["../src/deserializer.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,EAAE;AACF,iEAAiE;AACjE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,iDAAiD;AACjD,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;AACjC,EAAE;AACF,sEAAsE;AACtE,sCAAsC;AAEtC,OAAO,EACH,gCAAgC,EAChC,UAAU,EACV,WAAW,EACX,wBAAwB,EACxB,WAAW,EAEX,oBAAoB,EACpB,aAAa,EACb,QAAQ,EAER,SAAS,EAET,UAAU,EACb,MAAM,eAAe,CAAA;AAEtB,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAEzD,OAAO,
|
|
1
|
+
{"version":3,"file":"deserializer.js","sourceRoot":"","sources":["../src/deserializer.ts"],"names":[],"mappings":"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"}
|
package/dist/factory.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { ILanguageBase, NodeBaseFactory } from "./base-types.js";
|
|
2
|
-
import {
|
|
2
|
+
import { DeltaReceiver } from "./deltas/index.js";
|
|
3
3
|
/**
|
|
4
4
|
* @return a {@link NodeBaseFactory factory function} that works for all given {@link ILanguageBase language bases}.
|
|
5
5
|
*/
|
|
6
|
-
export declare const combinedFactoryFor: (languageBases: ILanguageBase[],
|
|
6
|
+
export declare const combinedFactoryFor: (languageBases: ILanguageBase[], receiveDelta?: DeltaReceiver) => NodeBaseFactory;
|
|
7
7
|
//# sourceMappingURL=factory.d.ts.map
|
package/dist/factory.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../src/factory.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAChE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../src/factory.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAEjD;;GAEG;AACH,eAAO,MAAM,kBAAkB,GAAI,eAAe,aAAa,EAAE,EAAE,eAAe,aAAa,KAAG,eAuBjG,CAAA"}
|
package/dist/factory.js
CHANGED
|
@@ -18,13 +18,13 @@ import { lazyMapGet } from "@lionweb/ts-utils";
|
|
|
18
18
|
/**
|
|
19
19
|
* @return a {@link NodeBaseFactory factory function} that works for all given {@link ILanguageBase language bases}.
|
|
20
20
|
*/
|
|
21
|
-
export const combinedFactoryFor = (languageBases,
|
|
21
|
+
export const combinedFactoryFor = (languageBases, receiveDelta) => {
|
|
22
22
|
// create lookup map:
|
|
23
23
|
const languageKey2version2factory = {};
|
|
24
24
|
languageBases.forEach((languageBase) => {
|
|
25
25
|
const { key, version } = languageBase.language;
|
|
26
26
|
const version2factory = lazyMapGet(languageKey2version2factory, key, () => ({}));
|
|
27
|
-
lazyMapGet(version2factory, version, () => languageBase.factory(
|
|
27
|
+
lazyMapGet(version2factory, version, () => languageBase.factory(receiveDelta));
|
|
28
28
|
// (Note: don't destructure factory from languageBase, as that will unbind it as "this"!)
|
|
29
29
|
});
|
|
30
30
|
return (classifier, id) => {
|
package/dist/factory.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../src/factory.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,EAAE;AACF,iEAAiE;AACjE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,iDAAiD;AACjD,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;AACjC,EAAE;AACF,sEAAsE;AACtE,sCAAsC;AAEtC,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAI9C;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,aAA8B,EAAE,
|
|
1
|
+
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../src/factory.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,EAAE;AACF,iEAAiE;AACjE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,iDAAiD;AACjD,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;AACjC,EAAE;AACF,sEAAsE;AACtE,sCAAsC;AAEtC,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAI9C;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,aAA8B,EAAE,YAA4B,EAAmB,EAAE;IAChH,qBAAqB;IACrB,MAAM,2BAA2B,GAA8D,EAAE,CAAA;IACjG,aAAa,CAAC,OAAO,CAAC,CAAC,YAAY,EAAE,EAAE;QACnC,MAAM,EAAC,GAAG,EAAE,OAAO,EAAC,GAAG,YAAY,CAAC,QAAQ,CAAA;QAC5C,MAAM,eAAe,GAAG,UAAU,CAAC,2BAA2B,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;QAChF,UAAU,CAAC,eAAe,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAA;QAC1E,yFAAyF;IACjG,CAAC,CAAC,CAAA;IAEF,OAAO,CAAC,UAAU,EAAE,EAAE,EAAE,EAAE;QACtB,MAAM,EAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAC,GAAG,UAAU,CAAC,QAAQ,CAAA;QAChD,MAAM,eAAe,GAAG,2BAA2B,CAAC,GAAG,CAAC,CAAA;QACxD,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CAAC,YAAY,IAAI,aAAa,GAAG,YAAY,CAAC,CAAA;QACjE,CAAC;QACD,MAAM,OAAO,GAAG,eAAe,CAAC,OAAO,CAAC,CAAA;QACxC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YACxB,MAAM,iBAAiB,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;YACtD,MAAM,IAAI,KAAK,CAAC,YAAY,IAAI,aAAa,GAAG,gBAAgB,OAAO,aAAa,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,sBAAsB,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;QAC/N,CAAC;QACD,OAAO,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAA;IAClC,CAAC,CAAA;AACL,CAAC,CAAA"}
|
|
@@ -8,8 +8,8 @@ export declare abstract class ValueManager {
|
|
|
8
8
|
protected readonly container: INodeBase;
|
|
9
9
|
protected constructor(container: INodeBase);
|
|
10
10
|
/**
|
|
11
|
-
* Emits a delta if a {@link
|
|
12
|
-
* @param deltaThunk a thunk that generates the delta, and is only called when a delta
|
|
11
|
+
* Emits a delta if a {@link DeltaReceiver} is registered with the container.
|
|
12
|
+
* @param deltaThunk a thunk that generates the delta, and is only called when a delta receiver is registered with the container.
|
|
13
13
|
*/
|
|
14
14
|
emitDelta(deltaThunk: () => IDelta): void;
|
|
15
15
|
}
|
|
@@ -23,12 +23,12 @@ export class ValueManager {
|
|
|
23
23
|
this.container = container;
|
|
24
24
|
}
|
|
25
25
|
/**
|
|
26
|
-
* Emits a delta if a {@link
|
|
27
|
-
* @param deltaThunk a thunk that generates the delta, and is only called when a delta
|
|
26
|
+
* Emits a delta if a {@link DeltaReceiver} is registered with the container.
|
|
27
|
+
* @param deltaThunk a thunk that generates the delta, and is only called when a delta receiver is registered with the container.
|
|
28
28
|
*/
|
|
29
29
|
emitDelta(deltaThunk) {
|
|
30
|
-
if (this.container.
|
|
31
|
-
this.container.
|
|
30
|
+
if (this.container.receiveDelta) {
|
|
31
|
+
this.container.receiveDelta(deltaThunk());
|
|
32
32
|
}
|
|
33
33
|
}
|
|
34
34
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/value-managers/base.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,EAAE;AACF,iEAAiE;AACjE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,iDAAiD;AACjD,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;AACjC,EAAE;AACF,sEAAsE;AACtE,sCAAsC;AAEtC,OAAO,EAAW,eAAe,EAAQ,MAAM,eAAe,CAAA;AAK9D;;GAEG;AACH,MAAM,OAAgB,YAAY;IAE9B,YAAyC,SAAoB;QAApB,cAAS,GAAT,SAAS,CAAW;IAC7D,CAAC;IAED;;;OAGG;IACH,SAAS,CAAC,UAAwB;QAC9B,IAAI,IAAI,CAAC,SAAS,CAAC,
|
|
1
|
+
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/value-managers/base.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lionweb/class-core",
|
|
3
|
-
"version": "0.7.0-beta.
|
|
3
|
+
"version": "0.7.0-beta.13",
|
|
4
4
|
"description": "Generic, language-aspecific base types for generated TypeScript APIs",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -27,9 +27,9 @@
|
|
|
27
27
|
"release": "npm publish"
|
|
28
28
|
},
|
|
29
29
|
"dependencies": {
|
|
30
|
-
"@lionweb/core": "0.7.0-beta.
|
|
31
|
-
"@lionweb/json": "0.7.0-beta.
|
|
32
|
-
"@lionweb/ts-utils": "0.7.0-beta.
|
|
30
|
+
"@lionweb/core": "0.7.0-beta.13",
|
|
31
|
+
"@lionweb/json": "0.7.0-beta.13",
|
|
32
|
+
"@lionweb/ts-utils": "0.7.0-beta.13",
|
|
33
33
|
"littoral-templates": "0.5.0",
|
|
34
34
|
"mobx": "6.13.7"
|
|
35
35
|
}
|
|
@@ -42,7 +42,7 @@ import {
|
|
|
42
42
|
} from "@lionweb/json";
|
|
43
43
|
|
|
44
44
|
import {
|
|
45
|
-
|
|
45
|
+
DeltaReceiver,
|
|
46
46
|
ILanguageBase,
|
|
47
47
|
INodeBase,
|
|
48
48
|
NodeBase,
|
|
@@ -110,7 +110,7 @@ export class LionCore_builtinsBase implements ILanguageBase {
|
|
|
110
110
|
this._wiredUp = true;
|
|
111
111
|
}
|
|
112
112
|
|
|
113
|
-
factory(
|
|
113
|
+
factory(_receiveDelta?: DeltaReceiver): NodeBaseFactory {
|
|
114
114
|
return (classifier: Classifier, _id: LionWebId) => {
|
|
115
115
|
const {language} = classifier;
|
|
116
116
|
throw new Error(`can't instantiate ${classifier.name} (key=${classifier.key}): classifier is not known in language ${language.name} (key=${language.key}, version=${language.version})`);
|
package/src/base-types.ts
CHANGED
|
@@ -35,7 +35,7 @@ import { makeObservable } from "mobx"
|
|
|
35
35
|
import {
|
|
36
36
|
AnnotationsValueManager,
|
|
37
37
|
ContainmentValueManager,
|
|
38
|
-
|
|
38
|
+
DeltaReceiver,
|
|
39
39
|
FeatureValueManager,
|
|
40
40
|
MultiContainmentValueManager,
|
|
41
41
|
MultiReferenceValueManager,
|
|
@@ -178,9 +178,9 @@ export interface INodeBase extends Node {
|
|
|
178
178
|
get referenceTargets(): INodeBase[];
|
|
179
179
|
|
|
180
180
|
/**
|
|
181
|
-
* An optionally-installed {@link
|
|
181
|
+
* An optionally-installed {@link DeltaReceiver}.
|
|
182
182
|
*/
|
|
183
|
-
|
|
183
|
+
receiveDelta?: DeltaReceiver;
|
|
184
184
|
|
|
185
185
|
|
|
186
186
|
/**
|
|
@@ -194,7 +194,7 @@ export interface INodeBase extends Node {
|
|
|
194
194
|
/**
|
|
195
195
|
* The base type for any node that's managed by a, potentially delta-emitting, API.
|
|
196
196
|
*
|
|
197
|
-
* It receives a {@link
|
|
197
|
+
* It receives a {@link DeltaReceiver} to pass {@link IDelta deltas} to
|
|
198
198
|
* that occur due to changes to values of its features,
|
|
199
199
|
* as well as moving among parents and deletion.
|
|
200
200
|
*
|
|
@@ -225,7 +225,7 @@ export abstract class NodeBase implements INodeBase {
|
|
|
225
225
|
}
|
|
226
226
|
|
|
227
227
|
|
|
228
|
-
protected constructor(readonly classifier: Classifier, readonly id: LionWebId, readonly
|
|
228
|
+
protected constructor(readonly classifier: Classifier, readonly id: LionWebId, readonly receiveDelta?: DeltaReceiver, parentage?: Parentage) {
|
|
229
229
|
this.classifier = classifier;
|
|
230
230
|
this.id = id;
|
|
231
231
|
if (parentage) {
|
|
@@ -347,7 +347,7 @@ export type NodeBaseFactory = (classifier: Classifier, id: LionWebId) => INodeBa
|
|
|
347
347
|
*/
|
|
348
348
|
export interface ILanguageBase {
|
|
349
349
|
language: Language;
|
|
350
|
-
factory(
|
|
350
|
+
factory(receiveDelta?: DeltaReceiver): NodeBaseFactory;
|
|
351
351
|
enumLiteralFrom<T>(enumerationLiteral: EnumerationLiteral): T;
|
|
352
352
|
}
|
|
353
353
|
|
package/src/convenience.ts
CHANGED
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
import { incomingReferences as lwIncomingReferences, ReferenceValue } from "@lionweb/core"
|
|
19
19
|
import { LionWebId } from "@lionweb/json"
|
|
20
20
|
import { NodeDuplicator } from "./duplicator.js"
|
|
21
|
-
import { deepDuplicateWith,
|
|
21
|
+
import { deepDuplicateWith, DeltaReceiver, IdMapping, ILanguageBase, INodeBase } from "./index.js"
|
|
22
22
|
import { nodeBaseReader } from "./serializer.js"
|
|
23
23
|
|
|
24
24
|
|
|
@@ -57,10 +57,10 @@ export const incomingReferences = (targetNodeOrNodes: INodeBase | INodeBase[], r
|
|
|
57
57
|
* *without* generating new IDs.
|
|
58
58
|
* @param languageBases the {@link ILanguageBase language bases} of the languages that the nodes might come from
|
|
59
59
|
* — these are necessary for their factories
|
|
60
|
-
* @param
|
|
60
|
+
* @param receiveDelta an optional {@link DeltaReceiver} that gets installed on the deep-cloned nodes
|
|
61
61
|
*/
|
|
62
|
-
export const deepClonerFor = (languageBases: ILanguageBase[],
|
|
63
|
-
deepDuplicatorFor(languageBases, (originalNode) => originalNode.id,
|
|
62
|
+
export const deepClonerFor = (languageBases: ILanguageBase[], receiveDelta?: DeltaReceiver) =>
|
|
63
|
+
deepDuplicatorFor(languageBases, (originalNode) => originalNode.id, receiveDelta);
|
|
64
64
|
|
|
65
65
|
|
|
66
66
|
/**
|
|
@@ -73,13 +73,13 @@ export type NewIdFunction = (originalNode: INodeBase) => LionWebId;
|
|
|
73
73
|
* @return a {@link NodeDuplicator} function that does the “obvious” thing, given the parameters:
|
|
74
74
|
* @param languageBases an array of languages in the form of {@link ILanguageBase}s
|
|
75
75
|
* @param newIdFunc a function that computes a – not necessarily new – ID from a given original {@link INodeBase node}
|
|
76
|
-
* @param
|
|
76
|
+
* @param receiveDelta an optional {@link DeltaReceiver}
|
|
77
77
|
* @param idMapping an optional {@link IdMapping}
|
|
78
78
|
*/
|
|
79
|
-
export const defaultNodeDuplicatorFor = (languageBases: ILanguageBase[], newIdFunc: NewIdFunction,
|
|
79
|
+
export const defaultNodeDuplicatorFor = (languageBases: ILanguageBase[], newIdFunc: NewIdFunction, receiveDelta?: DeltaReceiver, idMapping?: IdMapping): NodeDuplicator =>
|
|
80
80
|
(originalNode: INodeBase) => {
|
|
81
81
|
const languageBase = languageBases.find((languageBase) => languageBase.language === originalNode.classifier.language)!;
|
|
82
|
-
const duplicatedNode = languageBase.factory(
|
|
82
|
+
const duplicatedNode = languageBase.factory(receiveDelta)(originalNode.classifier, newIdFunc(originalNode));
|
|
83
83
|
idMapping?.updateWith(duplicatedNode);
|
|
84
84
|
return [duplicatedNode, originalNode.setFeatures];
|
|
85
85
|
};
|
|
@@ -91,8 +91,8 @@ export const defaultNodeDuplicatorFor = (languageBases: ILanguageBase[], newIdFu
|
|
|
91
91
|
* @param languageBases the {@link ILanguageBase language bases} of the languages that the nodes might come from
|
|
92
92
|
* — these are necessary for their factories
|
|
93
93
|
* @param newIdFunc a function that computes a – not necessarily new – ID from a given original {@link INodeBase node}
|
|
94
|
-
* @param
|
|
94
|
+
* @param receiveDelta an optional {@link DeltaReceiver} that gets installed on the deep-cloned nodes
|
|
95
95
|
*/
|
|
96
|
-
export const deepDuplicatorFor = (languageBases: ILanguageBase[], newIdFunc: NewIdFunction,
|
|
97
|
-
deepDuplicateWith(defaultNodeDuplicatorFor(languageBases, newIdFunc,
|
|
96
|
+
export const deepDuplicatorFor = (languageBases: ILanguageBase[], newIdFunc: NewIdFunction, receiveDelta?: DeltaReceiver, idMapping?: IdMapping) =>
|
|
97
|
+
deepDuplicateWith(defaultNodeDuplicatorFor(languageBases, newIdFunc, receiveDelta, idMapping));
|
|
98
98
|
|
package/src/deltas/appliers.ts
CHANGED
|
@@ -469,7 +469,7 @@ export const applyDelta = deltaApplier()
|
|
|
469
469
|
* @usage should look as follows.
|
|
470
470
|
*
|
|
471
471
|
* ```typescript
|
|
472
|
-
* const {roots, idMapping} = deserializeAsLDMModelWithMapping(serializationChunk,
|
|
472
|
+
* const {roots, idMapping} = deserializeAsLDMModelWithMapping(serializationChunk, receiveDelta);
|
|
473
473
|
* applyDeltasWithLookup(idMapping, deltas);
|
|
474
474
|
* ```
|
|
475
475
|
*/
|
|
@@ -485,7 +485,7 @@ export const applyDeltasWithLookup = (idMapping: IdMapping, deltas: IDelta[], up
|
|
|
485
485
|
* @usage should look as follows.
|
|
486
486
|
*
|
|
487
487
|
* ```typescript
|
|
488
|
-
* const {roots, idMapping} = deserializeAsLDMModelWithMapping(serializationChunk,
|
|
488
|
+
* const {roots, idMapping} = deserializeAsLDMModelWithMapping(serializationChunk, receiveDelta);
|
|
489
489
|
* applyDeltaWithLookup(idMapping, delta);
|
|
490
490
|
* ```
|
|
491
491
|
*/
|
|
@@ -508,6 +508,9 @@ export const updateIdMappingWithDelta = (idMapping: IdMapping, delta: IDelta) =>
|
|
|
508
508
|
if (delta instanceof AnnotationAddedDelta) {
|
|
509
509
|
idMapping.updateWith(delta.newAnnotation);
|
|
510
510
|
}
|
|
511
|
+
if (delta instanceof PartitionAddedDelta) {
|
|
512
|
+
idMapping.updateWith(delta.newPartition);
|
|
513
|
+
}
|
|
511
514
|
// (nothing to be done: no need –yet?- to take deleted child nodes out of the ID mapping)
|
|
512
515
|
};
|
|
513
516
|
|
|
@@ -0,0 +1,107 @@
|
|
|
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 { CompositeDelta, DeltaReceiver, IDelta } from "../index.js"
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* A <em>delta compositor</em> is used to <em>aggregate</em> deltas as {@link CompositeDelta composite deltas}.
|
|
23
|
+
*
|
|
24
|
+
* Usage:
|
|
25
|
+
* ```typescript
|
|
26
|
+
* const compositor = new Compositor(downstreamReceiveDelta);
|
|
27
|
+
* compositor.openComposite();
|
|
28
|
+
* // ...
|
|
29
|
+
* compositor.upstreamReceiveDelta(<delta>);
|
|
30
|
+
* // ...
|
|
31
|
+
* compositor.closeComposite();
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
export class DeltaCompositor {
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* The {@link DeltaReceiver} implementation that either forwards to the given downstream delta handle
|
|
38
|
+
* or gathers deltas into composite deltas to forward to the downstream delta receiver later.
|
|
39
|
+
*/
|
|
40
|
+
readonly upstreamReceiveDelta: DeltaReceiver;
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* An array of arrays of {@link IDelta deltas}, comprising a “stack”.
|
|
44
|
+
*
|
|
45
|
+
* Invariants:
|
|
46
|
+
* - (I1) composite has been opened ⇔ `this.deltasInComposite !== undefined` / `Array.isArray(this.deltasInComposite)`
|
|
47
|
+
* - (I2) this.deltasStack is either undefined or an array containing at least one array
|
|
48
|
+
*/
|
|
49
|
+
private deltasStack: IDelta[][] | undefined = undefined;
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* @param downstreamReceiveDelta the {@link DeltaReceiver} that deltas get passed to.
|
|
53
|
+
* @param maximumNestingDepth the maximum depth that composites can be nested.
|
|
54
|
+
* A maximum depth of e.g. 1 means that at most 1 composite can be open at any time.
|
|
55
|
+
*/
|
|
56
|
+
constructor(private readonly downstreamReceiveDelta: DeltaReceiver, private readonly maximumNestingDepth: number = Infinity) {
|
|
57
|
+
if (maximumNestingDepth !== Infinity && (!Number.isInteger(maximumNestingDepth) || maximumNestingDepth < 0)) {
|
|
58
|
+
throw new Error(`maximum nesting depth must be a non-negative integer`);
|
|
59
|
+
}
|
|
60
|
+
this.upstreamReceiveDelta = (delta) => {
|
|
61
|
+
if (this.deltasStack === undefined) {
|
|
62
|
+
// pass on immediately:
|
|
63
|
+
this.downstreamReceiveDelta(delta);
|
|
64
|
+
} else {
|
|
65
|
+
// store for later:
|
|
66
|
+
this.deltasStack[this.deltasStack.length - 1].push(delta); // (I2)
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Opens a composite, meaning that all deltas passed to the {@link upstreamReceiveDelta} are gathered into a composite delta
|
|
73
|
+
* that gets forwarded to the downstream delta receiver as soon as the composite is closed.
|
|
74
|
+
*
|
|
75
|
+
* Composites can be nested, to the maximum depth configured through this class’ constructor,
|
|
76
|
+
* beyond which an error gets thrown.
|
|
77
|
+
*/
|
|
78
|
+
openComposite = (): void => {
|
|
79
|
+
if (this.deltasStack === undefined) {
|
|
80
|
+
this.deltasStack = []; // ==> (I1) + 1st half of (I2)
|
|
81
|
+
}
|
|
82
|
+
if (this.deltasStack.length >= this.maximumNestingDepth) {
|
|
83
|
+
throw new Error(`attempt occurred to start a nested composition exceeding the maximum nesting depth`)
|
|
84
|
+
}
|
|
85
|
+
this.deltasStack.push([]); // ==> 2nd half of (I2)
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Closes the current composite, producing the deltas gathered for this composite into a composite delta.
|
|
90
|
+
* Composites can be nested, and deltas only get forwarded to the downstream delta receiver after the top-level composite has been closed.
|
|
91
|
+
*/
|
|
92
|
+
closeComposite = (): void => {
|
|
93
|
+
if (this.deltasStack === undefined) {
|
|
94
|
+
throw new Error(`attempt occurred to finish a composite without one being started`);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const parts = this.deltasStack.pop()!; // is an array because of (I2)
|
|
98
|
+
if (this.deltasStack.length === 0) { // last array popped from stack
|
|
99
|
+
this.deltasStack = undefined; // maintain (I2)
|
|
100
|
+
}
|
|
101
|
+
if (parts.length > 0) {
|
|
102
|
+
this.upstreamReceiveDelta(new CompositeDelta(parts));
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
}
|
|
107
|
+
|