@lionweb/core 0.8.0-beta.5 → 0.8.0-beta.7
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 +31 -5
- package/dist/deserializer.d.ts +10 -2
- package/dist/deserializer.d.ts.map +1 -1
- package/dist/deserializer.js +8 -7
- package/dist/deserializer.js.map +1 -1
- package/dist/dynamic-facade.d.ts +3 -3
- package/dist/dynamic-facade.d.ts.map +1 -1
- package/dist/dynamic-facade.js +4 -3
- package/dist/dynamic-facade.js.map +1 -1
- package/dist/extraction.d.ts +2 -2
- package/dist/extraction.d.ts.map +1 -1
- package/dist/extraction.js.map +1 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -1
- package/dist/index.js.map +1 -1
- package/dist/m1/reference-utils.d.ts +3 -3
- package/dist/m1/reference-utils.d.ts.map +1 -1
- package/dist/m1/reference-utils.js.map +1 -1
- package/dist/m3/builtins-common.d.ts +70 -0
- package/dist/m3/builtins-common.d.ts.map +1 -0
- package/dist/m3/builtins-common.js +88 -0
- package/dist/m3/builtins-common.js.map +1 -0
- package/dist/m3/builtins-function.d.ts +9 -0
- package/dist/m3/builtins-function.d.ts.map +1 -0
- package/dist/m3/builtins-function.js +19 -0
- package/dist/m3/builtins-function.js.map +1 -0
- package/dist/m3/deserializer.d.ts +25 -0
- package/dist/m3/deserializer.d.ts.map +1 -1
- package/dist/m3/deserializer.js +18 -11
- package/dist/m3/deserializer.js.map +1 -1
- package/dist/m3/index.d.ts +7 -3
- package/dist/m3/index.d.ts.map +1 -1
- package/dist/m3/index.js +6 -3
- package/dist/m3/index.js.map +1 -1
- package/dist/m3/lioncore-common.d.ts +37 -0
- package/dist/m3/lioncore-common.d.ts.map +1 -0
- package/dist/m3/lioncore-common.js +10 -0
- package/dist/m3/lioncore-common.js.map +1 -0
- package/dist/m3/reading-writing.d.ts +41 -0
- package/dist/m3/reading-writing.d.ts.map +1 -0
- package/dist/m3/reading-writing.js +84 -0
- package/dist/m3/reading-writing.js.map +1 -0
- package/dist/m3/serializer.d.ts +17 -0
- package/dist/m3/serializer.d.ts.map +1 -1
- package/dist/m3/serializer.js +11 -2
- package/dist/m3/serializer.js.map +1 -1
- package/dist/m3/symbol-table.d.ts +3 -3
- package/dist/m3/types.d.ts +11 -15
- package/dist/m3/types.d.ts.map +1 -1
- package/dist/m3/types.js +2 -6
- package/dist/m3/types.js.map +1 -1
- package/dist/m3/version.d.ts +19 -0
- package/dist/m3/version.d.ts.map +1 -0
- package/dist/m3/version.js +19 -0
- package/dist/m3/version.js.map +1 -0
- package/dist/m3/versions/v2023_1/builtins-legacy.d.ts +44 -0
- package/dist/m3/versions/v2023_1/builtins-legacy.d.ts.map +1 -0
- package/dist/m3/{builtins.js → versions/v2023_1/builtins-legacy.js} +24 -79
- package/dist/m3/versions/v2023_1/builtins-legacy.js.map +1 -0
- package/dist/m3/versions/v2023_1/builtins.d.ts +34 -0
- package/dist/m3/versions/v2023_1/builtins.d.ts.map +1 -0
- package/dist/m3/versions/v2023_1/builtins.js +75 -0
- package/dist/m3/versions/v2023_1/builtins.js.map +1 -0
- package/dist/m3/versions/v2023_1/lioncore.d.ts +34 -0
- package/dist/m3/versions/v2023_1/lioncore.d.ts.map +1 -0
- package/dist/m3/versions/v2023_1/lioncore.js +86 -0
- package/dist/m3/versions/v2023_1/lioncore.js.map +1 -0
- package/dist/m3/versions/v2023_1/version.d.ts +6 -0
- package/dist/m3/versions/v2023_1/version.d.ts.map +1 -0
- package/dist/m3/versions/v2023_1/version.js +8 -0
- package/dist/m3/versions/v2023_1/version.js.map +1 -0
- package/dist/m3/versions.d.ts +23 -0
- package/dist/m3/versions.d.ts.map +1 -0
- package/dist/m3/versions.js +24 -0
- package/dist/m3/versions.js.map +1 -0
- package/dist/reading.d.ts +10 -6
- package/dist/reading.d.ts.map +1 -1
- package/dist/serializer.d.ts +17 -6
- package/dist/serializer.d.ts.map +1 -1
- package/dist/serializer.js +4 -5
- package/dist/serializer.js.map +1 -1
- package/dist/writing.d.ts +3 -1
- package/dist/writing.d.ts.map +1 -1
- package/dist/writing.js.map +1 -1
- package/package.json +3 -3
- package/src/deserializer.ts +18 -14
- package/src/dynamic-facade.ts +4 -4
- package/src/extraction.ts +3 -3
- package/src/index.ts +0 -1
- package/src/m1/reference-utils.ts +6 -6
- package/src/m3/README.md +1 -1
- package/src/m3/builtins-common.ts +143 -0
- package/src/m3/builtins-function.ts +22 -0
- package/src/m3/deserializer.ts +43 -14
- package/src/m3/index.ts +7 -3
- package/src/m3/lioncore-common.ts +42 -0
- package/src/m3/reading-writing.ts +160 -0
- package/src/m3/serializer.ts +25 -2
- package/src/m3/symbol-table.ts +3 -3
- package/src/m3/types.ts +12 -18
- package/src/m3/version.ts +23 -0
- package/src/m3/versions/v2023_1/builtins-legacy.ts +126 -0
- package/src/m3/versions/v2023_1/builtins.ts +102 -0
- package/src/m3/{lioncore.ts → versions/v2023_1/lioncore.ts} +53 -76
- package/src/m3/versions/v2023_1/version.ts +9 -0
- package/src/m3/versions.ts +32 -0
- package/src/reading.ts +10 -6
- package/src/serializer.ts +26 -14
- package/src/writing.ts +3 -1
- package/dist/m3/builtins.d.ts +0 -82
- package/dist/m3/builtins.d.ts.map +0 -1
- package/dist/m3/builtins.js.map +0 -1
- package/dist/m3/facade.d.ts +0 -17
- package/dist/m3/facade.d.ts.map +0 -1
- package/dist/m3/facade.js +0 -58
- package/dist/m3/facade.js.map +0 -1
- package/dist/m3/lioncore.d.ts +0 -41
- package/dist/m3/lioncore.d.ts.map +0 -1
- package/dist/m3/lioncore.js +0 -90
- package/dist/m3/lioncore.js.map +0 -1
- package/dist/version.d.ts +0 -5
- package/dist/version.d.ts.map +0 -1
- package/dist/version.js +0 -5
- package/dist/version.js.map +0 -1
- package/src/m3/builtins.ts +0 -198
- package/src/m3/facade.ts +0 -130
- package/src/version.ts +0 -5
package/dist/serializer.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ import { LionWebJsonChunk } from "@lionweb/json";
|
|
|
2
2
|
import { Reader } from "./reading.js";
|
|
3
3
|
import { Node } from "./types.js";
|
|
4
4
|
import { Property } from "./m3/types.js";
|
|
5
|
+
import { LionWebVersion } from "./m3/version.js";
|
|
5
6
|
/**
|
|
6
7
|
* Type definition for functions that serializes nodes as a {@link LionWebJsonChunk serialization chunk}.
|
|
7
8
|
*/
|
|
@@ -14,6 +15,8 @@ export interface PropertyValueSerializer {
|
|
|
14
15
|
}
|
|
15
16
|
/**
|
|
16
17
|
* Misspelled alias of {@link PropertyValueSerializer}, kept for backward compatibility, and to be deprecated and removed later.
|
|
18
|
+
*
|
|
19
|
+
* @deprecated Use {@link PropertyValueSerializer} instead.
|
|
17
20
|
*/
|
|
18
21
|
export interface PrimitiveTypeSerializer extends PropertyValueSerializer {
|
|
19
22
|
}
|
|
@@ -29,11 +32,14 @@ export type SerializationOptions = Partial<{
|
|
|
29
32
|
serializeEmptyFeatures: boolean;
|
|
30
33
|
/**
|
|
31
34
|
* A {@link PropertyValueSerializer} implementation.
|
|
32
|
-
* Default = {@link
|
|
35
|
+
* Default = the value of the `propertyValueSerializer` property of the {@link LionWebVersion version} of the LionWeb serialization format,
|
|
36
|
+
* configured through `SerializerConfiguration.lionWebVersion` (which itself defaults to `LionWebVersions.v2023_1`).
|
|
33
37
|
*/
|
|
34
38
|
propertyValueSerializer: PropertyValueSerializer;
|
|
35
39
|
/**
|
|
36
40
|
* Misspelled alias of {@link #propertyValueSerializer}, kept for backward compatibility, and to be deprecated and removed later.
|
|
41
|
+
*
|
|
42
|
+
* @deprecated Use {@link propertyValueSerializer} instead.
|
|
37
43
|
*/
|
|
38
44
|
primitiveTypeSerializer: PropertyValueSerializer;
|
|
39
45
|
}>;
|
|
@@ -44,11 +50,16 @@ export type SerializationOptions = Partial<{
|
|
|
44
50
|
* and `primitiveTypeSerializer` (which is a legacy alias for `propertyValueSerializer`)
|
|
45
51
|
* properties are optional, with defined defaults.
|
|
46
52
|
*/
|
|
47
|
-
export type SerializerConfiguration<NT extends Node> = {
|
|
53
|
+
export type SerializerConfiguration<NT extends Node, RT extends Node = NT> = {
|
|
48
54
|
/**
|
|
49
55
|
* An interface with functions to “read” – i.e., introspect – nodes.
|
|
50
56
|
*/
|
|
51
|
-
reader: Reader<NT>;
|
|
57
|
+
reader: Reader<NT, RT>;
|
|
58
|
+
/**
|
|
59
|
+
* The version of the LionWeb serialization format to serialize in.
|
|
60
|
+
* Default = {@link LionWebVersions.v2023_1}.
|
|
61
|
+
*/
|
|
62
|
+
lionWebVersion?: LionWebVersion;
|
|
52
63
|
} & SerializationOptions;
|
|
53
64
|
/**
|
|
54
65
|
* @return a {@link Serializer} function that serializes the {@link Node nodes} passed to it,
|
|
@@ -57,15 +68,15 @@ export type SerializerConfiguration<NT extends Node> = {
|
|
|
57
68
|
*
|
|
58
69
|
* This is a legacy version of {@link serializerWith}, kept for backward compatibility, and to be deprecated and removed later.
|
|
59
70
|
*/
|
|
60
|
-
export declare const nodeSerializer: <NT extends Node>(reader: Reader<NT>, serializationOptions?: SerializationOptions) => Serializer<NT>;
|
|
71
|
+
export declare const nodeSerializer: <NT extends Node, RT extends Node = NT>(reader: Reader<NT, RT>, serializationOptions?: SerializationOptions) => Serializer<NT>;
|
|
61
72
|
/**
|
|
62
73
|
* @return a {@link Serializer} function that serializes the {@link Node nodes} passed to it,
|
|
63
74
|
* configured through a `configuration` {@link SerializerConfiguration} object.
|
|
64
75
|
*/
|
|
65
|
-
export declare const serializerWith: <NT extends Node>(configuration: SerializerConfiguration<NT>) => Serializer<NT>;
|
|
76
|
+
export declare const serializerWith: <NT extends Node, RT extends Node = NT>(configuration: SerializerConfiguration<NT, RT>) => Serializer<NT>;
|
|
66
77
|
/**
|
|
67
78
|
* @return a {@link LionWebJsonChunk} of the given model (i.e., an array of {@link Node nodes} - the first argument) to the LionWeb serialization JSON format.
|
|
68
79
|
* *Note:* this function will be deprecated and removed later — use {@link nodeSerializer} instead.
|
|
69
80
|
*/
|
|
70
|
-
export declare const serializeNodes: <NT extends Node>(nodes: NT[], reader: Reader<NT>, propertyValueSerializerOrOptions?: PropertyValueSerializer | SerializationOptions) => LionWebJsonChunk;
|
|
81
|
+
export declare const serializeNodes: <NT extends Node, RT extends Node = NT>(nodes: NT[], reader: Reader<NT, RT>, propertyValueSerializerOrOptions?: PropertyValueSerializer | SerializationOptions) => LionWebJsonChunk;
|
|
71
82
|
//# sourceMappingURL=serializer.d.ts.map
|
package/dist/serializer.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serializer.d.ts","sourceRoot":"","sources":["../src/serializer.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"serializer.d.ts","sourceRoot":"","sources":["../src/serializer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,gBAAgB,EAAmB,MAAM,eAAe,CAAA;AAG5E,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AAEjC,OAAO,EAOH,QAAQ,EAGX,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAIhD;;GAEG;AACH,MAAM,MAAM,UAAU,CAAC,EAAE,SAAS,IAAI,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,KAAK,gBAAgB,CAAA;AAG3E;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACpC,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,GAAG,MAAM,GAAG,IAAI,CAAA;CACpE;AAED;;;;GAIG;AACH,MAAM,WAAW,uBAAwB,SAAQ,uBAAuB;CAAG;AAQ3E;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAAG,OAAO,CAAC;IAEvC;;;;OAIG;IACH,sBAAsB,EAAE,OAAO,CAAA;IAE/B;;;;OAIG;IACH,uBAAuB,EAAE,uBAAuB,CAAA;IAEhD;;;;OAIG;IACH,uBAAuB,EAAE,uBAAuB,CAAA;CAEnD,CAAC,CAAA;AAGF;;;;;;GAMG;AACH,MAAM,MAAM,uBAAuB,CAAC,EAAE,SAAS,IAAI,EAAE,EAAE,SAAS,IAAI,GAAG,EAAE,IAAI;IACzE;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;IAEtB;;;OAGG;IACH,cAAc,CAAC,EAAE,cAAc,CAAA;CAClC,GAAG,oBAAoB,CAAA;AAGxB;;;;;;GAMG;AACH,eAAO,MAAM,cAAc,GAAI,EAAE,SAAS,IAAI,EAAE,EAAE,SAAS,IAAI,GAAG,EAAE,EAAE,QAAQ,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,uBAAuB,oBAAoB,KAAG,UAAU,CAAC,EAAE,CAClG,CAAA;AAGvD;;;GAGG;AACH,eAAO,MAAM,cAAc,GAAI,EAAE,SAAS,IAAI,EAAE,EAAE,SAAS,IAAI,GAAG,EAAE,EAAE,eAAe,uBAAuB,CAAC,EAAE,EAAE,EAAE,CAAC,KAAG,UAAU,CAAC,EAAE,CA4InI,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,cAAc,GAAI,EAAE,SAAS,IAAI,EAAE,EAAE,SAAS,IAAI,GAAG,EAAE,EAChE,OAAO,EAAE,EAAE,EACX,QAAQ,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,EACtB,mCAAmC,uBAAuB,GAAG,oBAAoB,KAClF,gBAQS,CAAA"}
|
package/dist/serializer.js
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
import { currentSerializationFormatVersion } from "@lionweb/json";
|
|
2
1
|
import { asArray, keepDefineds, lazyMapGet, uniquesAmong } from "@lionweb/ts-utils";
|
|
3
2
|
import { asIds, metaPointerFor } from "./functions.js";
|
|
4
|
-
import { builtinPropertyValueSerializer } from "./m3/builtins.js";
|
|
5
3
|
import { inheritsDirectlyFrom } from "./m3/functions.js";
|
|
6
4
|
import { Containment, Enumeration, PrimitiveType, Property, Reference, simpleNameDeducer } from "./m3/types.js";
|
|
5
|
+
import { LionWebVersions } from "./m3/versions.js";
|
|
7
6
|
const isPropertyValueSerializer = (value) => typeof value === "object" && value !== null && "serializeValue" in value && typeof value.serializeValue === "function";
|
|
8
7
|
/**
|
|
9
8
|
* @return a {@link Serializer} function that serializes the {@link Node nodes} passed to it,
|
|
@@ -19,7 +18,8 @@ export const nodeSerializer = (reader, serializationOptions) => serializerWith({
|
|
|
19
18
|
*/
|
|
20
19
|
export const serializerWith = (configuration) => {
|
|
21
20
|
const { reader } = configuration;
|
|
22
|
-
const
|
|
21
|
+
const lionWebVersion = configuration?.lionWebVersion ?? LionWebVersions.v2023_1;
|
|
22
|
+
const propertyValueSerializer = configuration.propertyValueSerializer ?? configuration.primitiveTypeSerializer ?? lionWebVersion.builtinsFacade.propertyValueSerializer;
|
|
23
23
|
const serializeEmptyFeatures = configuration.serializeEmptyFeatures ?? true;
|
|
24
24
|
const languageKey2version2classifierKey2allFeatures = {};
|
|
25
25
|
const memoisedAllFeaturesOf = (classifier) => lazyMapGet(lazyMapGet(lazyMapGet(languageKey2version2classifierKey2allFeatures, classifier.language.key, () => ({})), classifier.language.version, () => ({})), classifier.key, () => uniquesAmong(// make unique in case a feature was inherited from multiple super-classifiers
|
|
@@ -113,7 +113,6 @@ export const serializerWith = (configuration) => {
|
|
|
113
113
|
serializedNode.references.push({
|
|
114
114
|
reference: featureMetaPointer,
|
|
115
115
|
targets: keepDefineds(targets) // (skip "non-connected" targets)
|
|
116
|
-
.map(t => t)
|
|
117
116
|
.map(t => ({
|
|
118
117
|
resolveInfo: (reader.resolveInfoFor ? reader.resolveInfoFor(t, feature) : simpleNameDeducer(t, feature)) ?? null,
|
|
119
118
|
reference: t.id
|
|
@@ -129,7 +128,7 @@ export const serializerWith = (configuration) => {
|
|
|
129
128
|
};
|
|
130
129
|
nodes.forEach(node => visit(node, undefined));
|
|
131
130
|
return {
|
|
132
|
-
serializationFormatVersion:
|
|
131
|
+
serializationFormatVersion: lionWebVersion.serializationFormatVersion,
|
|
133
132
|
languages: languagesUsed.map(({ key, version }) => ({ key, version })),
|
|
134
133
|
nodes: serializedNodes
|
|
135
134
|
};
|
package/dist/serializer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serializer.js","sourceRoot":"","sources":["../src/serializer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"serializer.js","sourceRoot":"","sources":["../src/serializer.ts"],"names":[],"mappings":"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"}
|
package/dist/writing.d.ts
CHANGED
|
@@ -19,7 +19,7 @@ export interface Writer<NT extends Node, PNT extends Node = NT> {
|
|
|
19
19
|
}) => NT;
|
|
20
20
|
/**
|
|
21
21
|
* Sets the *single* given value of the indicated {@link Feature} on the given node.
|
|
22
|
-
* This means adding it in case the feature is multi-valued, meaning it is a {@link Link} with
|
|
22
|
+
* This means adding it in case the feature is multi-valued, meaning it is a {@link Link} with `multiple = true`.
|
|
23
23
|
*/
|
|
24
24
|
setFeatureValue: (node: NT, feature: Feature, value: unknown) => void;
|
|
25
25
|
/**
|
|
@@ -29,6 +29,8 @@ export interface Writer<NT extends Node, PNT extends Node = NT> {
|
|
|
29
29
|
}
|
|
30
30
|
/**
|
|
31
31
|
* Alias for {@link Writer}, kept for backward compatibility, and to be deprecated and removed later.
|
|
32
|
+
*
|
|
33
|
+
* @deprecated Use {@link Writer} instead.
|
|
32
34
|
*/
|
|
33
35
|
export interface InstantiationFacade<NT extends Node, PNT extends Node = NT> extends Writer<NT, PNT> {
|
|
34
36
|
}
|
package/dist/writing.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"writing.d.ts","sourceRoot":"","sources":["../src/writing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAErD,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,OAAO,EAAQ,MAAM,eAAe,CAAA;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AAGjC;;;;;;GAMG;AACH,MAAM,WAAW,MAAM,CAAC,EAAE,SAAS,IAAI,EAAE,GAAG,SAAS,IAAI,GAAG,EAAE;IAE1D;;;;OAIG;IACH,OAAO,EAAE,CAAC,MAAM,EAAE,GAAG,GAAG,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,EAAE,EAAE,SAAS,EAAE,gBAAgB,EAAE;QAAE,CAAC,WAAW,EAAE,UAAU,GAAG,OAAO,CAAA;KAAE,KAAK,EAAE,CAAA;IAGzI;;;OAGG;IACH,eAAe,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;IAGrE;;OAEG;IACH,UAAU,EAAE,CAAC,OAAO,EAAE,kBAAkB,KAAK,OAAO,CAAA;CAEvD;AAED
|
|
1
|
+
{"version":3,"file":"writing.d.ts","sourceRoot":"","sources":["../src/writing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAErD,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,OAAO,EAAQ,MAAM,eAAe,CAAA;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AAGjC;;;;;;GAMG;AACH,MAAM,WAAW,MAAM,CAAC,EAAE,SAAS,IAAI,EAAE,GAAG,SAAS,IAAI,GAAG,EAAE;IAE1D;;;;OAIG;IACH,OAAO,EAAE,CAAC,MAAM,EAAE,GAAG,GAAG,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,EAAE,EAAE,SAAS,EAAE,gBAAgB,EAAE;QAAE,CAAC,WAAW,EAAE,UAAU,GAAG,OAAO,CAAA;KAAE,KAAK,EAAE,CAAA;IAGzI;;;OAGG;IACH,eAAe,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;IAGrE;;OAEG;IACH,UAAU,EAAE,CAAC,OAAO,EAAE,kBAAkB,KAAK,OAAO,CAAA;CAEvD;AAED;;;;GAIG;AACH,MAAM,WAAW,mBAAmB,CAAC,EAAE,SAAS,IAAI,EAAE,GAAG,SAAS,IAAI,GAAG,EAAE,CAAE,SAAQ,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC;CAAG;AAGvG;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;AAqB3G;;;GAGG;AACH,eAAO,MAAM,uBAAuB,EAAE,eAAyC,CAAA;AAE/E;;;GAGG;AACH,eAAO,MAAM,sBAAsB,iBAAyB,CAAA"}
|
package/dist/writing.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"writing.js","sourceRoot":"","sources":["../src/writing.ts"],"names":[],"mappings":"AAEA,OAAO,EAA2C,IAAI,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"writing.js","sourceRoot":"","sources":["../src/writing.ts"],"names":[],"mappings":"AAEA,OAAO,EAA2C,IAAI,EAAE,MAAM,eAAe,CAAA;AAgD7E;;;;GAIG;AACH,MAAM,eAAe,GAAG,CAAC,OAAsB,EAAmB,EAAE,CAChE,CAAC,QAAiC,EAAE,OAAgB,EAAE,KAAc,EAAQ,EAAE;IAClF,8DAA8D;IACtD,MAAM,GAAG,GAAI,OAAe,CAAC,OAAO,CAAW,CAAA;IAC/C,IAAI,OAAO,YAAY,IAAI,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QAC9C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YAChC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,CAAA;QACtB,CAAC;QACA,QAAQ,CAAC,GAAG,CAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAC5C,CAAC;SAAM,CAAC;QACJ,QAAQ,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;IACzB,CAAC;AACL,CAAC,CAAA;AAEL;;;GAGG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAoB,eAAe,CAAC,MAAM,CAAC,CAAA;AAE/E;;;GAGG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,eAAe,CAAC,KAAK,CAAC,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lionweb/core",
|
|
3
|
-
"version": "0.8.0-beta.
|
|
3
|
+
"version": "0.8.0-beta.7",
|
|
4
4
|
"description": "LionWeb core for {Java|Type}Script",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
"release": "npm publish"
|
|
28
28
|
},
|
|
29
29
|
"dependencies": {
|
|
30
|
-
"@lionweb/json": "0.8.0-beta.
|
|
31
|
-
"@lionweb/ts-utils": "0.8.0-beta.
|
|
30
|
+
"@lionweb/json": "0.8.0-beta.7",
|
|
31
|
+
"@lionweb/ts-utils": "0.8.0-beta.7"
|
|
32
32
|
}
|
|
33
33
|
}
|
package/src/deserializer.ts
CHANGED
|
@@ -1,16 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
currentSerializationFormatVersion,
|
|
3
|
-
LionWebId,
|
|
4
|
-
LionWebJsonChunk,
|
|
5
|
-
LionWebJsonNode,
|
|
6
|
-
LionWebKey
|
|
7
|
-
} from "@lionweb/json"
|
|
1
|
+
import { LionWebId, LionWebJsonChunk, LionWebJsonNode, LionWebKey } from "@lionweb/json"
|
|
8
2
|
import { byIdMap, groupBy, keepDefineds } from "@lionweb/ts-utils"
|
|
9
3
|
import { Writer } from "./writing.js"
|
|
10
4
|
import { consoleProblemReporter, ProblemReporter } from "./reporter.js"
|
|
11
|
-
import { builtinPropertyValueDeserializer } from "./m3/builtins.js"
|
|
12
5
|
import { MemoisingSymbolTable } from "./m3/symbol-table.js"
|
|
13
6
|
import { Classifier, Containment, Enumeration, Language, PrimitiveType, Property, Reference } from "./m3/types.js"
|
|
7
|
+
import { LionWebVersion } from "./m3/version.js"
|
|
8
|
+
import { LionWebVersions } from "./m3/versions.js"
|
|
14
9
|
import { unresolved } from "./references.js"
|
|
15
10
|
import { Node } from "./types.js"
|
|
16
11
|
|
|
@@ -23,6 +18,8 @@ export interface PropertyValueDeserializer {
|
|
|
23
18
|
|
|
24
19
|
/**
|
|
25
20
|
* Misspelled alias of {@link PropertyValueDeserializer}, kept for backward compatibility, and to be deprecated and removed later.
|
|
21
|
+
*
|
|
22
|
+
* @deprecated Use {@link PropertyValueDeserializer} instead.
|
|
26
23
|
*/
|
|
27
24
|
export interface PrimitiveTypeDeserializer extends PropertyValueDeserializer {}
|
|
28
25
|
|
|
@@ -43,13 +40,18 @@ export type DeserializerConfiguration<NT extends Node> = {
|
|
|
43
40
|
* A {@link Writer} that is used to instantiate nodes (with classifiers coming from the `languages` property) and set values on them.
|
|
44
41
|
*/
|
|
45
42
|
writer: Writer<NT>,
|
|
43
|
+
/**
|
|
44
|
+
* The version of the LionWeb serialization format to deserialize from.
|
|
45
|
+
* Default = {@link LionWebVersions.v2023_1}.
|
|
46
|
+
*/
|
|
47
|
+
lionWebVersion?: LionWebVersion
|
|
46
48
|
/**
|
|
47
49
|
* An array of {@link Language languages} that the serialization chunk is expected to conform to.
|
|
48
50
|
*/
|
|
49
51
|
languages: Language[],
|
|
50
52
|
/**
|
|
51
53
|
* A deserializer for values of properties.
|
|
52
|
-
* Default:
|
|
54
|
+
* Default: `(lionWebVersion ?? LionWebVersions.v2023_1).builtinsFacade.propertyValueDeserializer`.
|
|
53
55
|
*/
|
|
54
56
|
propertyValueDeserializer?: PropertyValueDeserializer,
|
|
55
57
|
/**
|
|
@@ -70,14 +72,16 @@ export const deserializerWith = <NT extends Node>(configuration: DeserializerCon
|
|
|
70
72
|
const symbolTable = new MemoisingSymbolTable(configuration.languages)
|
|
71
73
|
const { writer } = configuration
|
|
72
74
|
|
|
73
|
-
const
|
|
75
|
+
const lionWebVersion = configuration?.lionWebVersion ?? LionWebVersions.v2023_1
|
|
76
|
+
const propertyValueDeserializer = configuration.propertyValueDeserializer ?? lionWebVersion.builtinsFacade.propertyValueDeserializer
|
|
74
77
|
const problemReporter = configuration.problemReporter ?? consoleProblemReporter
|
|
75
78
|
|
|
76
79
|
return (serializationChunk, dependentNodes = []) => {
|
|
77
80
|
|
|
78
|
-
|
|
81
|
+
const serializationFormatVersion = lionWebVersion.serializationFormatVersion
|
|
82
|
+
if (serializationChunk.serializationFormatVersion !== serializationFormatVersion) {
|
|
79
83
|
problemReporter.reportProblem(
|
|
80
|
-
`can't deserialize from serialization format other than version "${
|
|
84
|
+
`can't deserialize from serialization format other than version "${serializationFormatVersion}" - assuming that version`
|
|
81
85
|
)
|
|
82
86
|
}
|
|
83
87
|
|
|
@@ -260,7 +264,7 @@ export const deserializerWith = <NT extends Node>(configuration: DeserializerCon
|
|
|
260
264
|
* @param writer - a {@link Writer} that is used to instantiate nodes and set values on them
|
|
261
265
|
* @param languages - {@link Language languages} that the serialized model is expected to conform to
|
|
262
266
|
* @param dependentNodes - a collection of nodes from dependent models against which all references in the serialized model are supposed to resolve against
|
|
263
|
-
* @param propertyValueDeserializer - a deserializer for values of properties (by default
|
|
267
|
+
* @param propertyValueDeserializer - a deserializer for values of properties (by default `LionWebVersions.v2023_1.builtinsFacade.propertyValueDeserializer`)
|
|
264
268
|
* @param problemReporter - an object for reporting problems (by default a {@link consoleProblemReporter})
|
|
265
269
|
*
|
|
266
270
|
* This is a legacy variant of {@link deserializerWith}, kept for backward compatibility, and to be deprecated and removed later.
|
|
@@ -272,7 +276,7 @@ export const deserializeSerializationChunk = <NT extends Node>(
|
|
|
272
276
|
// TODO facades <--> languages, so it's weird that it looks split up like this
|
|
273
277
|
dependentNodes: Node[],
|
|
274
278
|
// TODO (#13) see if you can turn this into [nodes: Node[], writer: Writer<Node>][] after all
|
|
275
|
-
propertyValueDeserializer: PropertyValueDeserializer =
|
|
279
|
+
propertyValueDeserializer: PropertyValueDeserializer = LionWebVersions.v2023_1.builtinsFacade.propertyValueDeserializer,
|
|
276
280
|
problemReporter: ProblemReporter = consoleProblemReporter
|
|
277
281
|
): NT[] => deserializerWith({ writer, languages, propertyValueDeserializer, problemReporter: problemReporter })(serializationChunk, dependentNodes)
|
|
278
282
|
|
package/src/dynamic-facade.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { LionWebKey } from "@lionweb/json"
|
|
2
|
-
import {
|
|
3
|
-
import { Classifier } from "./m3/types.js"
|
|
2
|
+
import { Classifier, LionWebVersions } from "./m3/index.js"
|
|
4
3
|
import { Reader, ResolveInfoDeducer } from "./reading.js"
|
|
5
4
|
import { Node } from "./types.js"
|
|
6
5
|
import { updateSettingsKeyBased, Writer } from "./writing.js"
|
|
@@ -19,7 +18,7 @@ export type DynamicNode = Node & {
|
|
|
19
18
|
const propertyGetterFor = (key: LionWebKey): ResolveInfoDeducer<DynamicNode> =>
|
|
20
19
|
(node) =>
|
|
21
20
|
(key in node.settings && typeof node.settings[key] === "string")
|
|
22
|
-
? node.settings[key] as string
|
|
21
|
+
? node.settings[key] as string
|
|
23
22
|
: undefined
|
|
24
23
|
|
|
25
24
|
/**
|
|
@@ -33,7 +32,8 @@ export const dynamicReader: Reader<DynamicNode> = ({
|
|
|
33
32
|
enumerationLiteralFrom: (value, enumeration) =>
|
|
34
33
|
enumeration.literals.find(({key}) => key === value)
|
|
35
34
|
?? null, // (undefined -> null)
|
|
36
|
-
resolveInfoFor: propertyGetterFor(
|
|
35
|
+
resolveInfoFor: propertyGetterFor(LionWebVersions.v2023_1.builtinsFacade.features.inamed_name.key)
|
|
36
|
+
// TODO have this parametrized in the LionWeb version, instead of relying on keys not changing between versions
|
|
37
37
|
})
|
|
38
38
|
|
|
39
39
|
/**
|
package/src/extraction.ts
CHANGED
|
@@ -13,7 +13,7 @@ export type NodesExtractor<NT extends Node> = (node: NT) => NT[]
|
|
|
13
13
|
/**
|
|
14
14
|
* @return A function that extracts the children from a given node.
|
|
15
15
|
*/
|
|
16
|
-
export const childrenExtractorUsing = <NT extends Node>(reader: Reader<NT>): NodesExtractor<NT> =>
|
|
16
|
+
export const childrenExtractorUsing = <NT extends Node, RT extends Node = NT>(reader: Reader<NT, RT>): NodesExtractor<NT> =>
|
|
17
17
|
(node: NT): NT[] => [
|
|
18
18
|
...(allFeaturesOf(reader.classifierOf(node))
|
|
19
19
|
.filter(isContainment)
|
|
@@ -26,6 +26,6 @@ export const childrenExtractorUsing = <NT extends Node>(reader: Reader<NT>): Nod
|
|
|
26
26
|
/**
|
|
27
27
|
* @return a function that extracts *all* nodes from a given start node - usually a root node.
|
|
28
28
|
*/
|
|
29
|
-
export const nodesExtractorUsing = <NT extends Node>(reader: Reader<NT>): NodesExtractor<NT> =>
|
|
30
|
-
flatMapNonCyclingFollowing(trivialFlatMapper, childrenExtractorUsing<NT>(reader))
|
|
29
|
+
export const nodesExtractorUsing = <NT extends Node, RT extends Node = NT>(reader: Reader<NT, RT>): NodesExtractor<NT> =>
|
|
30
|
+
flatMapNonCyclingFollowing(trivialFlatMapper, childrenExtractorUsing<NT, RT>(reader))
|
|
31
31
|
|
package/src/index.ts
CHANGED
|
@@ -29,9 +29,9 @@ export class ReferenceValue<NT extends Node> {
|
|
|
29
29
|
* @param reader - a {@link Reader} to reflect on nodes.
|
|
30
30
|
* _Note_ that it's assumed that its {@link getFeatureValue} function doesn't throw.
|
|
31
31
|
*/
|
|
32
|
-
export const referenceValues = <NT extends Node>(
|
|
32
|
+
export const referenceValues = <NT extends Node, RT extends Node = NT>(
|
|
33
33
|
scope: NT[],
|
|
34
|
-
reader: Reader<NT>
|
|
34
|
+
reader: Reader<NT, RT>
|
|
35
35
|
): ReferenceValue<NT>[] => {
|
|
36
36
|
const visit = (sourceNode: NT, reference: Reference): ReferenceValue<NT>[] => {
|
|
37
37
|
if (reference.multiple) {
|
|
@@ -74,10 +74,10 @@ export const referenceValues = <NT extends Node>(
|
|
|
74
74
|
* @param reader - a {@link Reader} to reflect on nodes.
|
|
75
75
|
* _Note_ that it's assumed that its {@link getFeatureValue} function doesn't throw.
|
|
76
76
|
*/
|
|
77
|
-
export const incomingReferences = <NT extends Node>(
|
|
77
|
+
export const incomingReferences = <NT extends Node, RT extends Node = NT>(
|
|
78
78
|
targetNodeOrNodes: NT[] | NT,
|
|
79
79
|
scope: NT[],
|
|
80
|
-
reader: Reader<NT>
|
|
80
|
+
reader: Reader<NT, RT>
|
|
81
81
|
): ReferenceValue<NT>[] => {
|
|
82
82
|
const targetNodes = Array.isArray(targetNodeOrNodes) ? targetNodeOrNodes : [targetNodeOrNodes]
|
|
83
83
|
return referenceValues(scope, reader)
|
|
@@ -97,9 +97,9 @@ export const incomingReferences = <NT extends Node>(
|
|
|
97
97
|
* @param reader - a {@link Reader} to reflect on nodes.
|
|
98
98
|
* _Note_ that it's assumed that its {@link getFeatureValue} function doesn't throw.
|
|
99
99
|
*/
|
|
100
|
-
export const referencesToOutOfScopeNodes = <NT extends Node>(
|
|
100
|
+
export const referencesToOutOfScopeNodes = <NT extends Node, RT extends Node = NT>(
|
|
101
101
|
scope: NT[],
|
|
102
|
-
reader: Reader<NT>
|
|
102
|
+
reader: Reader<NT, RT>
|
|
103
103
|
): ReferenceValue<NT>[] =>
|
|
104
104
|
referenceValues(scope, reader)
|
|
105
105
|
.filter((referenceValue) => scope.indexOf(referenceValue.targetNode) === -1)
|
package/src/m3/README.md
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* [TypeScript type definitions](./types.ts)
|
|
7
7
|
* [Factory](./factory.ts) for conveniently creating M3 instances
|
|
8
8
|
* [Classifiers built in (`LionCore-builtins`) to LionCore](./builtins.ts)
|
|
9
|
-
* [
|
|
9
|
+
* [A reader and writer specific for M3 instances](reading-writing.ts)
|
|
10
10
|
* Persistence: [serializer](./serializer.ts) and [deserializer](./deserializer.ts)
|
|
11
11
|
* [Constraints checker](./constraints.ts)
|
|
12
12
|
* Convenience/helper [functions](./functions.ts) defined on M3 concepts
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { StringsMapper } from "@lionweb/ts-utils"
|
|
2
|
+
import { PropertyValueDeserializer } from "../deserializer.js"
|
|
3
|
+
import { Concept, DataType, Interface, Language, PrimitiveType, Property } from "./types.js"
|
|
4
|
+
import { isUnresolvedReference } from "../references.js"
|
|
5
|
+
import { PropertyValueSerializer } from "../serializer.js"
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Determines whether two data types should be structurally equal based on equality of: meta type, key, and language's key.
|
|
10
|
+
*/
|
|
11
|
+
export const shouldBeIdentical = (left: DataType, right: DataType): boolean =>
|
|
12
|
+
left.key === right.key && left.language.key === right.language.key && left.metaType() === right.metaType()
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
const lookupFrom = <T>(registry: Map<DataType, T>) =>
|
|
16
|
+
(targetDataType: DataType) => {
|
|
17
|
+
for (const [dataType, t] of registry.entries()) {
|
|
18
|
+
if (shouldBeIdentical(targetDataType, dataType)) {
|
|
19
|
+
return t
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return undefined
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Type def. for functions that deserialize the value of a property of a specific type.
|
|
28
|
+
*/
|
|
29
|
+
export type PropertyValueDeserializerFunction = (value: string) => unknown
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* @return an empty registry for populating fluently using
|
|
33
|
+
* `.set(<data type>, <deserializer function>)`,
|
|
34
|
+
* to pass to {@link propertyValueDeserializerFrom}.
|
|
35
|
+
*/
|
|
36
|
+
export const newPropertyValueDeserializerRegistry = () => new Map<DataType, PropertyValueDeserializerFunction>
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* @return an instance of a {@link PropertyValueDeserializer} entirely driven by the passed `registry`.
|
|
40
|
+
*/
|
|
41
|
+
export const propertyValueDeserializerFrom = (registry: Map<DataType, PropertyValueDeserializerFunction>): PropertyValueDeserializer => {
|
|
42
|
+
const byType = lookupFrom(registry)
|
|
43
|
+
return {
|
|
44
|
+
deserializeValue: (value: string | undefined, property: Property): unknown | undefined => {
|
|
45
|
+
if (value === undefined) {
|
|
46
|
+
if (property.optional) {
|
|
47
|
+
return undefined
|
|
48
|
+
}
|
|
49
|
+
throw new Error(`can't deserialize undefined as the value of required property "${property.name}" (on classifier "${property.classifier.name}" in language "${property.classifier.language.name}")`)
|
|
50
|
+
}
|
|
51
|
+
const { type } = property
|
|
52
|
+
if (isUnresolvedReference(type)) {
|
|
53
|
+
throw new Error(`can't deserialize property "${property.name}" (on classifier "${property.classifier.name}" in language "${property.classifier.language.name}") with unspecified type`)
|
|
54
|
+
}
|
|
55
|
+
const specificDeserializer = byType(type)
|
|
56
|
+
if (specificDeserializer != undefined) {
|
|
57
|
+
return specificDeserializer(value)
|
|
58
|
+
} else {
|
|
59
|
+
throw new Error(`can't deserialize value of property "${property.name}" (on classifier "${property.classifier.name}" in language "${property.classifier.language.name}") of type "${type!.name}": ${value}`)
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Type def. for functions that serialize the value of a property of a specific type.
|
|
68
|
+
*/
|
|
69
|
+
export type PropertyValueSerializerFunction = (value: unknown) => string
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* @return an empty registry for populating fluently using
|
|
73
|
+
* `.set(<data type>, <serializer function>)`,
|
|
74
|
+
* to pass to {@link propertyValueSerializerFrom}.
|
|
75
|
+
*/
|
|
76
|
+
export const newPropertyValueSerializerRegistry = () => new Map<DataType, PropertyValueSerializerFunction>
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* @return an instance of a {@link PropertyValueSerializer} entirely driven by the passed `registry`.
|
|
80
|
+
*/
|
|
81
|
+
export const propertyValueSerializerFrom = (registry: Map<DataType, PropertyValueSerializerFunction>): PropertyValueSerializer => {
|
|
82
|
+
const byType = lookupFrom(registry)
|
|
83
|
+
return {
|
|
84
|
+
serializeValue: (value: unknown | undefined, property: Property): string | null => {
|
|
85
|
+
if (value === undefined) {
|
|
86
|
+
if (property.optional) {
|
|
87
|
+
return null
|
|
88
|
+
}
|
|
89
|
+
throw new Error(`can't serialize undefined as the value of required property "${property.name}" (on classifier "${property.classifier.name}" in language "${property.classifier.language.name}")`)
|
|
90
|
+
}
|
|
91
|
+
const { type } = property
|
|
92
|
+
if (isUnresolvedReference(type)) {
|
|
93
|
+
throw new Error(`can't serialize property "${property.name}" (on classifier "${property.classifier.name}" in language "${property.classifier.language.name}") with unspecified type`)
|
|
94
|
+
}
|
|
95
|
+
const specificSerializer = byType(type)
|
|
96
|
+
if (specificSerializer != undefined) {
|
|
97
|
+
return specificSerializer(value)
|
|
98
|
+
} else {
|
|
99
|
+
throw new Error(`can't serialize value of property "${property.name}" (on classifier "${property.classifier.name}" in language "${property.classifier.language.name}") of type "${type!.name}": ${value}`)
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* The key of the LionCore language containing the built-ins.
|
|
108
|
+
*/
|
|
109
|
+
export const lioncoreBuiltinsKey = "LionCore-builtins"
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* A function that generates IDs and keys for entities in the LionCore built-ins language.
|
|
113
|
+
*/
|
|
114
|
+
export const lioncoreBuiltinsIdAndKeyGenerator: StringsMapper = (...names) =>
|
|
115
|
+
[lioncoreBuiltinsKey, ...names.slice(1)].join("-")
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Type def. for objects that façade (a version of) the LionCore built-ins.
|
|
120
|
+
*/
|
|
121
|
+
export type LionCoreBuiltinsFacade = {
|
|
122
|
+
language: Language
|
|
123
|
+
/** The default {@link PropertyValueDeserializer}. */
|
|
124
|
+
propertyValueDeserializer: PropertyValueDeserializer
|
|
125
|
+
/** The default {@link PropertyValueSerializer}. */
|
|
126
|
+
propertyValueSerializer: PropertyValueSerializer
|
|
127
|
+
classifiers: {
|
|
128
|
+
node: Concept
|
|
129
|
+
inamed: Interface
|
|
130
|
+
}
|
|
131
|
+
features: {
|
|
132
|
+
inamed_name: Property
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* The built-in primitive types: boolean, integer, string + legacy (in the `Record<...>` part).
|
|
136
|
+
*/
|
|
137
|
+
primitiveTypes: {
|
|
138
|
+
booleanDataType: PrimitiveType
|
|
139
|
+
integerDataType: PrimitiveType
|
|
140
|
+
stringDataType: PrimitiveType
|
|
141
|
+
} & Record<string, PrimitiveType>
|
|
142
|
+
}
|
|
143
|
+
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Classifier, Concept } from "./types.js"
|
|
2
|
+
import { LionWebVersion } from "./version.js"
|
|
3
|
+
import { LionWebVersions } from "./versions.js"
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* @return whether the given {@link Classifier} is the built-in `Node` {@link Concept}
|
|
7
|
+
* of *any* version of the LionCore builtins language,
|
|
8
|
+
* or of the version belonging to the designated {@link LionWebVersion}.
|
|
9
|
+
*/
|
|
10
|
+
export const isBuiltinNodeConcept = (classifier: Classifier, lionWebVersion?: LionWebVersion): boolean => {
|
|
11
|
+
const { builtinsFacade } = lionWebVersion ?? LionWebVersions.v2023_1
|
|
12
|
+
return classifier instanceof Concept
|
|
13
|
+
&& (classifier as Concept).abstract
|
|
14
|
+
&& classifier.language.key === builtinsFacade.language.key
|
|
15
|
+
&& (lionWebVersion === undefined || classifier.language.version === builtinsFacade.language.version)
|
|
16
|
+
&& classifier.key === builtinsFacade.classifiers.node.key
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/*
|
|
20
|
+
* NOTE: this function has to be defined in a separate file to avoid circular loading dependencies!
|
|
21
|
+
*/
|
|
22
|
+
|
package/src/m3/deserializer.ts
CHANGED
|
@@ -2,10 +2,43 @@ import { LionWebJsonChunk } from "@lionweb/json"
|
|
|
2
2
|
import { deserializerWith } from "../deserializer.js"
|
|
3
3
|
import { nodesExtractorUsing } from "../extraction.js"
|
|
4
4
|
import { consoleProblemReporter, ProblemReporter } from "../reporter.js"
|
|
5
|
-
import {
|
|
6
|
-
import { lioncoreReader, lioncoreWriter } from "./facade.js"
|
|
7
|
-
import { lioncore } from "./lioncore.js"
|
|
5
|
+
import { lioncoreReaderFor, lioncoreWriterFor } from "./reading-writing.js"
|
|
8
6
|
import { Language } from "./types.js"
|
|
7
|
+
import { LionWebVersion } from "./version.js"
|
|
8
|
+
import { LionWebVersions } from "./versions.js"
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Type def. for objects that contain all necessary data to deserialize one or more languages from a {@link LionWebJsonChunk serialization chunk}.
|
|
13
|
+
*/
|
|
14
|
+
export type LanguageDeserializationData = {
|
|
15
|
+
serializationChunk: LionWebJsonChunk
|
|
16
|
+
/**
|
|
17
|
+
* The version of the LionWeb serialization format to deserialize from.
|
|
18
|
+
* Default = {@link LionWebVersions.v2023_1}.
|
|
19
|
+
*/
|
|
20
|
+
lionWebVersion?: LionWebVersion
|
|
21
|
+
dependentLanguages?: Language[]
|
|
22
|
+
/**
|
|
23
|
+
* Default = {@link consoleProblemReporter}.
|
|
24
|
+
*/
|
|
25
|
+
problemReporter?: ProblemReporter
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* @return languages serialized to the {@link LionWebJsonChunk serialization chunk} passed in the {@link LanguageDeserializationData data object}.
|
|
30
|
+
*/
|
|
31
|
+
export const deserializeLanguagesFrom = ({serializationChunk, dependentLanguages, problemReporter, lionWebVersion = LionWebVersions.v2023_1}: LanguageDeserializationData): Language[] =>
|
|
32
|
+
deserializerWith({
|
|
33
|
+
writer: lioncoreWriterFor(lionWebVersion),
|
|
34
|
+
languages: [lionWebVersion.lioncoreFacade.language, ...(dependentLanguages ?? [])],
|
|
35
|
+
problemReporter: problemReporter ?? consoleProblemReporter
|
|
36
|
+
})(
|
|
37
|
+
serializationChunk,
|
|
38
|
+
[lionWebVersion.builtinsFacade.language, ...(dependentLanguages ?? [])].flatMap(nodesExtractorUsing(lioncoreReaderFor(lionWebVersion))),
|
|
39
|
+
)
|
|
40
|
+
.filter((rootNode) => rootNode instanceof Language)
|
|
41
|
+
.map((language) => (language as Language).dependingOn(...(dependentLanguages ?? [])))
|
|
9
42
|
|
|
10
43
|
|
|
11
44
|
/**
|
|
@@ -13,31 +46,27 @@ import { Language } from "./types.js"
|
|
|
13
46
|
* as an instance of the LionCore metametamodel, using {@link _M3Concept these type definitions}.
|
|
14
47
|
*/
|
|
15
48
|
export const deserializeLanguages = (serializationChunk: LionWebJsonChunk, ...dependentLanguages: Language[]): Language[] =>
|
|
16
|
-
|
|
49
|
+
deserializeLanguagesFrom({ serializationChunk, dependentLanguages })
|
|
50
|
+
|
|
17
51
|
|
|
18
52
|
/**
|
|
19
53
|
* Deserializes languages that have been serialized into the LionWeb serialization JSON format
|
|
20
54
|
* as an instance of the LionCore metametamodel, using {@link _M3Concept these type definitions}.
|
|
21
55
|
* This function takes a {@link ProblemReporter} to be able to see what problems occurred.
|
|
56
|
+
*
|
|
57
|
+
* @deprecated Use {@link deserializeLanguagesFrom} instead.
|
|
22
58
|
*/
|
|
23
59
|
export const deserializeLanguagesWithReporter = (
|
|
24
60
|
serializationChunk: LionWebJsonChunk,
|
|
25
61
|
problemReporter: ProblemReporter,
|
|
26
62
|
...dependentLanguages: Language[]
|
|
27
63
|
): Language[] =>
|
|
28
|
-
|
|
29
|
-
writer: lioncoreWriter,
|
|
30
|
-
languages: [lioncore, ...dependentLanguages],
|
|
31
|
-
problemReporter: problemReporter
|
|
32
|
-
})(
|
|
33
|
-
serializationChunk,
|
|
34
|
-
[lioncoreBuiltins, ...dependentLanguages].flatMap(nodesExtractorUsing(lioncoreReader)),
|
|
35
|
-
)
|
|
36
|
-
.filter((rootNode) => rootNode instanceof Language)
|
|
37
|
-
.map((language) => (language as Language).dependingOn(...dependentLanguages))
|
|
64
|
+
deserializeLanguagesFrom({ serializationChunk, problemReporter, dependentLanguages })
|
|
38
65
|
|
|
39
66
|
/**
|
|
40
67
|
* Legacy alias for {@link deserializeLanguagesWithReporter}, kept for backward compatibility, and to be deprecated and removed later.
|
|
68
|
+
*
|
|
69
|
+
* @deprecated Use {@link deserializeLanguagesFrom} instead.
|
|
41
70
|
*/
|
|
42
71
|
export const deserializeLanguagesWithHandler = deserializeLanguagesWithReporter
|
|
43
72
|
|