@lionweb/core 0.7.0-beta.17 → 0.7.0-beta.19
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 +4 -1
- package/dist/deserializer.d.ts.map +1 -1
- package/dist/deserializer.js +1 -1
- package/dist/deserializer.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/m3/feature-resolvers.d.ts +23 -0
- package/dist/m3/feature-resolvers.d.ts.map +1 -0
- package/dist/m3/feature-resolvers.js +32 -0
- package/dist/m3/feature-resolvers.js.map +1 -0
- package/dist/m3/index.d.ts +2 -0
- package/dist/m3/index.d.ts.map +1 -1
- package/dist/m3/index.js +2 -0
- package/dist/m3/index.js.map +1 -1
- package/dist/{symbol-table.d.ts → m3/symbol-table.d.ts} +1 -1
- package/dist/m3/symbol-table.d.ts.map +1 -0
- package/dist/{symbol-table.js → m3/symbol-table.js} +2 -2
- package/dist/m3/symbol-table.js.map +1 -0
- package/package.json +3 -3
- package/src/deserializer.ts +224 -0
- package/src/dynamic-facade.ts +63 -0
- package/src/extraction.ts +31 -0
- package/src/functions.ts +28 -0
- package/src/handler.ts +57 -0
- package/src/index.ts +13 -0
- package/src/m1/reference-utils.ts +106 -0
- package/src/m3/README.md +16 -0
- package/src/m3/builtins.ts +170 -0
- package/src/m3/constraints.ts +109 -0
- package/src/m3/deserializer.ts +38 -0
- package/src/m3/facade.ts +130 -0
- package/src/m3/factory.ts +98 -0
- package/src/m3/feature-resolvers.ts +55 -0
- package/src/m3/functions.ts +379 -0
- package/src/m3/index.ts +12 -0
- package/src/m3/lioncore.ts +139 -0
- package/src/m3/reference-checker.ts +38 -0
- package/src/m3/serializer.ts +13 -0
- package/src/m3/symbol-table.ts +119 -0
- package/src/m3/types.ts +325 -0
- package/src/reading.ts +55 -0
- package/src/references.ts +31 -0
- package/src/serializer.ts +244 -0
- package/src/types.ts +11 -0
- package/src/version.ts +5 -0
- package/src/writing.ts +79 -0
- package/dist/symbol-table.d.ts.map +0 -1
- package/dist/symbol-table.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -30,7 +30,10 @@
|
|
|
30
30
|
* Improve performance of `deserializeSerializationChunk` function ever so slightly.
|
|
31
31
|
* Remove the unused (and non-performant) `NaiveSymbolTable` class.
|
|
32
32
|
* Improve performance of `nodeSerializer` function a tiny bit.
|
|
33
|
-
|
|
33
|
+
* Fix a bug where some features’ values are serialized multiple times.
|
|
34
|
+
* Expose feature resolution, through the `featureResolversFor` function (and associated types), which performs proper checking.
|
|
35
|
+
This avoids undebuggable `undefined` dereferencing at runtime in `deltaDeserializer` and `eventToDeltaTranslator` functions.
|
|
36
|
+
* Package `src/` again (— i.e., don't ignore for NPM packaging.)
|
|
34
37
|
|
|
35
38
|
|
|
36
39
|
## 0.6.12
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deserializer.d.ts","sourceRoot":"","sources":["../src/deserializer.ts"],"names":[],"mappings":"AAAA,OAAO,EAGH,gBAAgB,EAGnB,MAAM,eAAe,CAAA;AAEtB,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AACrC,OAAO,EAA4B,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAC1E,OAAO,EAAE,gCAAgC,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"deserializer.d.ts","sourceRoot":"","sources":["../src/deserializer.ts"],"names":[],"mappings":"AAAA,OAAO,EAGH,gBAAgB,EAGnB,MAAM,eAAe,CAAA;AAEtB,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AACrC,OAAO,EAA4B,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAC1E,OAAO,EAAE,gCAAgC,EAAE,MAAM,kBAAkB,CAAA;AAEnE,OAAO,EAAwC,QAAQ,EAAiB,QAAQ,EAAa,MAAM,eAAe,CAAA;AAElH,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AAEjC;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACtC,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAA;CACvF;AAED;;GAEG;AACH,MAAM,WAAW,yBAA0B,SAAQ,yBAAyB;CAAG;AAE/E;;;;;;;;;GASG;AACH,eAAO,MAAM,6BAA6B,GAAI,EAAE,SAAS,IAAI,EACzD,oBAAoB,gBAAgB,EACpC,QAAQ,MAAM,CAAC,EAAE,CAAC,EAClB,WAAW,QAAQ,EAAE,EAErB,gBAAgB,IAAI,EAAE,EAEtB,4BAA2B,gCAAyE,EACpG,iBAAgB,iBAA4C,KAC7D,EAAE,EA2KJ,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,gBAAgB,GAzLiB,EAAE,SAAS,IAAI,sBACrC,gBAAgB,UAC5B,MAAM,CAAC,EAAE,CAAC,aACP,QAAQ,EAAE,kBAEL,IAAI,EAAE,8BAEK,gCAAgC,mBAC3C,iBAAiB,KAClC,EAAE,EAgLwD,CAAA"}
|
package/dist/deserializer.js
CHANGED
|
@@ -2,9 +2,9 @@ import { currentSerializationFormatVersion } from "@lionweb/json";
|
|
|
2
2
|
import { byIdMap, groupBy, keepDefineds } from "@lionweb/ts-utils";
|
|
3
3
|
import { defaultSimplisticHandler } from "./handler.js";
|
|
4
4
|
import { BuiltinPropertyValueDeserializer } from "./m3/builtins.js";
|
|
5
|
+
import { MemoisingSymbolTable } from "./m3/symbol-table.js";
|
|
5
6
|
import { Classifier, Containment, Enumeration, PrimitiveType, Property, Reference } from "./m3/types.js";
|
|
6
7
|
import { unresolved } from "./references.js";
|
|
7
|
-
import { MemoisingSymbolTable } from "./symbol-table.js";
|
|
8
8
|
/**
|
|
9
9
|
* @return a deserialization of a {@link LionWebJsonChunk}
|
|
10
10
|
*
|
package/dist/deserializer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deserializer.js","sourceRoot":"","sources":["../src/deserializer.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,iCAAiC,EAKpC,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAElE,OAAO,EAAE,wBAAwB,EAAqB,MAAM,cAAc,CAAA;AAC1E,OAAO,EAAE,gCAAgC,EAAE,MAAM,kBAAkB,CAAA;AACnE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAY,aAAa,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAClH,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"deserializer.js","sourceRoot":"","sources":["../src/deserializer.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAA;AACjC,cAAc,qBAAqB,CAAA;AACnC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,cAAc,CAAA;AAC5B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,cAAc,CAAA;AAC5B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAA;AACjC,cAAc,qBAAqB,CAAA;AACnC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,cAAc,CAAA;AAC5B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,cAAc,CAAA;AAC5B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,YAAY,CAAA;AAC1B,cAAc,cAAc,CAAA;AAC5B,cAAc,cAAc,CAAA;AAC5B,cAAc,yBAAyB,CAAA;AACvC,cAAc,eAAe,CAAA"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAA;AACjC,cAAc,qBAAqB,CAAA;AACnC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,cAAc,CAAA;AAC5B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,cAAc,CAAA;AAC5B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAA;AACjC,cAAc,qBAAqB,CAAA;AACnC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,cAAc,CAAA;AAC5B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,cAAc,CAAA;AAC5B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,YAAY,CAAA;AAC1B,cAAc,cAAc,CAAA;AAC5B,cAAc,cAAc,CAAA;AAC5B,cAAc,yBAAyB,CAAA;AACvC,cAAc,eAAe,CAAA"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { LionWebJsonMetaPointer } from "@lionweb/json";
|
|
2
|
+
import { Classifier, Containment, Feature, Language, Property, Reference } from "./types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Type def. for functions that resolve a {@link Feature feature} of the indicated sub-type
|
|
5
|
+
* from a feature's and a classifier's meta-pointers,
|
|
6
|
+
* throwing an {@link Error error} when the feature couldn't be resolved,
|
|
7
|
+
* or it isn't of the expected sub-type.
|
|
8
|
+
*/
|
|
9
|
+
export type FeatureResolver<FT extends Feature> = (metaPointer: LionWebJsonMetaPointer, classifier: Classifier) => FT;
|
|
10
|
+
/**
|
|
11
|
+
* Type def. for an object containing {@link FeatureResolver resolvers} for
|
|
12
|
+
* {@link Property properties}, {@link Containmnent containments}, and {@link Reference references}.
|
|
13
|
+
*/
|
|
14
|
+
export type FeatureResolvers = {
|
|
15
|
+
resolvedPropertyFrom: FeatureResolver<Property>;
|
|
16
|
+
resolvedContainmentFrom: FeatureResolver<Containment>;
|
|
17
|
+
resolvedReferenceFrom: FeatureResolver<Reference>;
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* @return an {@link FeatureResolvers object} for the given {@link Language languages}.
|
|
21
|
+
*/
|
|
22
|
+
export declare const featureResolversFor: (languages: Language[]) => FeatureResolvers;
|
|
23
|
+
//# sourceMappingURL=feature-resolvers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feature-resolvers.d.ts","sourceRoot":"","sources":["../../src/m3/feature-resolvers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAA;AAEtD,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAI5F;;;;;GAKG;AACH,MAAM,MAAM,eAAe,CAAC,EAAE,SAAS,OAAO,IAAI,CAAC,WAAW,EAAE,sBAAsB,EAAE,UAAU,EAAE,UAAU,KAAK,EAAE,CAAA;AAErH;;;GAGG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC3B,oBAAoB,EAAE,eAAe,CAAC,QAAQ,CAAC,CAAA;IAC/C,uBAAuB,EAAE,eAAe,CAAC,WAAW,CAAC,CAAA;IACrD,qBAAqB,EAAE,eAAe,CAAC,SAAS,CAAC,CAAA;CACpD,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,mBAAmB,GAAI,WAAW,QAAQ,EAAE,KAAG,gBA0B3D,CAAA"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { Containment, Property, Reference } from "./types.js";
|
|
2
|
+
import { MemoisingSymbolTable } from "./symbol-table.js";
|
|
3
|
+
/**
|
|
4
|
+
* @return an {@link FeatureResolvers object} for the given {@link Language languages}.
|
|
5
|
+
*/
|
|
6
|
+
export const featureResolversFor = (languages) => {
|
|
7
|
+
const symbolTable = new MemoisingSymbolTable(languages);
|
|
8
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
9
|
+
const featureResolverFor = (featureClassConstructor) => (featureMetaPointer, classifier) => {
|
|
10
|
+
const classifierMetaPointer = classifier.metaPointer();
|
|
11
|
+
const featureLocationMessage = () => `feature with meta-pointer ${JSON.stringify(featureMetaPointer)} on classifier with meta-pointer ${JSON.stringify(classifierMetaPointer)}`;
|
|
12
|
+
const feature = symbolTable.featureMatching(classifierMetaPointer, featureMetaPointer);
|
|
13
|
+
if (feature === undefined) {
|
|
14
|
+
throw new Error(`couldn't resolve ${featureLocationMessage()}`); // fail early <== unrecoverable
|
|
15
|
+
}
|
|
16
|
+
if (feature.constructor !== featureClassConstructor) { // feature's type must match desired type *exactly* — cheaper to evaluate than "feature instanceof featureClassConstructor"
|
|
17
|
+
throw new Error(`${featureLocationMessage()} is not a ${featureClassConstructor.name} but a ${feature.constructor.name}`); // fail early <== unrecoverable
|
|
18
|
+
}
|
|
19
|
+
/*
|
|
20
|
+
* We could make this function memoising as well, to avoid having to perform these checks every resolution.
|
|
21
|
+
* That memoisation would involve a 6-deep lookup, in the feature's meta-pointer + container's classifier meta-pointer.
|
|
22
|
+
* The checks seem cheap enough to not be problematic performance-wise, though.
|
|
23
|
+
*/
|
|
24
|
+
return feature; // valid <== feature.constructor === featureClassConstructor
|
|
25
|
+
};
|
|
26
|
+
return {
|
|
27
|
+
resolvedPropertyFrom: featureResolverFor(Property),
|
|
28
|
+
resolvedContainmentFrom: featureResolverFor(Containment),
|
|
29
|
+
resolvedReferenceFrom: featureResolverFor(Reference)
|
|
30
|
+
};
|
|
31
|
+
};
|
|
32
|
+
//# sourceMappingURL=feature-resolvers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feature-resolvers.js","sourceRoot":"","sources":["../../src/m3/feature-resolvers.ts"],"names":[],"mappings":"AAEA,OAAO,EAAc,WAAW,EAAqB,QAAQ,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAC5F,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AAqBxD;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,SAAqB,EAAoB,EAAE;IAC3E,MAAM,WAAW,GAAG,IAAI,oBAAoB,CAAC,SAAS,CAAC,CAAA;IACvD,8DAA8D;IAC9D,MAAM,kBAAkB,GAAG,CAAqB,uBAAmD,EAAuB,EAAE,CACxH,CAAC,kBAAkB,EAAE,UAAsB,EAAE,EAAE;QAC3C,MAAM,qBAAqB,GAAG,UAAU,CAAC,WAAW,EAAE,CAAA;QACtD,MAAM,sBAAsB,GAAG,GAAG,EAAE,CAAC,6BAA6B,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,oCAAoC,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,EAAE,CAAA;QAC/K,MAAM,OAAO,GAAG,WAAW,CAAC,eAAe,CAAC,qBAAqB,EAAE,kBAAkB,CAAC,CAAA;QACtF,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,oBAAoB,sBAAsB,EAAE,EAAE,CAAC,CAAA,CAAI,+BAA+B;QACtG,CAAC;QACD,IAAI,OAAO,CAAC,WAAW,KAAK,uBAAuB,EAAE,CAAC,CAAE,2HAA2H;YAC/K,MAAM,IAAI,KAAK,CAAC,GAAG,sBAAsB,EAAE,aAAa,uBAAuB,CAAC,IAAI,UAAU,OAAO,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAA,CAAI,+BAA+B;QAChK,CAAC;QACD;;;;WAIG;QACH,OAAO,OAAa,CAAA,CAAI,4DAA4D;IACxF,CAAC,CAAA;IACL,OAAO;QACH,oBAAoB,EAAE,kBAAkB,CAAC,QAAQ,CAAC;QAClD,uBAAuB,EAAE,kBAAkB,CAAC,WAAW,CAAC;QACxD,qBAAqB,EAAE,kBAAkB,CAAC,SAAS,CAAC;KACvD,CAAA;AACL,CAAC,CAAA"}
|
package/dist/m3/index.d.ts
CHANGED
|
@@ -3,9 +3,11 @@ export * from "./constraints.js";
|
|
|
3
3
|
export * from "./deserializer.js";
|
|
4
4
|
export * from "./facade.js";
|
|
5
5
|
export * from "./factory.js";
|
|
6
|
+
export * from "./feature-resolvers.js";
|
|
6
7
|
export * from "./functions.js";
|
|
7
8
|
export * from "./lioncore.js";
|
|
8
9
|
export * from "./reference-checker.js";
|
|
9
10
|
export * from "./serializer.js";
|
|
11
|
+
export * from "./symbol-table.js";
|
|
10
12
|
export * from "./types.js";
|
|
11
13
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/m3/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/m3/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAA;AAC7B,cAAc,kBAAkB,CAAA;AAChC,cAAc,mBAAmB,CAAA;AACjC,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAC5B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,eAAe,CAAA;AAC7B,cAAc,wBAAwB,CAAA;AACtC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,YAAY,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/m3/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAA;AAC7B,cAAc,kBAAkB,CAAA;AAChC,cAAc,mBAAmB,CAAA;AACjC,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAC5B,cAAc,wBAAwB,CAAA;AACtC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,eAAe,CAAA;AAC7B,cAAc,wBAAwB,CAAA;AACtC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,mBAAmB,CAAA;AACjC,cAAc,YAAY,CAAA"}
|
package/dist/m3/index.js
CHANGED
|
@@ -3,9 +3,11 @@ export * from "./constraints.js";
|
|
|
3
3
|
export * from "./deserializer.js";
|
|
4
4
|
export * from "./facade.js";
|
|
5
5
|
export * from "./factory.js";
|
|
6
|
+
export * from "./feature-resolvers.js";
|
|
6
7
|
export * from "./functions.js";
|
|
7
8
|
export * from "./lioncore.js";
|
|
8
9
|
export * from "./reference-checker.js";
|
|
9
10
|
export * from "./serializer.js";
|
|
11
|
+
export * from "./symbol-table.js";
|
|
10
12
|
export * from "./types.js";
|
|
11
13
|
//# sourceMappingURL=index.js.map
|
package/dist/m3/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/m3/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAA;AAC7B,cAAc,kBAAkB,CAAA;AAChC,cAAc,mBAAmB,CAAA;AACjC,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAC5B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,eAAe,CAAA;AAC7B,cAAc,wBAAwB,CAAA;AACtC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,YAAY,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/m3/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAA;AAC7B,cAAc,kBAAkB,CAAA;AAChC,cAAc,mBAAmB,CAAA;AACjC,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAC5B,cAAc,wBAAwB,CAAA;AACtC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,eAAe,CAAA;AAC7B,cAAc,wBAAwB,CAAA;AACtC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,mBAAmB,CAAA;AACjC,cAAc,YAAY,CAAA"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { LionWebJsonMetaPointer, LionWebKey } from "@lionweb/json";
|
|
2
|
-
import { Feature, Language, LanguageEntity } from "./
|
|
2
|
+
import { Feature, Language, LanguageEntity } from "./types.js";
|
|
3
3
|
/**
|
|
4
4
|
* Interface for objects that can look up within languages, based on given {@link LionWebJsonMetaPointer meta pointers}.
|
|
5
5
|
* This is meant to be able to properly encapsulate performance optimizations, also outside of the context
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"symbol-table.d.ts","sourceRoot":"","sources":["../../src/m3/symbol-table.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAGlE,OAAO,EAAc,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAG1E;;;;GAIG;AACH,UAAU,WAAW;IAEjB;;OAEG;IACH,gBAAgB,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAA;IAExE;;;OAGG;IACH,cAAc,CAAC,iBAAiB,EAAE,sBAAsB,GAAG,cAAc,GAAG,SAAS,CAAA;IAErF;;;;;;OAMG;IACH,eAAe,CAAC,iBAAiB,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,sBAAsB,GAAG,OAAO,GAAG,SAAS,CAAA;CAE9H;AASD,cAAM,oBAAqB,YAAW,WAAW;IAE7C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;gBAE1B,SAAS,EAAE,QAAQ,EAAE;IAIjC,OAAO,CAAC,QAAQ,CAAC,4BAA4B,CAAqE;IAElH,gBAAgB,GAAI,aAAa,UAAU,EAAE,SAAS,MAAM,KAAG,QAAQ,GAAG,SAAS,CAQ9E;IAGL,OAAO,CAAC,QAAQ,CAAC,wCAAwC,CAAkH;IAE3K,OAAO,CAAC,kBAAkB,CAmBrB;IAEL,cAAc,GAAI,mBAAmB,sBAAsB,KAAG,cAAc,GAAG,SAAS,CAClC;IAEtD;;;OAGG;IACH,2BAA2B,GAAI,mBAAmB,sBAAsB,KAAG,OAAO,EAAE,CACnB;IAEjE,eAAe,CAAC,qBAAqB,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,sBAAsB,GAAG,OAAO,GAAG,SAAS;CAYlI;AAGD,YAAY,EACR,WAAW,EACd,CAAA;AAED,OAAO,EACH,oBAAoB,EACvB,CAAA"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { lazyMapGet } from "@lionweb/ts-utils";
|
|
2
|
-
import { allFeaturesOf } from "./
|
|
3
|
-
import { Classifier } from "./
|
|
2
|
+
import { allFeaturesOf } from "./functions.js";
|
|
3
|
+
import { Classifier } from "./types.js";
|
|
4
4
|
class MemoisingSymbolTable {
|
|
5
5
|
constructor(languages) {
|
|
6
6
|
this.languageKey2version2language = {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"symbol-table.js","sourceRoot":"","sources":["../../src/m3/symbol-table.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,EAAE,UAAU,EAAqC,MAAM,YAAY,CAAA;AAuC1E,MAAM,oBAAoB;IAItB,YAAY,SAAqB;QAIhB,iCAA4B,GAAmE,EAAE,CAAA;QAElH,qBAAgB,GAAG,CAAC,WAAuB,EAAE,OAAe,EAAwB,EAAE,CAClF,UAAU,CACN,UAAU,CAAC,IAAI,CAAC,4BAA4B,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EACtE,OAAO,EACP,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAChC,QAAQ,CAAC,GAAG,KAAK,WAAW;eAC5B,QAAQ,CAAC,OAAO,KAAK,OAAO,CAClC,CACJ,CAAA;QAGY,6CAAwC,GAAgH,EAAE,CAAA;QAEnK,uBAAkB,GAAG,CAAC,iBAAyC,EAA0B,EAAE,CAC/F,UAAU,CACN,UAAU,CACN,UAAU,CAAC,IAAI,CAAC,wCAAwC,EAAE,iBAAiB,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EACjG,iBAAiB,CAAC,OAAO,EACzB,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CACb,EACD,iBAAiB,CAAC,GAAG,EACrB,GAAG,EAAE;YACD,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,QAAQ,EAAE,iBAAiB,CAAC,OAAO,CAAC;gBACvF,EAAE,QAAQ;iBACT,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,KAAK,iBAAiB,CAAC,GAAG,CAAC,CAAA;YAC3D,OAAO,MAAM,KAAK,SAAS;gBACvB,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC;oBACE,MAAM;oBACN,WAAW,EAAE,MAAM,YAAY,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,kBAAkB,EAAE,EAAE;iBACrG,CAAA;QACL,CAAC,CACJ,CAAA;QAEL,mBAAc,GAAG,CAAC,iBAAyC,EAA8B,EAAE,CACvF,IAAI,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAA;QAEtD;;;WAGG;QACH,gCAA2B,GAAG,CAAC,iBAAyC,EAAa,EAAE,CACnF,IAAI,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,EAAE,WAAW,IAAI,EAAE,CAAA;QA/C7D,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;IAC9B,CAAC;IAgDD,eAAe,CAAC,qBAA6C,EAAE,kBAA0C;QACrG,MAAM,UAAU,GAAG,IAAI,CAAC,kBAAkB,CAAC,qBAAqB,CAAC,CAAA;QACjE,IAAI,UAAU,KAAK,SAAS,IAAI,CAAC,CAAC,UAAU,CAAC,MAAM,YAAY,UAAU,CAAC,EAAE,CAAC;YACzE,OAAO,SAAS,CAAA;QACpB,CAAC;QACD,OAAO,UAAU,CACb,UAAU,CAAC,kBAAkB,EAC7B,kBAAkB,CAAC,GAAG,EACtB,GAAG,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,KAAK,kBAAkB,CAAC,GAAG,CAAC,CACzF,CAAA;IACL,CAAC;CAEJ;AAOD,OAAO,EACH,oBAAoB,EACvB,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lionweb/core",
|
|
3
|
-
"version": "0.7.0-beta.
|
|
3
|
+
"version": "0.7.0-beta.19",
|
|
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.7.0-beta.
|
|
31
|
-
"@lionweb/ts-utils": "0.7.0-beta.
|
|
30
|
+
"@lionweb/json": "0.7.0-beta.19",
|
|
31
|
+
"@lionweb/ts-utils": "0.7.0-beta.19"
|
|
32
32
|
}
|
|
33
33
|
}
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
import {
|
|
2
|
+
currentSerializationFormatVersion,
|
|
3
|
+
LionWebId,
|
|
4
|
+
LionWebJsonChunk,
|
|
5
|
+
LionWebJsonNode,
|
|
6
|
+
LionWebKey
|
|
7
|
+
} from "@lionweb/json"
|
|
8
|
+
import { byIdMap, groupBy, keepDefineds } from "@lionweb/ts-utils"
|
|
9
|
+
import { Writer } from "./writing.js"
|
|
10
|
+
import { defaultSimplisticHandler, SimplisticHandler } from "./handler.js"
|
|
11
|
+
import { BuiltinPropertyValueDeserializer } from "./m3/builtins.js"
|
|
12
|
+
import { MemoisingSymbolTable } from "./m3/symbol-table.js"
|
|
13
|
+
import { Classifier, Containment, Enumeration, Language, PrimitiveType, Property, Reference } from "./m3/types.js"
|
|
14
|
+
import { unresolved } from "./references.js"
|
|
15
|
+
import { Node } from "./types.js"
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Interface for objects that expose a method to deserialize a property's value.
|
|
19
|
+
*/
|
|
20
|
+
export interface PropertyValueDeserializer {
|
|
21
|
+
deserializeValue(value: string | undefined, property: Property): unknown | undefined
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Misspelled alias of {@link PropertyValueDeserializer}, kept for backward compatibility, and to be deprecated and removed later.
|
|
26
|
+
*/
|
|
27
|
+
export interface PrimitiveTypeDeserializer extends PropertyValueDeserializer {}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* @return a deserialization of a {@link LionWebJsonChunk}
|
|
31
|
+
*
|
|
32
|
+
* @param serializationChunk - a {@link SerializedModel model} from its LionWeb serialization JSON format
|
|
33
|
+
* @param writer - a {@link Writer} that is used to instantiate nodes and set values on them
|
|
34
|
+
* @param languages - a {@link Language language} that the serialized model is expected to conform to
|
|
35
|
+
* @param dependentNodes - a collection of nodes from dependent models against which all references in the serialized model are supposed to resolve against
|
|
36
|
+
* @param propertyValueDeserializer - a deserializer for values of properties (by default a {@link BuiltinPropertyValueDeserializer})
|
|
37
|
+
* @param problemHandler - a handler for reporting problems (by default a {@link defaultSimplisticHandler})
|
|
38
|
+
*/
|
|
39
|
+
export const deserializeSerializationChunk = <NT extends Node>(
|
|
40
|
+
serializationChunk: LionWebJsonChunk,
|
|
41
|
+
writer: Writer<NT>,
|
|
42
|
+
languages: Language[],
|
|
43
|
+
// TODO facades <--> languages, so it's weird that it looks split up like this
|
|
44
|
+
dependentNodes: Node[],
|
|
45
|
+
// TODO (#13) see if you can turn this into [nodes: Node[], writer: Writer<Node>][] after all
|
|
46
|
+
propertyValueDeserializer: BuiltinPropertyValueDeserializer = new BuiltinPropertyValueDeserializer(),
|
|
47
|
+
problemHandler: SimplisticHandler = defaultSimplisticHandler
|
|
48
|
+
): NT[] => {
|
|
49
|
+
if (serializationChunk.serializationFormatVersion !== currentSerializationFormatVersion) {
|
|
50
|
+
problemHandler.reportProblem(
|
|
51
|
+
`can't deserialize from serialization format other than version "${currentSerializationFormatVersion}" - assuming that version`
|
|
52
|
+
)
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const symbolTable = new MemoisingSymbolTable(languages)
|
|
56
|
+
|
|
57
|
+
const { nodes: serializedNodes } = serializationChunk
|
|
58
|
+
|
|
59
|
+
const serializedNodeById = byIdMap(serializedNodes)
|
|
60
|
+
|
|
61
|
+
const deserializedNodeById: { [id: LionWebId]: NT } = {}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Instantiates a {@link Node} from the given {@link LionWebJsonNode},
|
|
65
|
+
* and stores it under its ID so references to it can be resolved.
|
|
66
|
+
* For every serialized node, only one instance will ever be constructed (through memoisation).
|
|
67
|
+
*/
|
|
68
|
+
const instantiateMemoised = (serNode: LionWebJsonNode, parent?: NT): NT | null => {
|
|
69
|
+
if (serNode.id in deserializedNodeById) {
|
|
70
|
+
return deserializedNodeById[serNode.id]
|
|
71
|
+
}
|
|
72
|
+
const node = instantiate(serNode, parent)
|
|
73
|
+
if (node !== null) {
|
|
74
|
+
deserializedNodeById[node.id] = node
|
|
75
|
+
}
|
|
76
|
+
return node
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
type ReferenceToInstall = [node: NT, feature: Reference, refId: LionWebId]
|
|
80
|
+
const referencesToInstall: ReferenceToInstall[] = []
|
|
81
|
+
|
|
82
|
+
const tryInstantiate = (
|
|
83
|
+
parent: NT | undefined,
|
|
84
|
+
classifier: Classifier,
|
|
85
|
+
id: LionWebId,
|
|
86
|
+
propertySettings: { [propertyKey: LionWebKey]: unknown }
|
|
87
|
+
): NT | null => {
|
|
88
|
+
try {
|
|
89
|
+
return writer.nodeFor(parent, classifier, id, propertySettings)
|
|
90
|
+
} catch (e: unknown) {
|
|
91
|
+
problemHandler.reportProblem(
|
|
92
|
+
`error occurred during instantiation of a node for classifier ${classifier.name} with meta-pointer (${classifier.language.key}, ${classifier.language.version}, ${classifier.key}); reason:`
|
|
93
|
+
)
|
|
94
|
+
problemHandler.reportProblem((e as Error).toString())
|
|
95
|
+
return null
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Instantiates a {@link Node} from its {@link LionWebJsonNode serialization}.
|
|
101
|
+
*/
|
|
102
|
+
const instantiate = (
|
|
103
|
+
{ id, classifier: classifierMetaPointer, properties, containments, references, annotations }: LionWebJsonNode,
|
|
104
|
+
parent?: NT
|
|
105
|
+
): NT | null => {
|
|
106
|
+
const classifier = symbolTable.entityMatching(classifierMetaPointer)
|
|
107
|
+
|
|
108
|
+
if (classifier === undefined || !(classifier instanceof Classifier)) {
|
|
109
|
+
problemHandler.reportProblem(
|
|
110
|
+
`can't deserialize node with id=${id}: can't find the classifier with key ${classifierMetaPointer.key} in language (${classifierMetaPointer.language}, ${classifierMetaPointer.version})`
|
|
111
|
+
)
|
|
112
|
+
return null
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
const allFeatures = symbolTable.allFeaturesOfEntityMatching(classifierMetaPointer)
|
|
116
|
+
|
|
117
|
+
const propertySettings: { [propertyKey: LionWebKey]: unknown } = {}
|
|
118
|
+
|
|
119
|
+
const serializedPropertiesPerKey = properties === undefined ? {} : groupBy(properties, sp => sp.property.key) // (this assumes no duplicate keys among properties!)
|
|
120
|
+
if (properties !== undefined) {
|
|
121
|
+
allFeatures
|
|
122
|
+
.filter(feature => feature instanceof Property)
|
|
123
|
+
.map(feature => feature as Property)
|
|
124
|
+
.forEach(property => {
|
|
125
|
+
if (property.key in serializedPropertiesPerKey) {
|
|
126
|
+
const value = serializedPropertiesPerKey[property.key][0].value
|
|
127
|
+
if (property.type instanceof PrimitiveType) {
|
|
128
|
+
propertySettings[property.key] =
|
|
129
|
+
value === null ? undefined : propertyValueDeserializer.deserializeValue(value, property as Property)
|
|
130
|
+
return
|
|
131
|
+
}
|
|
132
|
+
if (property.type instanceof Enumeration) {
|
|
133
|
+
const literal = property.type.literals.find(literal => literal.key === value)
|
|
134
|
+
if (literal !== undefined) {
|
|
135
|
+
propertySettings[property.key] = writer.encodingOf(literal)
|
|
136
|
+
}
|
|
137
|
+
return
|
|
138
|
+
}
|
|
139
|
+
// (property is not handled, because neither a primitive type nor of enumeration type)
|
|
140
|
+
}
|
|
141
|
+
})
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
const node = tryInstantiate(parent, classifier, id, propertySettings)
|
|
145
|
+
if (node === null) {
|
|
146
|
+
return null
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
const serializedContainmentsPerKey = containments === undefined ? {} : groupBy(containments, sp => sp.containment.key) // (this assumes no duplicate keys among containments!)
|
|
150
|
+
const serializedReferencesPerKey = references === undefined ? {} : groupBy(references, sp => sp.reference.key) // (this assumes no duplicate keys among references!)
|
|
151
|
+
|
|
152
|
+
allFeatures.forEach(feature => {
|
|
153
|
+
if (feature instanceof Property && properties !== undefined && feature.key in serializedPropertiesPerKey) {
|
|
154
|
+
writer.setFeatureValue(node, feature, propertySettings[feature.key])
|
|
155
|
+
} else if (feature instanceof Containment && containments !== undefined && feature.key in serializedContainmentsPerKey) {
|
|
156
|
+
const childIds = serializedContainmentsPerKey[feature.key].flatMap(serChildren => serChildren.children) as LionWebId[]
|
|
157
|
+
if (feature.multiple) {
|
|
158
|
+
childIds.forEach(childId => {
|
|
159
|
+
if (childId in serializedNodeById) {
|
|
160
|
+
writer.setFeatureValue(node, feature, instantiateMemoised(serializedNodeById[childId], node))
|
|
161
|
+
}
|
|
162
|
+
})
|
|
163
|
+
} else {
|
|
164
|
+
if (childIds.length > 0) {
|
|
165
|
+
// just set the 1st one:
|
|
166
|
+
const firstChildId = childIds[0]
|
|
167
|
+
if (firstChildId in serializedNodeById) {
|
|
168
|
+
writer.setFeatureValue(node, feature, instantiateMemoised(serializedNodeById[firstChildId], node))
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
} else if (feature instanceof Reference && references !== undefined && feature.key in serializedReferencesPerKey) {
|
|
173
|
+
const serRefs = (serializedReferencesPerKey[feature.key] ?? []).flatMap(serReferences =>
|
|
174
|
+
serReferences.targets.map(t => t.reference)
|
|
175
|
+
)
|
|
176
|
+
referencesToInstall.push(
|
|
177
|
+
...(serRefs.filter(serRef => typeof serRef === "string") as LionWebId[]).map(
|
|
178
|
+
refId => [node, feature, refId] as ReferenceToInstall
|
|
179
|
+
)
|
|
180
|
+
)
|
|
181
|
+
}
|
|
182
|
+
})
|
|
183
|
+
|
|
184
|
+
node.annotations = keepDefineds(
|
|
185
|
+
annotations
|
|
186
|
+
.filter(annotationId => annotationId in serializedNodeById)
|
|
187
|
+
.map(annotationId => instantiateMemoised(serializedNodeById[annotationId]))
|
|
188
|
+
)
|
|
189
|
+
.map(annotation => annotation!)
|
|
190
|
+
|
|
191
|
+
return node
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
const rootLikeNodes = keepDefineds(
|
|
195
|
+
serializedNodes
|
|
196
|
+
.filter(({ parent }) => parent === null || !(parent in serializedNodeById))
|
|
197
|
+
.map(serializedNode => instantiateMemoised(serializedNode))
|
|
198
|
+
)
|
|
199
|
+
.map(node => node!)
|
|
200
|
+
|
|
201
|
+
const dependentNodesById = byIdMap(dependentNodes)
|
|
202
|
+
|
|
203
|
+
referencesToInstall.forEach(([node, reference, refId]) => {
|
|
204
|
+
const target = deserializedNodeById[refId] ?? dependentNodesById[refId]
|
|
205
|
+
const value = (() => {
|
|
206
|
+
if (target === undefined) {
|
|
207
|
+
const metaTypeMessage = "concept" in node ? ` and (meta-)type ${node.concept}` : ""
|
|
208
|
+
problemHandler.reportProblem(
|
|
209
|
+
`couldn't resolve the target with id=${refId} of a "${reference.name}" reference on the node with id=${node.id}${metaTypeMessage}`
|
|
210
|
+
)
|
|
211
|
+
return unresolved
|
|
212
|
+
}
|
|
213
|
+
return target
|
|
214
|
+
})()
|
|
215
|
+
writer.setFeatureValue(node, reference, value)
|
|
216
|
+
})
|
|
217
|
+
|
|
218
|
+
return rootLikeNodes
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* Alias for {@link deserializeSerializationChunk}.
|
|
223
|
+
*/
|
|
224
|
+
export const deserializeChunk = deserializeSerializationChunk
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { LionWebKey } from "@lionweb/json"
|
|
2
|
+
import { builtinFeatures } from "./m3/builtins.js"
|
|
3
|
+
import { Classifier } from "./m3/types.js"
|
|
4
|
+
import { Reader, ResolveInfoDeducer } from "./reading.js"
|
|
5
|
+
import { Node } from "./types.js"
|
|
6
|
+
import { updateSettingsKeyBased, Writer } from "./writing.js"
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Type definition for "dynamic nodes" that are not backed by specific types (e.g. classes).
|
|
11
|
+
*/
|
|
12
|
+
export type DynamicNode = Node & {
|
|
13
|
+
classifier: Classifier
|
|
14
|
+
settings: Record<string, unknown>
|
|
15
|
+
}
|
|
16
|
+
// TODO could also have properties, containments, references - mimicking the serialization
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
const propertyGetterFor = (key: LionWebKey): ResolveInfoDeducer<DynamicNode> =>
|
|
20
|
+
(node) =>
|
|
21
|
+
(key in node.settings && typeof node.settings[key] === "string")
|
|
22
|
+
? node.settings[key] as string // FIXME type cast shouldn't be necessary
|
|
23
|
+
: undefined
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* An implementation of {@link Reader} for {@link DynamicNode dynamic nodes}.
|
|
27
|
+
*/
|
|
28
|
+
export const dynamicReader: Reader<DynamicNode> = ({
|
|
29
|
+
classifierOf: (node) => node.classifier,
|
|
30
|
+
getFeatureValue: (node, feature) =>
|
|
31
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
32
|
+
(node.settings as any)[feature.key],
|
|
33
|
+
enumerationLiteralFrom: (value, enumeration) =>
|
|
34
|
+
enumeration.literals.find(({key}) => key === value)
|
|
35
|
+
?? null, // (undefined -> null)
|
|
36
|
+
resolveInfoFor: propertyGetterFor(builtinFeatures.inamed_name.key)
|
|
37
|
+
})
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Alias for {@link Reader}, kept for backward compatibility, and to be deprecated and removed later.
|
|
41
|
+
*/
|
|
42
|
+
export const dynamicExtractionFacade = dynamicReader
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* An implementation of {@link Writer} for {@link DynamicNode dynamic nodes}.
|
|
46
|
+
*/
|
|
47
|
+
export const dynamicWriter: Writer<DynamicNode> = ({
|
|
48
|
+
nodeFor: (_parent, classifier, id, _propertySettings) => ({
|
|
49
|
+
id,
|
|
50
|
+
classifier,
|
|
51
|
+
settings: {}
|
|
52
|
+
} as DynamicNode),
|
|
53
|
+
setFeatureValue: (node, feature, value) => {
|
|
54
|
+
updateSettingsKeyBased(node.settings, feature, value)
|
|
55
|
+
},
|
|
56
|
+
encodingOf: ({key}) => key
|
|
57
|
+
})
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Alias for {@link Reader}, kept for backward compatibility, and to be deprecated and removed later.
|
|
61
|
+
*/
|
|
62
|
+
export const dynamicInstantiationFacade = dynamicReader
|
|
63
|
+
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { flatMapNonCyclingFollowing, trivialFlatMapper } from "@lionweb/ts-utils"
|
|
2
|
+
|
|
3
|
+
import { allFeaturesOf, isContainment } from "./m3/index.js"
|
|
4
|
+
import { Reader } from "./reading.js"
|
|
5
|
+
import { Node } from "./types.js"
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Type def. for functions that extract {@link Node nodes} from a given one.
|
|
10
|
+
*/
|
|
11
|
+
export type NodesExtractor<NT extends Node> = (node: NT) => NT[]
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* @return A function that extracts the children from a given node.
|
|
15
|
+
*/
|
|
16
|
+
export const childrenExtractorUsing = <NT extends Node>(reader: Reader<NT>): NodesExtractor<NT> =>
|
|
17
|
+
(node: NT): NT[] => [
|
|
18
|
+
...(allFeaturesOf(reader.classifierOf(node))
|
|
19
|
+
.filter(isContainment)
|
|
20
|
+
.flatMap((containment) => reader.getFeatureValue(node, containment) ?? [])),
|
|
21
|
+
// FIXME there's NO guarantee about the result of reader.getFeatureValue(node, containment) !!!
|
|
22
|
+
...node.annotations
|
|
23
|
+
] as NT[]
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* @return a function that extracts *all* nodes from a given start node - usually a root node.
|
|
28
|
+
*/
|
|
29
|
+
export const nodesExtractorUsing = <NT extends Node>(reader: Reader<NT>): NodesExtractor<NT> =>
|
|
30
|
+
flatMapNonCyclingFollowing(trivialFlatMapper, childrenExtractorUsing<NT>(reader))
|
|
31
|
+
|
package/src/functions.ts
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { LionWebId } from "@lionweb/json"
|
|
2
|
+
import { flatMapNonCyclingFollowing, trivialFlatMapper } from "@lionweb/ts-utils"
|
|
3
|
+
import { Node } from "./types.js"
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* @return a list of itself and the ancestors of the given {@link Node node}, in anti-chronological order.
|
|
8
|
+
*/
|
|
9
|
+
export const containmentChain = (node: Node): Node[] => {
|
|
10
|
+
const getParent = (t: Node): Node[] => t.parent === undefined ? [] : [t.parent]
|
|
11
|
+
return flatMapNonCyclingFollowing(trivialFlatMapper, getParent)(node)
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Maps an array of {@link Node AST nodes} or `null`s to their IDs.
|
|
17
|
+
* These `null`s might be the result of unresolved children.
|
|
18
|
+
*/
|
|
19
|
+
export const asIds = (nodeOrNulls: (Node | null)[]): (LionWebId | null)[] =>
|
|
20
|
+
nodeOrNulls.map((nodeOrNull) => nodeOrNull === null ? null : nodeOrNull.id)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* @return the id of the given {@link Node node}.
|
|
25
|
+
*/
|
|
26
|
+
export const idOf = <T extends Node>({id}: T): LionWebId =>
|
|
27
|
+
id
|
|
28
|
+
|