@lionweb/class-core 0.8.0-beta.3 → 0.8.0-beta.4

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 (63) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/dist/deltas/appliers.d.ts.map +1 -1
  3. package/dist/deltas/appliers.js +6 -101
  4. package/dist/deltas/appliers.js.map +1 -1
  5. package/dist/deltas/inverters.d.ts.map +1 -1
  6. package/dist/deltas/inverters.js +1 -28
  7. package/dist/deltas/inverters.js.map +1 -1
  8. package/dist/deltas/serialization/deserializer.g.d.ts.map +1 -1
  9. package/dist/deltas/serialization/deserializer.g.js +1 -58
  10. package/dist/deltas/serialization/deserializer.g.js.map +1 -1
  11. package/dist/deltas/serialization/serializer.g.d.ts.map +1 -1
  12. package/dist/deltas/serialization/serializer.g.js +1 -70
  13. package/dist/deltas/serialization/serializer.g.js.map +1 -1
  14. package/dist/deltas/serialization/types.g.d.ts +6 -63
  15. package/dist/deltas/serialization/types.g.d.ts.map +1 -1
  16. package/dist/deltas/types.g.d.ts +0 -57
  17. package/dist/deltas/types.g.d.ts.map +1 -1
  18. package/dist/deltas/types.g.js +0 -63
  19. package/dist/deltas/types.g.js.map +1 -1
  20. package/dist/deserializer.d.ts +6 -4
  21. package/dist/deserializer.d.ts.map +1 -1
  22. package/dist/deserializer.js +16 -16
  23. package/dist/deserializer.js.map +1 -1
  24. package/dist/duplicator.d.ts.map +1 -1
  25. package/dist/duplicator.js +2 -2
  26. package/dist/duplicator.js.map +1 -1
  27. package/dist/id-mapping.d.ts +2 -2
  28. package/dist/id-mapping.d.ts.map +1 -1
  29. package/dist/id-mapping.js +4 -4
  30. package/dist/id-mapping.js.map +1 -1
  31. package/dist/index.d.ts +2 -2
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +1 -1
  34. package/dist/index.js.map +1 -1
  35. package/dist/references.d.ts +4 -4
  36. package/dist/references.d.ts.map +1 -1
  37. package/dist/references.js +3 -3
  38. package/dist/references.js.map +1 -1
  39. package/dist/serializer.d.ts +2 -2
  40. package/dist/serializer.d.ts.map +1 -1
  41. package/dist/serializer.js +30 -24
  42. package/dist/serializer.js.map +1 -1
  43. package/dist/textualizer.d.ts.map +1 -1
  44. package/dist/textualizer.js +9 -5
  45. package/dist/textualizer.js.map +1 -1
  46. package/dist/value-managers/references.d.ts.map +1 -1
  47. package/dist/value-managers/references.js +5 -2
  48. package/dist/value-managers/references.js.map +1 -1
  49. package/package.json +4 -4
  50. package/src/deltas/appliers.ts +5 -97
  51. package/src/deltas/inverters.ts +0 -33
  52. package/src/deltas/serialization/deserializer.g.ts +0 -63
  53. package/src/deltas/serialization/serializer.g.ts +0 -87
  54. package/src/deltas/serialization/types.g.ts +5 -74
  55. package/src/deltas/types.g.ts +0 -75
  56. package/src/deserializer.ts +23 -21
  57. package/src/duplicator.ts +12 -2
  58. package/src/id-mapping.ts +6 -6
  59. package/src/index.ts +2 -2
  60. package/src/references.ts +5 -5
  61. package/src/serializer.ts +32 -24
  62. package/src/textualizer.ts +19 -6
  63. 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
- nodeSerializer,
26
+ isUnresolvedReference,
27
27
  PrimitiveType,
28
28
  Property,
29
29
  PropertyValueSerializer,
30
30
  Reader,
31
31
  Reference,
32
- unresolved
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: (node: INodeBase) => {
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 = nodeSerializer(nodeBaseReader, { serializeEmptyFeatures: false });
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 {@link unresolved} and enumeration-typed properties the same way as {@link serializeNodeBases}.
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 === unresolved) {
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
  }
@@ -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 { allFeaturesOf, Containment, Feature, Property, Reference, unresolved } from "@lionweb/core"
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 | typeof unresolved | undefined
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 === unresolved || value === undefined)
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
- return isINodeBase(value) ? [value] : []
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 ? " <nothing>" : ""}`,
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 ? "<none>" : references.map(identificationFor).join(", ")}`
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 EntryMovedInSameReferenceDelta(this.container, this.reference, oldIndex, newIndex, target));
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