@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.
- package/CHANGELOG.md +17 -0
- package/dist/deserializer.d.ts.map +1 -1
- package/dist/deserializer.js +27 -22
- package/dist/deserializer.js.map +1 -1
- package/dist/functions.d.ts +18 -5
- package/dist/functions.d.ts.map +1 -1
- package/dist/functions.js +19 -4
- package/dist/functions.js.map +1 -1
- package/dist/m1/reference-utils.d.ts.map +1 -1
- package/dist/m1/reference-utils.js +0 -1
- package/dist/m1/reference-utils.js.map +1 -1
- package/dist/m3/builtins-common.js +3 -3
- package/dist/m3/builtins-common.js.map +1 -1
- package/dist/m3/constraints.d.ts +5 -0
- package/dist/m3/constraints.d.ts.map +1 -1
- package/dist/m3/constraints.js +1 -1
- package/dist/m3/constraints.js.map +1 -1
- package/dist/m3/functions.d.ts.map +1 -1
- package/dist/m3/functions.js.map +1 -1
- package/dist/m3/symbol-table.d.ts +1 -1
- package/dist/m3/types.d.ts.map +1 -1
- package/dist/m3/types.js +3 -3
- package/dist/m3/types.js.map +1 -1
- package/dist/m3/versions/v2023_1/builtins-legacy.js +3 -3
- package/dist/m3/versions/v2023_1/builtins-legacy.js.map +1 -1
- package/dist/references.d.ts +31 -8
- package/dist/references.d.ts.map +1 -1
- package/dist/references.js +41 -6
- package/dist/references.js.map +1 -1
- package/dist/serializer.d.ts.map +1 -1
- package/dist/serializer.js +25 -11
- package/dist/serializer.js.map +1 -1
- package/package.json +3 -3
- package/src/deserializer.ts +30 -27
- package/src/functions.ts +26 -7
- package/src/m1/reference-utils.ts +0 -1
- package/src/m3/builtins-common.ts +3 -3
- package/src/m3/constraints.ts +1 -1
- package/src/m3/functions.ts +1 -1
- package/src/m3/symbol-table.ts +1 -1
- package/src/m3/types.ts +3 -3
- package/src/m3/versions/v2023_1/builtins-legacy.ts +3 -3
- package/src/references.ts +46 -11
- 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
|
-
*
|
|
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
|
|
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
|
-
*
|
|
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
|
|
46
|
+
* @return whether the given {@link UnresolvedReference} corresponds to an (explicitly-)unset (yet-to-set) reference.
|
|
31
47
|
*/
|
|
32
|
-
export const
|
|
33
|
-
ref
|
|
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
|
|
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,
|
|
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 =
|
|
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(
|
|
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
|
-
|
|
221
|
-
|
|
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:
|
|
228
|
-
.map(t =>
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
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
|
}
|