@lionweb/core 0.10.0-alpha.0 → 0.10.0-alpha.2

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 (44) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/dist/deserializer.d.ts.map +1 -1
  3. package/dist/deserializer.js +27 -22
  4. package/dist/deserializer.js.map +1 -1
  5. package/dist/functions.d.ts +18 -5
  6. package/dist/functions.d.ts.map +1 -1
  7. package/dist/functions.js +19 -4
  8. package/dist/functions.js.map +1 -1
  9. package/dist/m1/reference-utils.d.ts.map +1 -1
  10. package/dist/m1/reference-utils.js +0 -1
  11. package/dist/m1/reference-utils.js.map +1 -1
  12. package/dist/m3/builtins-common.js +3 -3
  13. package/dist/m3/builtins-common.js.map +1 -1
  14. package/dist/m3/constraints.d.ts +5 -0
  15. package/dist/m3/constraints.d.ts.map +1 -1
  16. package/dist/m3/constraints.js +1 -1
  17. package/dist/m3/constraints.js.map +1 -1
  18. package/dist/m3/functions.d.ts.map +1 -1
  19. package/dist/m3/functions.js.map +1 -1
  20. package/dist/m3/symbol-table.d.ts +1 -1
  21. package/dist/m3/types.d.ts.map +1 -1
  22. package/dist/m3/types.js +3 -3
  23. package/dist/m3/types.js.map +1 -1
  24. package/dist/m3/versions/v2023_1/builtins-legacy.js +3 -3
  25. package/dist/m3/versions/v2023_1/builtins-legacy.js.map +1 -1
  26. package/dist/references.d.ts +31 -8
  27. package/dist/references.d.ts.map +1 -1
  28. package/dist/references.js +41 -6
  29. package/dist/references.js.map +1 -1
  30. package/dist/serializer.d.ts.map +1 -1
  31. package/dist/serializer.js +25 -11
  32. package/dist/serializer.js.map +1 -1
  33. package/package.json +3 -3
  34. package/src/deserializer.ts +30 -27
  35. package/src/functions.ts +26 -7
  36. package/src/m1/reference-utils.ts +0 -1
  37. package/src/m3/builtins-common.ts +3 -3
  38. package/src/m3/constraints.ts +1 -1
  39. package/src/m3/functions.ts +1 -1
  40. package/src/m3/symbol-table.ts +1 -1
  41. package/src/m3/types.ts +3 -3
  42. package/src/m3/versions/v2023_1/builtins-legacy.ts +3 -3
  43. package/src/references.ts +46 -11
  44. package/src/serializer.ts +28 -13
package/src/references.ts CHANGED
@@ -1,42 +1,77 @@
1
+ import { LionWebId } from "@lionweb/json"
2
+ import { stringifyPropertiesOf } from "@lionweb/ts-utils"
3
+
1
4
  import { Node } from "./types.js"
5
+ import { INamed } from "./m3/index.js"
2
6
 
3
7
 
4
8
  /**
5
- * The `unresolved` symbol indicates a reference value which hasn't been resolved yet.
9
+ * The `unresolved` symbol indicates a reference value which hasn't been resolved yet.
6
10
  * It differs from an unset (`undefined`) value.
7
11
  * This value shouldn’t be manipulated/compared to directly!
12
+ *
13
+ * @deprecated Use {@link referenceToSet} or {@link UnresolvedReference} instead.
8
14
  */
9
15
  export const unresolved = null
10
16
 
17
+
11
18
  /**
12
- * Type for unresolved references.
19
+ * Representation of an unresolved reference.
20
+ * At most one of `targetId` or `resolveInfo` can be `undefined`.
21
+ *
22
+ * *Note* that this instance will **not** exhibit object equality,
23
+ * i.e.: the resolved target of an unresolved reference will be a different object!
13
24
  */
14
- export type UnresolvedReference = typeof unresolved
25
+ export class UnresolvedReference {
26
+ constructor(public readonly targetId?: LionWebId, public resolveInfo?: string) {}
27
+ toString = () =>
28
+ `unresolved reference to target:` + stringifyPropertiesOf(this, "targetId", "resolveInfo")
29
+ }
15
30
 
16
31
  /**
17
- * @return a value of {@link UnresolvedReference} that’s a placeholder for a yet-to-set reference.
32
+ * A singleton representing an unset reference that’s meant to be set,
33
+ * distinguishing that from a reference that’s intentionally not set
34
+ * — which can only happen if that reference is (defined as) optional.
18
35
  */
19
- export const referenceToSet = () =>
20
- unresolved
36
+ export const referenceToSet = Symbol("<unset reference>")
21
37
 
22
38
  /**
23
39
  * A type definition for a reference value that can be unresolved.
24
40
  * Note: this type is primarily meant to be used to type nodes’ properties,
25
41
  * but should be avoided as a return type for “auxiliary” functions.
26
42
  */
27
- export type SingleRef<NT extends Node> = NT | UnresolvedReference
43
+ export type SingleRef<NT extends Node> = NT | UnresolvedReference | typeof referenceToSet
28
44
 
29
45
  /**
30
- * @return whether a given (at most) single-valued reference actually refers to something.
46
+ * @return whether the given {@link UnresolvedReference} corresponds to an (explicitly-)unset (yet-to-set) reference.
31
47
  */
32
- export const isRef = <NT extends Node>(ref?: SingleRef<NT>): ref is NT =>
33
- ref !== undefined && ref !== unresolved
48
+ export const isReferenceToSet = <T extends Node>(ref?: SingleRef<T>): ref is typeof referenceToSet =>
49
+ ref === referenceToSet
34
50
 
35
51
  /**
36
52
  * Type function for the {@link UnresolvedReference} type.
37
53
  */
38
54
  export const isUnresolvedReference = <NT extends Node>(ref?: SingleRef<NT>): ref is UnresolvedReference =>
39
- ref === unresolved
55
+ ref instanceof UnresolvedReference
56
+
57
+ /**
58
+ * @return whether a given (at most) single-valued reference actually refers to something.
59
+ */
60
+ export const isRef = <NT extends Node>(ref?: SingleRef<NT>): ref is NT =>
61
+ ref !== undefined && !isReferenceToSet(ref) && !isUnresolvedReference(ref)
62
+
63
+ /**
64
+ * @return either the referenced node’s name, or the `resolveInfo` if the reference is unresolved, or `undefined`.
65
+ */
66
+ export const tryToRenderAsText = <T extends Node & INamed>(ref?: SingleRef<T>): string | undefined => {
67
+ if (ref === undefined || isReferenceToSet(ref)) {
68
+ return undefined
69
+ }
70
+ if (isUnresolvedReference(ref)) {
71
+ return ref.resolveInfo
72
+ }
73
+ return ref.name
74
+ }
40
75
 
41
76
 
42
77
  /**
package/src/serializer.ts CHANGED
@@ -1,7 +1,8 @@
1
- import { LionWebId, LionWebJsonChunk, LionWebJsonNode } from "@lionweb/json"
1
+ import { LionWebId, LionWebJsonChunk, LionWebJsonNode, LionWebJsonReferenceTarget } from "@lionweb/json"
2
2
  import { asArray, keepDefineds, lazyMapGet, Nested3Map, uniquesAmong } from "@lionweb/ts-utils"
3
- import { asIds, metaPointerFor } from "./functions.js"
3
+ import { asIds, metaPointerForFeature } from "./functions.js"
4
4
  import { Reader } from "./reading.js"
5
+ import { isRef, isReferenceToSet, SingleRef, UnresolvedReference } from "./references.js"
5
6
  import { Node } from "./types.js"
6
7
  import { inheritsDirectlyFrom } from "./m3/functions.js"
7
8
  import {
@@ -177,7 +178,7 @@ export const serializerWith = <NT extends Node, RT extends Node = NT>(configurat
177
178
  const value = reader.getFeatureValue(node, feature)
178
179
  const featureLanguage = feature.classifier.language
179
180
  registerLanguageUsed(featureLanguage)
180
- const featureMetaPointer = metaPointerFor(feature)
181
+ const featureMetaPointer = metaPointerForFeature(feature)
181
182
  if (feature instanceof Property) {
182
183
  if (value === undefined && !serializeEmptyFeatures) {
183
184
  // for immediate backward compatibility: skip empty property values regardless of options?.skipEmptyValues
@@ -206,8 +207,7 @@ export const serializerWith = <NT extends Node, RT extends Node = NT>(configurat
206
207
  }
207
208
  serializedNode.containments.push({
208
209
  containment: featureMetaPointer,
209
- children: keepDefineds(asIds(children))
210
- .map(childId => childId as string)
210
+ children: asIds(keepDefineds(children))
211
211
  })
212
212
  children.forEach(childOrNull => {
213
213
  if (childOrNull !== null) {
@@ -217,19 +217,34 @@ export const serializerWith = <NT extends Node, RT extends Node = NT>(configurat
217
217
  return
218
218
  }
219
219
  if (feature instanceof Reference) {
220
- // Note: value can be null === typeof unresolved, e.g. on an unset (or previously unresolved) single-valued reference
221
- const targets = asArray(value) as (RT | null)[]
220
+ const targets = (asArray(value) as SingleRef<RT>[]).filter((ref) => {
221
+ if (isRef(ref)) {
222
+ return true // (1) ref is a node, having an ID
223
+ }
224
+ if (isReferenceToSet(ref)) {
225
+ return false
226
+ }
227
+ return ref.targetId !== undefined || ref.resolveInfo !== undefined // (2) not both are undefined
228
+ }) as (RT | UnresolvedReference)[]
222
229
  if (targets.length === 0 && !serializeEmptyFeatures) {
223
230
  return
224
231
  }
225
232
  serializedNode.references.push({
226
233
  reference: featureMetaPointer,
227
- targets: keepDefineds(targets) // (skip "non-connected" targets)
228
- .map(t => ({
229
- resolveInfo:
230
- (reader.resolveInfoFor ? reader.resolveInfoFor(t, feature) : simpleNameDeducer(t, feature)) ?? null,
231
- reference: t.id
232
- }))
234
+ targets: targets
235
+ .map((t) =>
236
+ t instanceof UnresolvedReference
237
+ ? {
238
+ resolveInfo: t.resolveInfo ?? null,
239
+ reference: t.targetId ?? null
240
+ // at least one of these will be non-null <== (2)
241
+ } as LionWebJsonReferenceTarget
242
+ : {
243
+ resolveInfo: (reader.resolveInfoFor ? reader.resolveInfoFor(t, feature) : simpleNameDeducer(t, feature)) ?? null,
244
+ reference: t.id
245
+ // reference will be a non-null string (~(1))
246
+ }
247
+ )
233
248
  })
234
249
  return
235
250
  }