@lionweb/core 0.7.0-beta.2 → 0.7.0-beta.20

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 (76) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/dist/deserializer.d.ts +2 -2
  3. package/dist/deserializer.d.ts.map +1 -1
  4. package/dist/deserializer.js +7 -10
  5. package/dist/deserializer.js.map +1 -1
  6. package/dist/extraction.d.ts.map +1 -1
  7. package/dist/functions.d.ts.map +1 -1
  8. package/dist/handler.d.ts +1 -1
  9. package/dist/index.d.ts +0 -1
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +0 -1
  12. package/dist/index.js.map +1 -1
  13. package/dist/m1/reference-utils.d.ts +1 -1
  14. package/dist/m1/reference-utils.d.ts.map +1 -1
  15. package/dist/m3/builtins.d.ts.map +1 -1
  16. package/dist/m3/builtins.js +2 -1
  17. package/dist/m3/builtins.js.map +1 -1
  18. package/dist/m3/constraints.d.ts.map +1 -1
  19. package/dist/m3/constraints.js +2 -2
  20. package/dist/m3/constraints.js.map +1 -1
  21. package/dist/m3/deserializer.d.ts.map +1 -1
  22. package/dist/m3/feature-resolvers.d.ts +23 -0
  23. package/dist/m3/feature-resolvers.d.ts.map +1 -0
  24. package/dist/m3/feature-resolvers.js +32 -0
  25. package/dist/m3/feature-resolvers.js.map +1 -0
  26. package/dist/m3/functions.d.ts +17 -1
  27. package/dist/m3/functions.d.ts.map +1 -1
  28. package/dist/m3/functions.js +21 -5
  29. package/dist/m3/functions.js.map +1 -1
  30. package/dist/m3/index.d.ts +2 -0
  31. package/dist/m3/index.d.ts.map +1 -1
  32. package/dist/m3/index.js +2 -0
  33. package/dist/m3/index.js.map +1 -1
  34. package/dist/m3/reference-checker.d.ts.map +1 -1
  35. package/dist/m3/serializer.d.ts.map +1 -1
  36. package/dist/{symbol-table.d.ts → m3/symbol-table.d.ts} +9 -14
  37. package/dist/m3/symbol-table.d.ts.map +1 -0
  38. package/dist/m3/symbol-table.js +38 -0
  39. package/dist/m3/symbol-table.js.map +1 -0
  40. package/dist/m3/types.d.ts.map +1 -1
  41. package/dist/references.d.ts +1 -1
  42. package/dist/references.d.ts.map +1 -1
  43. package/dist/serializer.d.ts.map +1 -1
  44. package/dist/serializer.js +19 -9
  45. package/dist/serializer.js.map +1 -1
  46. package/package.json +31 -31
  47. package/src/deserializer.ts +224 -0
  48. package/src/dynamic-facade.ts +63 -0
  49. package/src/extraction.ts +31 -0
  50. package/src/functions.ts +28 -0
  51. package/src/handler.ts +57 -0
  52. package/src/index.ts +13 -0
  53. package/src/m1/reference-utils.ts +106 -0
  54. package/src/m3/README.md +16 -0
  55. package/src/m3/builtins.ts +170 -0
  56. package/src/m3/constraints.ts +109 -0
  57. package/src/m3/deserializer.ts +38 -0
  58. package/src/m3/facade.ts +130 -0
  59. package/src/m3/factory.ts +98 -0
  60. package/src/m3/feature-resolvers.ts +55 -0
  61. package/src/m3/functions.ts +379 -0
  62. package/src/m3/index.ts +12 -0
  63. package/src/m3/lioncore.ts +139 -0
  64. package/src/m3/reference-checker.ts +38 -0
  65. package/src/m3/serializer.ts +13 -0
  66. package/src/m3/symbol-table.ts +119 -0
  67. package/src/m3/types.ts +325 -0
  68. package/src/reading.ts +55 -0
  69. package/src/references.ts +31 -0
  70. package/src/serializer.ts +244 -0
  71. package/src/types.ts +11 -0
  72. package/src/version.ts +5 -0
  73. package/src/writing.ts +79 -0
  74. package/dist/symbol-table.d.ts.map +0 -1
  75. package/dist/symbol-table.js +0 -66
  76. package/dist/symbol-table.js.map +0 -1
@@ -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"}
@@ -0,0 +1,38 @@
1
+ import { lazyMapGet } from "@lionweb/ts-utils";
2
+ import { allFeaturesOf } from "./functions.js";
3
+ import { Classifier } from "./types.js";
4
+ class MemoisingSymbolTable {
5
+ constructor(languages) {
6
+ this.languageKey2version2language = {};
7
+ this.languageMatching = (languageKey, version) => lazyMapGet(lazyMapGet(this.languageKey2version2language, languageKey, () => ({})), version, () => this.languages.find((language) => language.key === languageKey
8
+ && language.version === version));
9
+ this.languageKey2version2entityKey2entityInfo = {};
10
+ this.entityInfoMatching = (entityMetaPointer) => lazyMapGet(lazyMapGet(lazyMapGet(this.languageKey2version2entityKey2entityInfo, entityMetaPointer.language, () => ({})), entityMetaPointer.version, () => ({})), entityMetaPointer.key, () => {
11
+ const entity = this.languageMatching(entityMetaPointer.language, entityMetaPointer.version)
12
+ ?.entities
13
+ .find((entity) => entity.key === entityMetaPointer.key);
14
+ return entity === undefined
15
+ ? undefined
16
+ : {
17
+ entity,
18
+ allFeatures: entity instanceof Classifier ? allFeaturesOf(entity) : [], featureKey2feature: {}
19
+ };
20
+ });
21
+ this.entityMatching = (entityMetaPointer) => this.entityInfoMatching(entityMetaPointer)?.entity;
22
+ /**
23
+ * Looks up the {@link LanguageEntity}, as pointed to by the given {@link LionWebJsonMetaPointer},
24
+ * and @returns all its {@link Feature features} or an empty array if it couldn't be found.
25
+ */
26
+ this.allFeaturesOfEntityMatching = (entityMetaPointer) => this.entityInfoMatching(entityMetaPointer)?.allFeatures ?? [];
27
+ this.languages = languages;
28
+ }
29
+ featureMatching(classifierMetaPointer, featureMetaPointer) {
30
+ const entityInfo = this.entityInfoMatching(classifierMetaPointer);
31
+ if (entityInfo === undefined || !(entityInfo.entity instanceof Classifier)) {
32
+ return undefined;
33
+ }
34
+ return lazyMapGet(entityInfo.featureKey2feature, featureMetaPointer.key, () => entityInfo.allFeatures.find((feature) => feature.key === featureMetaPointer.key));
35
+ }
36
+ }
37
+ export { MemoisingSymbolTable };
38
+ //# sourceMappingURL=symbol-table.js.map
@@ -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"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/m3/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/m3/types.ts"],"names":[],"mappings":"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"}
@@ -11,7 +11,7 @@ export type SingleRef<T> = typeof unresolved | T;
11
11
  /**
12
12
  * Checks whether a given (at most) single-valued reference actually refers to something.
13
13
  */
14
- export declare const isRef: <T>(ref?: SingleRef<T> | undefined) => ref is T;
14
+ export declare const isRef: <T>(ref?: SingleRef<T>) => ref is T;
15
15
  /**
16
16
  * A type alias for a multi-valued reference, to make it look consistent with {@link SingleRef}.
17
17
  */
@@ -1 +1 @@
1
- {"version":3,"file":"references.d.ts","sourceRoot":"","sources":["../src/references.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAGzC;;;GAGG;AACH,eAAO,MAAM,UAAU,MAAO,CAAA;AAE9B;;GAEG;AACH,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI,OAAO,UAAU,GAAG,CAAC,CAAA;AAEhD;;GAEG;AACH,eAAO,MAAM,KAAK,iDACyB,CAAA;AAE3C;;GAEG;AACH,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI,CAAC,EAAE,CAAA;AAG7B;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,OAAO,UAAU,CAAC"}
1
+ {"version":3,"file":"references.d.ts","sourceRoot":"","sources":["../src/references.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAGzC;;;GAGG;AACH,eAAO,MAAM,UAAU,MAAO,CAAA;AAE9B;;GAEG;AACH,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI,OAAO,UAAU,GAAG,CAAC,CAAA;AAEhD;;GAEG;AACH,eAAO,MAAM,KAAK,GAAI,CAAC,EAAE,MAAM,SAAS,CAAC,CAAC,CAAC,KAAG,GAAG,IAAI,CACV,CAAA;AAE3C;;GAEG;AACH,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI,CAAC,EAAE,CAAA;AAG7B;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,OAAO,UAAU,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"serializer.d.ts","sourceRoot":"","sources":["../src/serializer.ts"],"names":[],"mappings":"AAAA,OAAO,EAGH,gBAAgB,EAChB,sBAAsB,EAEzB,MAAM,eAAe,CAAA;AAGtB,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AAGjC,OAAO,EAGH,OAAO,EAGP,QAAQ,EAGX,MAAM,eAAe,CAAA;AAGtB;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACpC,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,GAAG,MAAM,GAAG,IAAI,CAAA;CACpE;AAED;;GAEG;AACH,MAAM,WAAW,uBAAwB,SAAQ,uBAAuB;CAAG;AAQ3E;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAAG,OAAO,CAAC;IACvC;;;;OAIG;IACH,sBAAsB,EAAE,OAAO,CAAA;IAE/B;;;OAGG;IACH,uBAAuB,EAAE,uBAAuB,CAAA;IAEhD;;OAEG;IACH,uBAAuB,EAAE,uBAAuB,CAAA;CACnD,CAAC,CAAA;AAEF;;GAEG;AACH,eAAO,MAAM,cAAc,YAAa,OAAO,KAAG,sBAOjD,CAAA;AAGD;;GAEG;AACH,eAAO,MAAM,cAAc,+DAAgE,oBAAoB,sBAKrF,gBA8GzB,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,cAAc,wFAGY,uBAAuB,GAAG,oBAAoB,KAClF,gBAQS,CAAA"}
1
+ {"version":3,"file":"serializer.d.ts","sourceRoot":"","sources":["../src/serializer.ts"],"names":[],"mappings":"AAAA,OAAO,EAGH,gBAAgB,EAChB,sBAAsB,EAEzB,MAAM,eAAe,CAAA;AAGtB,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AAGjC,OAAO,EAIH,OAAO,EAGP,QAAQ,EAGX,MAAM,eAAe,CAAA;AAGtB;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACpC,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,GAAG,MAAM,GAAG,IAAI,CAAA;CACpE;AAED;;GAEG;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;;;OAGG;IACH,uBAAuB,EAAE,uBAAuB,CAAA;IAEhD;;OAEG;IACH,uBAAuB,EAAE,uBAAuB,CAAA;CAEnD,CAAC,CAAA;AAEF;;GAEG;AACH,eAAO,MAAM,cAAc,GAAI,SAAS,OAAO,KAAG,sBAOjD,CAAA;AAGD;;GAEG;AACH,eAAO,MAAM,cAAc,GAAI,EAAE,SAAS,IAAI,EAAE,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE,uBAAuB,oBAAoB,MA6BnG,OAAO,EAAE,EAAE,KAAG,gBA8GzB,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,cAAc,GAAI,EAAE,SAAS,IAAI,EAC1C,OAAO,EAAE,EAAE,EACX,QAAQ,MAAM,CAAC,EAAE,CAAC,EAClB,mCAAmC,uBAAuB,GAAG,oBAAoB,KAClF,gBAQS,CAAA"}
@@ -1,8 +1,8 @@
1
1
  import { currentSerializationFormatVersion } from "@lionweb/json";
2
- import { asArray } from "@lionweb/ts-utils";
2
+ import { asArray, keepDefineds, lazyMapGet, uniquesAmong } from "@lionweb/ts-utils";
3
3
  import { asIds } from "./functions.js";
4
4
  import { BuiltinPropertyValueSerializer } from "./m3/builtins.js";
5
- import { allFeaturesOf } from "./m3/functions.js";
5
+ import { inheritsDirectlyFrom } from "./m3/functions.js";
6
6
  import { Containment, Enumeration, PrimitiveType, Property, Reference, simpleNameDeducer } from "./m3/types.js";
7
7
  const isPropertyValueSerializer = (value) => typeof value === "object" && value !== null && "serializeValue" in value && typeof value.serializeValue === "function";
8
8
  /**
@@ -22,15 +22,27 @@ export const metaPointerFor = (feature) => {
22
22
  export const nodeSerializer = (reader, serializationOptions) => {
23
23
  const propertyValueSerializer = serializationOptions?.propertyValueSerializer ?? serializationOptions?.primitiveTypeSerializer ?? new BuiltinPropertyValueSerializer();
24
24
  const serializeEmptyFeatures = serializationOptions?.serializeEmptyFeatures ?? true;
25
+ const languageKey2version2classifierKey2allFeatures = {};
26
+ 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
27
+ [...classifier.features, ...(inheritsDirectlyFrom(classifier).flatMap(memoisedAllFeaturesOf))]
28
+ /*
29
+ * [NOTE]
30
+ * The allFeaturesOf function uses flatMapNonCyclingFollowing which avoids that features of a super-classifier are added multiple times.
31
+ * Unfortunately, to make use of the memoising, we can't use flatMapNonCyclingFollowing in the same way here.
32
+ * So, we have to remove duplicates ourselves.
33
+ */
34
+ ));
25
35
  return (nodes) => {
26
36
  const serializedNodes = []; // keep nodes as much as possible "in order"
27
37
  const ids = {}; // maintain a map to keep track of IDs of nodes that have been serialized
28
38
  const languagesUsed = [];
39
+ const usedLanguageKey2Version2Boolean = {};
29
40
  const registerLanguageUsed = (language) => {
30
- if (!languagesUsed.some(languageUsed => language.equals(languageUsed))) {
41
+ const version2Boolean = lazyMapGet(usedLanguageKey2Version2Boolean, language.key, () => ({}));
42
+ if (!version2Boolean[language.version]) {
43
+ version2Boolean[language.version] = true;
31
44
  languagesUsed.push(language);
32
45
  }
33
- // TODO could make this more efficient by using a hash table
34
46
  };
35
47
  const visit = (node, parent) => {
36
48
  if (node.id in ids) {
@@ -50,7 +62,7 @@ export const nodeSerializer = (reader, serializationOptions) => {
50
62
  };
51
63
  serializedNodes.push(serializedNode);
52
64
  ids[node.id] = true;
53
- allFeaturesOf(classifier).forEach(feature => {
65
+ memoisedAllFeaturesOf(classifier).forEach((feature) => {
54
66
  const value = reader.getFeatureValue(node, feature);
55
67
  const featureLanguage = feature.classifier.language;
56
68
  registerLanguageUsed(featureLanguage);
@@ -83,8 +95,7 @@ export const nodeSerializer = (reader, serializationOptions) => {
83
95
  }
84
96
  serializedNode.containments.push({
85
97
  containment: featureMetaPointer,
86
- children: asIds(children)
87
- .filter(childId => childId !== null)
98
+ children: keepDefineds(asIds(children))
88
99
  .map(childId => childId)
89
100
  });
90
101
  children.forEach(childOrNull => {
@@ -102,8 +113,7 @@ export const nodeSerializer = (reader, serializationOptions) => {
102
113
  }
103
114
  serializedNode.references.push({
104
115
  reference: featureMetaPointer,
105
- targets: targets
106
- .filter(tOrNull => tOrNull !== null) // (skip "non-connected" targets)
116
+ targets: keepDefineds(targets) // (skip "non-connected" targets)
107
117
  .map(t => t)
108
118
  .map(t => ({
109
119
  resolveInfo: (reader.resolveInfoFor ? reader.resolveInfoFor(t) : simpleNameDeducer(t)) ?? null,
@@ -1 +1 @@
1
- {"version":3,"file":"serializer.js","sourceRoot":"","sources":["../src/serializer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"serializer.js","sourceRoot":"","sources":["../src/serializer.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,iCAAiC,EAKpC,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAc,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAC/F,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;AAGtC,OAAO,EAAE,8BAA8B,EAAE,MAAM,kBAAkB,CAAA;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AACxD,OAAO,EAEH,WAAW,EACX,WAAW,EAGX,aAAa,EACb,QAAQ,EACR,SAAS,EACT,iBAAiB,EACpB,MAAM,eAAe,CAAA;AAgBtB,MAAM,yBAAyB,GAAG,CAAC,KAAc,EAAoC,EAAE,CACnF,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,gBAAgB,IAAI,KAAK,IAAI,OAAO,KAAK,CAAC,cAAc,KAAK,UAAU,CAAA;AA6B1H;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,OAAgB,EAA0B,EAAE;IACvE,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,UAAU,CAAA;IACvC,OAAO;QACH,QAAQ,EAAE,QAAQ,CAAC,GAAG;QACtB,OAAO,EAAE,QAAQ,CAAC,OAAO;QACzB,GAAG,EAAE,OAAO,CAAC,GAAG;KACnB,CAAA;AACL,CAAC,CAAA;AAGD;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAkB,MAAkB,EAAE,oBAA2C,EAAE,EAAE;IAC/G,MAAM,uBAAuB,GACzB,oBAAoB,EAAE,uBAAuB,IAAI,oBAAoB,EAAE,uBAAuB,IAAI,IAAI,8BAA8B,EAAE,CAAA;IAC1I,MAAM,sBAAsB,GAAG,oBAAoB,EAAE,sBAAsB,IAAI,IAAI,CAAA;IAEnF,MAAM,6CAA6C,GAA0B,EAAE,CAAA;IAC/E,MAAM,qBAAqB,GAAG,CAAC,UAAsB,EAAa,EAAE,CAChE,UAAU,CACN,UAAU,CACN,UAAU,CACN,6CAA6C,EAC7C,UAAU,CAAC,QAAQ,CAAC,GAAG,EACvB,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CACb,EACD,UAAU,CAAC,QAAQ,CAAC,OAAO,EAC3B,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CACb,EACD,UAAU,CAAC,GAAG,EACd,GAAG,EAAE,CAAC,YAAY,CAAE,8EAA8E;IAC9F,CAAE,GAAG,UAAU,CAAC,QAAQ,EAAE,GAAG,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC,CAAE;IAChG;;;;;OAKG;KACN,CACJ,CAAA;IAEL,OAAO,CAAC,KAAW,EAAoB,EAAE;QACrC,MAAM,eAAe,GAAsB,EAAE,CAAA,CAAC,4CAA4C;QAC1F,MAAM,GAAG,GAAiC,EAAE,CAAA,CAAC,yEAAyE;QACtH,MAAM,aAAa,GAAe,EAAE,CAAA;QACpC,MAAM,+BAA+B,GAAsD,EAAE,CAAA;QAC7F,MAAM,oBAAoB,GAAG,CAAC,QAAkB,EAAE,EAAE;YAChD,MAAM,eAAe,GAAG,UAAU,CAAiC,+BAA+B,EAAE,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;YAC7H,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBACrC,eAAe,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,IAAI,CAAA;gBACxC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YAChC,CAAC;QACL,CAAC,CAAA;QAED,MAAM,KAAK,GAAG,CAAC,IAAQ,EAAE,MAAW,EAAE,EAAE;YACpC,IAAI,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,CAAC;gBACjB,OAAM;YACV,CAAC;YAED,MAAM,UAAU,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAA;YAC5C,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAA;YACpC,oBAAoB,CAAC,QAAQ,CAAC,CAAA;YAC9B,MAAM,cAAc,GAAoB;gBACpC,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,UAAU,EAAE,UAAU,CAAC,WAAW,EAAE;gBACpC,UAAU,EAAE,EAAE;gBACd,YAAY,EAAE,EAAE;gBAChB,UAAU,EAAE,EAAE;gBACd,WAAW,EAAE,EAAE;gBACf,MAAM,EAAE,IAAI;aACf,CAAA;YACD,eAAe,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;YACpC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAA;YACnB,qBAAqB,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;gBAClD,MAAM,KAAK,GAAG,MAAM,CAAC,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;gBACnD,MAAM,eAAe,GAAG,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAA;gBACnD,oBAAoB,CAAC,eAAe,CAAC,CAAA;gBACrC,MAAM,kBAAkB,GAAG,cAAc,CAAC,OAAO,CAAC,CAAA;gBAClD,IAAI,OAAO,YAAY,QAAQ,EAAE,CAAC;oBAC9B,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,sBAAsB,EAAE,CAAC;wBACjD,0GAA0G;wBAC1G,OAAM;oBACV,CAAC;oBACD,MAAM,YAAY,GAAG,CAAC,GAAG,EAAE;wBACvB,2CAA2C;wBAC3C,IAAI,OAAO,CAAC,IAAI,YAAY,aAAa,EAAE,CAAC;4BACxC,OAAO,uBAAuB,CAAC,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;wBACjE,CAAC;wBACD,IAAI,OAAO,CAAC,IAAI,YAAY,WAAW,EAAE,CAAC;4BACtC,OAAO,MAAM,CAAC,sBAAsB,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,CAAA;wBAClE,CAAC;wBACD,OAAO,SAAS,CAAA;oBACpB,CAAC,CAAC,EAAE,CAAA;oBACJ,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC;wBAC3B,QAAQ,EAAE,kBAAkB;wBAC5B,KAAK,EAAG,YAAuB,IAAI,IAAI,CAAC,sBAAsB;qBACjE,CAAC,CAAA;oBACF,OAAM;gBACV,CAAC;gBACD,IAAI,OAAO,YAAY,WAAW,EAAE,CAAC;oBACjC,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAkB,CAAA;oBAChD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,sBAAsB,EAAE,CAAC;wBACnD,OAAM;oBACV,CAAC;oBACD,cAAc,CAAC,YAAY,CAAC,IAAI,CAAC;wBAC7B,WAAW,EAAE,kBAAkB;wBAC/B,QAAQ,EAAE,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;6BAClC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,OAAiB,CAAC;qBACzC,CAAC,CAAA;oBACF,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE;wBAC3B,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;4BACvB,KAAK,CAAC,WAAW,EAAE,IAAI,CAAC,CAAA;wBAC5B,CAAC;oBACL,CAAC,CAAC,CAAA;oBACF,OAAM;gBACV,CAAC;gBACD,IAAI,OAAO,YAAY,SAAS,EAAE,CAAC;oBAC/B,qHAAqH;oBACrH,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAkB,CAAA;oBAC/C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,sBAAsB,EAAE,CAAC;wBAClD,OAAM;oBACV,CAAC;oBACD,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC;wBAC3B,SAAS,EAAE,kBAAkB;wBAC7B,OAAO,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC,iCAAiC;6BAC3D,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAO,CAAC;6BACjB,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;4BACP,WAAW,EACP,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI;4BACrF,SAAS,EAAE,CAAC,CAAC,EAAE;yBAClB,CAAC,CAAC;qBACV,CAAC,CAAA;oBACF,OAAM;gBACV,CAAC;YACL,CAAC,CAAC,CAAA;YAEF,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,WAAW,CAAS,CAAA,CAAC,+EAA+E;YACrI,cAAc,CAAC,WAAW,GAAG,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,CAAA;YACzE,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAA;YAE1D,cAAc,CAAC,MAAM,GAAG,MAAM,EAAE,EAAE,IAAI,IAAI,CAAA,CAAC,sBAAsB;QACrE,CAAC,CAAA;QAED,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAA;QAE7C,OAAO;YACH,0BAA0B,EAAE,iCAAiC;YAC7D,SAAS,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;YACtE,KAAK,EAAE,eAAe;SACzB,CAAA;IACL,CAAC,CAAA;AACL,CAAC,CAAA;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAC1B,KAAW,EACX,MAAkB,EAClB,gCAAiF,EACjE,EAAE,CAClB,cAAc,CACV,MAAM,EACN,yBAAyB,CAAC,gCAAgC,CAAC;IACvD,CAAC,CAAC;QACE,uBAAuB,EAAE,gCAAgC;KAC5D;IACD,CAAC,CAAC,gCAAgC,CACzC,CAAC,KAAK,CAAC,CAAA"}
package/package.json CHANGED
@@ -1,33 +1,33 @@
1
1
  {
2
- "name": "@lionweb/core",
3
- "version": "0.7.0-beta.2",
4
- "description": "LionWeb core for {Java|Type}Script",
5
- "main": "dist/index.js",
6
- "types": "dist/index.d.ts",
7
- "typings": "dist/index.d.ts",
8
- "type": "module",
9
- "license": "Apache-2.0",
10
- "repository": {
11
- "type": "git",
12
- "url": "git+https://github.com/LionWeb-io/lionweb-typescript.git"
13
- },
14
- "bugs": {
15
- "url": "https://github.com/LionWeb-io/lionweb-typescript/issues"
16
- },
17
- "scripts": {
18
- "clean": "rm -rf dist/ node_modules/ lionweb-core-*.tgz",
19
- "build": "tsc",
20
- "lint": "eslint src",
21
- "prep:pre-release": "npm run clean && npm install && npm run build",
22
- "prerelease-alpha": "npm run prep:pre-release",
23
- "release-alpha": "npm publish --tag alpha",
24
- "prerelease-beta": "npm run prep:pre-release",
25
- "release-beta": "npm publish --tag beta",
26
- "prerelease": "npm run prep:pre-release",
27
- "release": "npm publish"
28
- },
29
- "dependencies": {
30
- "@lionweb/json": "0.7.0-beta.2",
31
- "@lionweb/ts-utils": "0.7.0-beta.2"
32
- }
2
+ "name": "@lionweb/core",
3
+ "version": "0.7.0-beta.20",
4
+ "description": "LionWeb core for {Java|Type}Script",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "typings": "dist/index.d.ts",
8
+ "type": "module",
9
+ "license": "Apache-2.0",
10
+ "repository": {
11
+ "type": "git",
12
+ "url": "git+https://github.com/LionWeb-io/lionweb-typescript.git"
13
+ },
14
+ "bugs": {
15
+ "url": "https://github.com/LionWeb-io/lionweb-typescript/issues"
16
+ },
17
+ "scripts": {
18
+ "clean": "npx rimraf dist node_modules -g lionweb-core-*.tgz",
19
+ "build": "tsc",
20
+ "lint": "eslint src",
21
+ "prep:pre-release": "npm run clean && npm install && npm run build",
22
+ "prerelease-alpha": "npm run prep:pre-release",
23
+ "release-alpha": "npm publish --tag alpha",
24
+ "prerelease-beta": "npm run prep:pre-release",
25
+ "release-beta": "npm publish --tag beta",
26
+ "prerelease": "npm run prep:pre-release",
27
+ "release": "npm publish"
28
+ },
29
+ "dependencies": {
30
+ "@lionweb/json": "0.7.0-beta.20",
31
+ "@lionweb/ts-utils": "0.7.0-beta.20"
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
+
@@ -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
+