@lionweb/class-core 0.8.0-beta.3 → 0.8.0-beta.5
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 +6 -0
- package/dist/deltas/appliers.d.ts.map +1 -1
- package/dist/deltas/appliers.js +6 -101
- package/dist/deltas/appliers.js.map +1 -1
- package/dist/deltas/inverters.d.ts.map +1 -1
- package/dist/deltas/inverters.js +1 -28
- package/dist/deltas/inverters.js.map +1 -1
- package/dist/deltas/serialization/deserializer.g.d.ts.map +1 -1
- package/dist/deltas/serialization/deserializer.g.js +1 -58
- package/dist/deltas/serialization/deserializer.g.js.map +1 -1
- package/dist/deltas/serialization/serializer.g.d.ts.map +1 -1
- package/dist/deltas/serialization/serializer.g.js +1 -70
- package/dist/deltas/serialization/serializer.g.js.map +1 -1
- package/dist/deltas/serialization/types.g.d.ts +6 -63
- package/dist/deltas/serialization/types.g.d.ts.map +1 -1
- package/dist/deltas/types.g.d.ts +0 -57
- package/dist/deltas/types.g.d.ts.map +1 -1
- package/dist/deltas/types.g.js +0 -63
- package/dist/deltas/types.g.js.map +1 -1
- package/dist/deserializer.d.ts +6 -4
- package/dist/deserializer.d.ts.map +1 -1
- package/dist/deserializer.js +16 -16
- package/dist/deserializer.js.map +1 -1
- package/dist/duplicator.d.ts.map +1 -1
- package/dist/duplicator.js +2 -2
- package/dist/duplicator.js.map +1 -1
- package/dist/id-mapping.d.ts +2 -2
- package/dist/id-mapping.d.ts.map +1 -1
- package/dist/id-mapping.js +4 -4
- package/dist/id-mapping.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/references.d.ts +4 -4
- package/dist/references.d.ts.map +1 -1
- package/dist/references.js +3 -3
- package/dist/references.js.map +1 -1
- package/dist/serializer.d.ts +2 -2
- package/dist/serializer.d.ts.map +1 -1
- package/dist/serializer.js +30 -24
- package/dist/serializer.js.map +1 -1
- package/dist/textualizer.d.ts.map +1 -1
- package/dist/textualizer.js +9 -5
- package/dist/textualizer.js.map +1 -1
- package/dist/value-managers/references.d.ts.map +1 -1
- package/dist/value-managers/references.js +5 -2
- package/dist/value-managers/references.js.map +1 -1
- package/package.json +4 -4
- package/src/deltas/appliers.ts +5 -97
- package/src/deltas/inverters.ts +0 -33
- package/src/deltas/serialization/deserializer.g.ts +0 -63
- package/src/deltas/serialization/serializer.g.ts +0 -87
- package/src/deltas/serialization/types.g.ts +5 -74
- package/src/deltas/types.g.ts +0 -75
- package/src/deserializer.ts +23 -21
- package/src/duplicator.ts +12 -2
- package/src/id-mapping.ts +6 -6
- package/src/index.ts +2 -2
- package/src/references.ts +5 -5
- package/src/serializer.ts +32 -24
- package/src/textualizer.ts +19 -6
- package/src/value-managers/references.ts +5 -7
package/src/serializer.ts
CHANGED
|
@@ -23,13 +23,14 @@ import {
|
|
|
23
23
|
Containment,
|
|
24
24
|
Enumeration,
|
|
25
25
|
Feature,
|
|
26
|
-
|
|
26
|
+
isUnresolvedReference,
|
|
27
27
|
PrimitiveType,
|
|
28
28
|
Property,
|
|
29
29
|
PropertyValueSerializer,
|
|
30
30
|
Reader,
|
|
31
31
|
Reference,
|
|
32
|
-
|
|
32
|
+
ResolveInfoDeducer,
|
|
33
|
+
serializerWith
|
|
33
34
|
} from "@lionweb/core"
|
|
34
35
|
|
|
35
36
|
import { INodeBase, LionCore_builtinsBase } from "./index.js"
|
|
@@ -52,6 +53,31 @@ export const getFeatureValue = (node: INodeBase, feature: Feature) => {
|
|
|
52
53
|
throw new Error(`unhandled Feature sub type ${feature.constructor.name}`)
|
|
53
54
|
};
|
|
54
55
|
|
|
56
|
+
/**
|
|
57
|
+
* A {@link ResolveInfoDeducer} that works on {@link INodeBase}s.
|
|
58
|
+
* *Note*: the {@link Reference} passed is not taken into account (yet).
|
|
59
|
+
*/
|
|
60
|
+
const nodeBaseResolveInfoDeducer: ResolveInfoDeducer<INodeBase> = (node, _reference) => {
|
|
61
|
+
// TODO put innards in separate function
|
|
62
|
+
if ("name" in node) {
|
|
63
|
+
// evaluating `node.name` might cause an error through FeatureValueManager.throwOnReadOfUnset:
|
|
64
|
+
try {
|
|
65
|
+
const value = node.name;
|
|
66
|
+
return typeof value === "string" ? value : undefined;
|
|
67
|
+
} catch (_) {
|
|
68
|
+
return undefined;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
const allSupertypes = allSuperTypesOf(node.classifier);
|
|
72
|
+
if (allSupertypes.indexOf(builtinClassifiers.inamed) > -1) {
|
|
73
|
+
return node.getPropertyValueManager(builtinFeatures.inamed_name).getDirectly() as (string | undefined);
|
|
74
|
+
}
|
|
75
|
+
if (allSupertypes.indexOf(LionCore_builtinsBase.INSTANCE.INamed) > -1) {
|
|
76
|
+
return node.getPropertyValueManager(LionCore_builtinsBase.INSTANCE.INamed_name).getDirectly() as (string | undefined);
|
|
77
|
+
}
|
|
78
|
+
return undefined;
|
|
79
|
+
};
|
|
80
|
+
|
|
55
81
|
/**
|
|
56
82
|
* A {@link Reader} that works on/for {@link INodeBase}s specifically.
|
|
57
83
|
* **Note** that this function is for internal use only!
|
|
@@ -62,31 +88,13 @@ export const nodeBaseReader: Reader<INodeBase> = {
|
|
|
62
88
|
enumerationLiteralFrom: (encoding, enumeration) => {
|
|
63
89
|
return enumeration.literals.find((literal) => literal.key === encoding)!;
|
|
64
90
|
},
|
|
65
|
-
resolveInfoFor:
|
|
66
|
-
if ("name" in node) {
|
|
67
|
-
// evaluating `node.name` might cause an error through FeatureValueManager.throwOnReadOfUnset:
|
|
68
|
-
try {
|
|
69
|
-
const value = node.name;
|
|
70
|
-
return typeof value === "string" ? value : undefined;
|
|
71
|
-
} catch (_) {
|
|
72
|
-
return undefined;
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
const allSupertypes = allSuperTypesOf(node.classifier);
|
|
76
|
-
if (allSupertypes.indexOf(builtinClassifiers.inamed) > -1) {
|
|
77
|
-
return node.getPropertyValueManager(builtinFeatures.inamed_name).getDirectly() as (string | undefined);
|
|
78
|
-
}
|
|
79
|
-
if (allSupertypes.indexOf(LionCore_builtinsBase.INSTANCE.INamed) > -1) {
|
|
80
|
-
return node.getPropertyValueManager(LionCore_builtinsBase.INSTANCE.INamed_name).getDirectly() as (string | undefined);
|
|
81
|
-
}
|
|
82
|
-
return undefined;
|
|
83
|
-
}
|
|
91
|
+
resolveInfoFor: nodeBaseResolveInfoDeducer
|
|
84
92
|
};
|
|
85
93
|
|
|
86
94
|
/**
|
|
87
95
|
* @return a serialization of the given nodes (of type {@link INodeBase}) as a {@link LionWebJsonChunk}.
|
|
88
96
|
*/
|
|
89
|
-
export const serializeNodeBases =
|
|
97
|
+
export const serializeNodeBases = serializerWith({ reader: nodeBaseReader, serializeEmptyFeatures: false });
|
|
90
98
|
|
|
91
99
|
|
|
92
100
|
/**
|
|
@@ -99,7 +107,7 @@ type PropertyValueSerializerConfiguration = Partial<{
|
|
|
99
107
|
|
|
100
108
|
/**
|
|
101
109
|
* @return a {@link PropertyValueSerializer} that uses the given {@link PropertyValueSerializer `primitiveValueSerializer`} *solely* for serializing values of primitively-typed properties,
|
|
102
|
-
* and serializes
|
|
110
|
+
* and serializes properties whose types are enumerations or unresolved the same way as {@link serializeNodeBases}.
|
|
103
111
|
* Unrecoverable issues are passed to the optional `reportIssue` argument, and
|
|
104
112
|
*/
|
|
105
113
|
export const propertyValueSerializerWith = (configuration?: PropertyValueSerializerConfiguration) => {
|
|
@@ -108,7 +116,7 @@ export const propertyValueSerializerWith = (configuration?: PropertyValueSeriali
|
|
|
108
116
|
return {
|
|
109
117
|
serializeValue: (value: unknown, property: Property) => {
|
|
110
118
|
const { type } = property
|
|
111
|
-
if (type
|
|
119
|
+
if (isUnresolvedReference(type)) {
|
|
112
120
|
reportIssue(`can't serialize value of property "${property.name}" (on classifier "${property.classifier.name}" in language "${property.classifier.language.name}") having unresolved type: ${value}`)
|
|
113
121
|
return null
|
|
114
122
|
}
|
package/src/textualizer.ts
CHANGED
|
@@ -15,7 +15,16 @@
|
|
|
15
15
|
// SPDX-FileCopyrightText: 2025 TRUMPF Laser SE and other contributors
|
|
16
16
|
// SPDX-License-Identifier: Apache-2.0
|
|
17
17
|
|
|
18
|
-
import {
|
|
18
|
+
import {
|
|
19
|
+
allFeaturesOf,
|
|
20
|
+
Containment,
|
|
21
|
+
Feature,
|
|
22
|
+
isUnresolvedReference,
|
|
23
|
+
Link,
|
|
24
|
+
Property,
|
|
25
|
+
Reference,
|
|
26
|
+
UnresolvedReference
|
|
27
|
+
} from "@lionweb/core"
|
|
19
28
|
import { asString, indentWith, Template } from "littoral-templates"
|
|
20
29
|
|
|
21
30
|
import { INodeBase } from "./base-types.js"
|
|
@@ -27,18 +36,21 @@ const prependWith = (template: Template, prefix: string): Template =>
|
|
|
27
36
|
prefix + asString(template)
|
|
28
37
|
|
|
29
38
|
|
|
30
|
-
type INodeBaseOrNotThere = INodeBase |
|
|
39
|
+
type INodeBaseOrNotThere = INodeBase | UnresolvedReference | undefined
|
|
31
40
|
|
|
32
41
|
const asINodeBases = (value: INodeBaseOrNotThere | INodeBaseOrNotThere[]): INodeBase[] => {
|
|
33
42
|
const isINodeBase = (value: INodeBaseOrNotThere): value is INodeBase =>
|
|
34
|
-
!(value ===
|
|
43
|
+
!(value === undefined || isUnresolvedReference(value))
|
|
35
44
|
|
|
36
45
|
if (Array.isArray(value)) {
|
|
37
46
|
return value
|
|
38
47
|
.filter((subValue) => isINodeBase(subValue))
|
|
39
48
|
.map((subValue) => subValue as INodeBase)
|
|
40
49
|
}
|
|
41
|
-
|
|
50
|
+
if (isINodeBase(value)) {
|
|
51
|
+
return [value]
|
|
52
|
+
}
|
|
53
|
+
return []
|
|
42
54
|
}
|
|
43
55
|
|
|
44
56
|
|
|
@@ -64,11 +76,12 @@ export const asTreeTextWith = (identificationFor: (node: INodeBase) => string):
|
|
|
64
76
|
})()
|
|
65
77
|
return `${feature.name} = ${displayValue}`
|
|
66
78
|
}
|
|
79
|
+
const nothing = `<${(feature as Link).multiple ? "none" : "not set"}>`
|
|
67
80
|
if (feature instanceof Containment) {
|
|
68
81
|
const valueManager = node.getContainmentValueManager(feature)
|
|
69
82
|
const children = asINodeBases(valueManager.getDirectly())
|
|
70
83
|
return [
|
|
71
|
-
`${feature.name}:${children.length === 0 ?
|
|
84
|
+
`${feature.name}:${children.length === 0 ? ` ${nothing}` : ""}`,
|
|
72
85
|
indent(children.map(asText))
|
|
73
86
|
]
|
|
74
87
|
}
|
|
@@ -76,7 +89,7 @@ export const asTreeTextWith = (identificationFor: (node: INodeBase) => string):
|
|
|
76
89
|
const valueManager= node.getReferenceValueManager(feature)
|
|
77
90
|
const references = asINodeBases(valueManager.getDirectly())
|
|
78
91
|
return [
|
|
79
|
-
`${feature.name} -> ${references.length === 0 ?
|
|
92
|
+
`${feature.name} -> ${references.length === 0 ? nothing : references.map(identificationFor).join(", ")}`
|
|
80
93
|
]
|
|
81
94
|
}
|
|
82
95
|
return `!!! can't handle feature ${feature.name} (of meta type ${feature.metaType()})`
|
|
@@ -19,12 +19,7 @@ import { MultiRef, Reference, SingleRef } from "@lionweb/core"
|
|
|
19
19
|
import { action, observable } from "mobx"
|
|
20
20
|
|
|
21
21
|
import { INodeBase } from "../base-types.js"
|
|
22
|
-
import {
|
|
23
|
-
EntryMovedInSameReferenceDelta,
|
|
24
|
-
ReferenceAddedDelta,
|
|
25
|
-
ReferenceChangedDelta,
|
|
26
|
-
ReferenceDeletedDelta
|
|
27
|
-
} from "../deltas/index.js"
|
|
22
|
+
import { CompositeDelta, ReferenceAddedDelta, ReferenceChangedDelta, ReferenceDeletedDelta } from "../deltas/index.js"
|
|
28
23
|
import { checkIndex, FeatureValueManager } from "./base.js"
|
|
29
24
|
|
|
30
25
|
|
|
@@ -219,7 +214,10 @@ export abstract class MultiReferenceValueManager<T extends INodeBase> extends Re
|
|
|
219
214
|
@action move(oldIndex: number, newIndex: number) {
|
|
220
215
|
const target = this.moveDirectly(oldIndex, newIndex);
|
|
221
216
|
if (target !== undefined) {
|
|
222
|
-
this.emitDelta(() => new
|
|
217
|
+
this.emitDelta(() => new CompositeDelta([
|
|
218
|
+
new ReferenceDeletedDelta(this.container, this.reference, oldIndex, target),
|
|
219
|
+
new ReferenceAddedDelta(this.container, this.reference, newIndex < oldIndex ? newIndex : newIndex - 1, target)
|
|
220
|
+
]));
|
|
223
221
|
}
|
|
224
222
|
}
|
|
225
223
|
|