@lionweb/utilities 0.6.1 → 0.6.3

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/README.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # The `utilities` package
2
2
 
3
+ [![license](https://img.shields.io/badge/License-Apache%202.0-green.svg?style=flat)
4
+ ](./LICENSE)
5
+ [![CI](https://github.com/LionWeb-io/lionweb-typescript/actions/workflows/test.yaml/badge.svg)
6
+ ](https://github.com/LionWeb-io/lionweb-typescript/actions/workflows/test.yaml)
7
+ [![npm](https://img.shields.io/npm/v/%40lionweb%2Futilities?label=%40lionweb%2Futilities)
8
+ ](https://www.npmjs.com/package/@lionweb/utilities)
9
+
3
10
  An NPM package that can be added to a Node.js/NPM codebase as follows:
4
11
 
5
12
  ```shell
@@ -15,6 +22,14 @@ It contains utilities on top of the `core` package, such as:
15
22
 
16
23
  ## Changelog
17
24
 
25
+ ### 0.6.3
26
+
27
+ * Add a `inferLanguagesFromChunk` function that infers a language from a serialization chunk.
28
+
29
+ ### 0.6.2
30
+
31
+ * Add a function `measure` that computes metrics on a serialization chunk.
32
+
18
33
  ### 0.6.1
19
34
 
20
35
  * Improve PlantUML and Mermaid diagram generation:
package/dist/index.d.ts CHANGED
@@ -2,4 +2,5 @@ export * from "./hashing.js";
2
2
  export * from "./json.js";
3
3
  export * from "./m3/index.js";
4
4
  export * from "./serialization/index.js";
5
+ export * from "./inferLanguages.js";
5
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAA;AAC5B,cAAc,WAAW,CAAA;AACzB,cAAc,eAAe,CAAA;AAC7B,cAAc,0BAA0B,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAA;AAC5B,cAAc,WAAW,CAAA;AACzB,cAAc,eAAe,CAAA;AAC7B,cAAc,0BAA0B,CAAA;AACxC,cAAc,qBAAqB,CAAA"}
package/dist/index.js CHANGED
@@ -2,4 +2,5 @@ export * from "./hashing.js";
2
2
  export * from "./json.js";
3
3
  export * from "./m3/index.js";
4
4
  export * from "./serialization/index.js";
5
+ export * from "./inferLanguages.js";
5
6
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAA;AAC5B,cAAc,WAAW,CAAA;AACzB,cAAc,eAAe,CAAA;AAC7B,cAAc,0BAA0B,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAA;AAC5B,cAAc,WAAW,CAAA;AACzB,cAAc,eAAe,CAAA;AAC7B,cAAc,0BAA0B,CAAA;AACxC,cAAc,qBAAqB,CAAA"}
@@ -0,0 +1,4 @@
1
+ import { Language, SerializationChunk } from "@lionweb/core";
2
+ export declare function inferLanguagesFromChunk(chunk: SerializationChunk): Language[];
3
+ export declare function deriveLikelyPropertyName(key: string): string;
4
+ //# sourceMappingURL=inferLanguages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inferLanguages.d.ts","sourceRoot":"","sources":["../src/inferLanguages.ts"],"names":[],"mappings":"AAAA,OAAO,EAGH,QAAQ,EAIR,kBAAkB,EAMrB,MAAM,eAAe,CAAA;AAUtB,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,kBAAkB,GAAG,QAAQ,EAAE,CAmG7E;AAUD,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,MAAM,UASnD"}
@@ -0,0 +1,100 @@
1
+ import { Concept, Containment, Language, Property, Reference, asArray, builtinPrimitives, chain, concatenator, lastOf } from "@lionweb/core";
2
+ import { hasher } from "./hashing.js";
3
+ const possibleKeySeparators = ["-", "_"];
4
+ const id = chain(concatenator("-"), hasher());
5
+ const key = lastOf;
6
+ const { stringDatatype, booleanDatatype, integerDatatype } = builtinPrimitives;
7
+ export function inferLanguagesFromChunk(chunk) {
8
+ const languages = new Map();
9
+ const concepts = new Map();
10
+ const links = new Array();
11
+ for (const chunkLanguage of chunk.languages) {
12
+ const languageName = chunkLanguage.key;
13
+ const language = new Language(languageName, chunkLanguage.version, id(languageName), key(languageName));
14
+ languages.set(languageName, language);
15
+ }
16
+ for (const node of chunk.nodes) {
17
+ const languageName = node.classifier.language;
18
+ const entityName = node.classifier.key;
19
+ const language = getLanguage(languages, languageName);
20
+ if (language.entities.filter(entity => entity.key === entityName).length) {
21
+ continue;
22
+ }
23
+ const concept = new Concept(language, entityName, key(language.name, entityName), id(language.name, entityName), false);
24
+ language.havingEntities(concept);
25
+ concepts.set(node.id, concept);
26
+ for (const property of node.properties) {
27
+ const propertyName = deriveLikelyPropertyName(property.property.key);
28
+ if (concept.features.filter(feature => feature.key === propertyName).length) {
29
+ continue;
30
+ }
31
+ const feature = new Property(concept, propertyName, key(languageName, concept.name, propertyName), id(languageName, concept.name, propertyName)).havingKey(property.property.key);
32
+ if (isBoolean(property.value)) {
33
+ feature.ofType(booleanDatatype);
34
+ }
35
+ else if (isNumeric(property.value)) {
36
+ feature.ofType(integerDatatype);
37
+ }
38
+ else {
39
+ feature.ofType(stringDatatype);
40
+ }
41
+ concept.havingFeatures(feature);
42
+ }
43
+ for (const containment of node.containments) {
44
+ const containmentName = containment.containment.key;
45
+ if (concept.features.filter(feature => feature.key === containmentName).length) {
46
+ continue;
47
+ }
48
+ const children = asArray(containment.children);
49
+ const feature = new Containment(concept, containmentName, key(languageName, concept.name, containmentName), id(languageName, concept.name, containmentName));
50
+ if (children.length) {
51
+ feature.isMultiple();
52
+ }
53
+ concept.havingFeatures(feature);
54
+ links.push({ link: feature, conceptId: children[0] });
55
+ }
56
+ for (const reference of node.references) {
57
+ const referenceName = reference.reference.key;
58
+ if (concept.features.filter(feature => feature.key === referenceName).length) {
59
+ continue;
60
+ }
61
+ const feature = new Reference(concept, referenceName, key(languageName, concept.name, referenceName), id(languageName, concept.name, referenceName));
62
+ concept.havingFeatures(feature);
63
+ const value = reference.targets[0].reference;
64
+ links.push({ link: feature, conceptId: value });
65
+ }
66
+ }
67
+ for (const link of links) {
68
+ const linkedConcept = concepts.get(link.conceptId);
69
+ if (linkedConcept) {
70
+ link.link.ofType(linkedConcept);
71
+ }
72
+ else {
73
+ // Containment of primitive types??
74
+ }
75
+ }
76
+ return Array.from(languages.values());
77
+ }
78
+ function getLanguage(languages, languageName) {
79
+ const language = languages.get(languageName);
80
+ if (language === undefined) {
81
+ throw new Error(`Language '${languageName} is not exist in the languages section`);
82
+ }
83
+ return language;
84
+ }
85
+ export function deriveLikelyPropertyName(key) {
86
+ for (const separator of possibleKeySeparators) {
87
+ const name = key.split(separator)[2];
88
+ if (name) {
89
+ return name;
90
+ }
91
+ }
92
+ return key;
93
+ }
94
+ function isBoolean(value) {
95
+ return value === "true" || value === "false";
96
+ }
97
+ function isNumeric(value) {
98
+ return !isNaN(parseFloat(value));
99
+ }
100
+ //# sourceMappingURL=inferLanguages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inferLanguages.js","sourceRoot":"","sources":["../src/inferLanguages.ts"],"names":[],"mappings":"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"}
@@ -36,4 +36,5 @@ export const tryLoadAsLanguages = async (path) => {
36
36
  };
37
37
  export const tryLoadAllAsLanguages = async (paths) => (await Promise.all(paths.map(tryLoadAsLanguages))).flat();
38
38
  // TODO load languages “in dependency order”, i.e.: later-named languages can be dependent on earlier-named languages -- (this is a foldRight, really)
39
+ // TODO make names consistent: "load" vs. "read", "chunk" vs. "serialization chunk"
39
40
  //# sourceMappingURL=chunk.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"chunk.js","sourceRoot":"","sources":["../../src/serialization/chunk.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,iCAAiC,EACjC,oBAAoB,EAEpB,WAAW,EAEd,MAAM,eAAe,CAAA;AACtB,OAAO,EAAC,cAAc,EAAC,MAAM,YAAY,CAAA;AAGzC,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,EAAE,IAAY,EAAE,EAAE;IAC5C,IAAI,CAAC;QACD,OAAO,cAAc,CAAC,IAAI,CAAuB,CAAA;IACrD,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACT,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,2BAA2B,CAAC,CAAA;QACjD,MAAM,CAAC,CAAA;IACX,CAAC;AACL,CAAC,CAAA;AAGD,MAAM,QAAQ,GAAG,CAAC,IAAa,EAAmC,EAAE,CAChE,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;AAEpD,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,IAAa,EAAW,EAAE,CACnE,QAAQ,CAAC,IAAI,CAAC;OACX,IAAI,CAAC,4BAA4B,CAAC,KAAK,iCAAiC;OACxE,WAAW,IAAI,IAAI;OACnB,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;OAChC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,KAAK,WAAW,CAAC,CAAA;AAGlG;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,EAAE,IAAY,EAAuB,EAAE;IAC1E,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,CAAA;IACnC,IAAI,CAAC,4BAA4B,CAAC,KAAK,CAAC,EAAE,CAAC;QACvC,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,gEAAgE,CAAC,CAAA;QACtF,OAAO,EAAE,CAAA;IACb,CAAC;IACD,IAAI,CAAC;QACD,OAAO,oBAAoB,CAAC,KAAK,CAAC,CAAA;QAC1C,8DAA8D;IAC1D,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QACd,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,mEAAmE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAA;QACpG,OAAO,EAAE,CAAA;IACb,CAAC;AACL,CAAC,CAAA;AAGD,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,EAAE,KAAe,EAAuB,EAAE,CAChF,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;AAC7D,uJAAuJ"}
1
+ {"version":3,"file":"chunk.js","sourceRoot":"","sources":["../../src/serialization/chunk.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,iCAAiC,EACjC,oBAAoB,EAEpB,WAAW,EAEd,MAAM,eAAe,CAAA;AACtB,OAAO,EAAC,cAAc,EAAC,MAAM,YAAY,CAAA;AAGzC,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,EAAE,IAAY,EAAE,EAAE;IAC5C,IAAI,CAAC;QACD,OAAO,cAAc,CAAC,IAAI,CAAuB,CAAA;IACrD,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACT,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,2BAA2B,CAAC,CAAA;QACjD,MAAM,CAAC,CAAA;IACX,CAAC;AACL,CAAC,CAAA;AAGD,MAAM,QAAQ,GAAG,CAAC,IAAa,EAAmC,EAAE,CAChE,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;AAEpD,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,IAAa,EAAW,EAAE,CACnE,QAAQ,CAAC,IAAI,CAAC;OACX,IAAI,CAAC,4BAA4B,CAAC,KAAK,iCAAiC;OACxE,WAAW,IAAI,IAAI;OACnB,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;OAChC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,KAAK,WAAW,CAAC,CAAA;AAGlG;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,EAAE,IAAY,EAAuB,EAAE;IAC1E,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,CAAA;IACnC,IAAI,CAAC,4BAA4B,CAAC,KAAK,CAAC,EAAE,CAAC;QACvC,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,gEAAgE,CAAC,CAAA;QACtF,OAAO,EAAE,CAAA;IACb,CAAC;IACD,IAAI,CAAC;QACD,OAAO,oBAAoB,CAAC,KAAK,CAAC,CAAA;QAC1C,8DAA8D;IAC1D,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QACd,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,mEAAmE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAA;QACpG,OAAO,EAAE,CAAA;IACb,CAAC;AACL,CAAC,CAAA;AAGD,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,EAAE,KAAe,EAAuB,EAAE,CAChF,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;AAC7D,uJAAuJ;AAGvJ,oFAAoF"}
@@ -1,4 +1,5 @@
1
1
  export { looksLikeSerializedLanguages, readChunk, tryLoadAllAsLanguages, tryLoadAsLanguages } from "./chunk.js";
2
+ export { measure } from "./measurer.js";
2
3
  export { orderedSerializationChunk } from "./ordering.js";
3
4
  export { sortedSerializationChunk } from "./sorting.js";
4
5
  export { genericAsTreeText } from "./textualizer.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/serialization/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,4BAA4B,EAAE,SAAS,EAAE,qBAAqB,EAAE,kBAAkB,EAAC,MAAM,YAAY,CAAA;AAC7G,OAAO,EAAC,yBAAyB,EAAC,MAAM,eAAe,CAAA;AACvD,OAAO,EAAC,wBAAwB,EAAC,MAAM,cAAc,CAAA;AACrD,OAAO,EAAC,iBAAiB,EAAC,MAAM,kBAAkB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/serialization/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,4BAA4B,EAAE,SAAS,EAAE,qBAAqB,EAAE,kBAAkB,EAAC,MAAM,YAAY,CAAA;AAC7G,OAAO,EAAC,OAAO,EAAC,MAAM,eAAe,CAAA;AACrC,OAAO,EAAC,yBAAyB,EAAC,MAAM,eAAe,CAAA;AACvD,OAAO,EAAC,wBAAwB,EAAC,MAAM,cAAc,CAAA;AACrD,OAAO,EAAC,iBAAiB,EAAC,MAAM,kBAAkB,CAAA"}
@@ -1,4 +1,5 @@
1
1
  export { looksLikeSerializedLanguages, readChunk, tryLoadAllAsLanguages, tryLoadAsLanguages } from "./chunk.js";
2
+ export { measure } from "./measurer.js";
2
3
  export { orderedSerializationChunk } from "./ordering.js";
3
4
  export { sortedSerializationChunk } from "./sorting.js";
4
5
  export { genericAsTreeText } from "./textualizer.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/serialization/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,4BAA4B,EAAE,SAAS,EAAE,qBAAqB,EAAE,kBAAkB,EAAC,MAAM,YAAY,CAAA;AAC7G,OAAO,EAAC,yBAAyB,EAAC,MAAM,eAAe,CAAA;AACvD,OAAO,EAAC,wBAAwB,EAAC,MAAM,cAAc,CAAA;AACrD,OAAO,EAAC,iBAAiB,EAAC,MAAM,kBAAkB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/serialization/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,4BAA4B,EAAE,SAAS,EAAE,qBAAqB,EAAE,kBAAkB,EAAC,MAAM,YAAY,CAAA;AAC7G,OAAO,EAAC,OAAO,EAAC,MAAM,eAAe,CAAA;AACrC,OAAO,EAAC,yBAAyB,EAAC,MAAM,eAAe,CAAA;AACvD,OAAO,EAAC,wBAAwB,EAAC,MAAM,cAAc,CAAA;AACrD,OAAO,EAAC,iBAAiB,EAAC,MAAM,kBAAkB,CAAA"}
@@ -0,0 +1,21 @@
1
+ import { Language, MetaPointer, SerializationChunk } from "@lionweb/core";
2
+ type ClassifierInstantiationMetric = {
3
+ key: string;
4
+ language: string;
5
+ version: string;
6
+ name?: string;
7
+ count: number;
8
+ };
9
+ type Metrics = {
10
+ instantiations: ClassifierInstantiationMetric[];
11
+ unusedConcreteConcepts: MetaPointer[];
12
+ };
13
+ /**
14
+ * Computes {@link Metrics metrics} on the given {@link SerializationChunk serializationChunk}.
15
+ * Passing it {@link Language languages} make this language-aware:
16
+ * * classifier names are looked up,
17
+ * * unused concrete concepts are computed as well.
18
+ */
19
+ export declare const measure: (serializationChunk: SerializationChunk, languages: Language[]) => Metrics;
20
+ export {};
21
+ //# sourceMappingURL=measurer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"measurer.d.ts","sourceRoot":"","sources":["../../src/serialization/measurer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,QAAQ,EAAwB,WAAW,EAAE,kBAAkB,EAAC,MAAM,eAAe,CAAA;AAGlH,KAAK,6BAA6B,GAAG;IACjC,GAAG,EAAE,MAAM,CAAA;IACX,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;CAEhB,CAAA;AAED,KAAK,OAAO,GAAG;IACX,cAAc,EAAE,6BAA6B,EAAE,CAAA;IAC/C,sBAAsB,EAAE,WAAW,EAAE,CAAA;CACxC,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,OAAO,uBAAwB,kBAAkB,aAAa,QAAQ,EAAE,KAAG,OA0BvF,CAAA"}
@@ -0,0 +1,30 @@
1
+ import { conceptsOf, groupBy, MemoisingSymbolTable } from "@lionweb/core";
2
+ /**
3
+ * Computes {@link Metrics metrics} on the given {@link SerializationChunk serializationChunk}.
4
+ * Passing it {@link Language languages} make this language-aware:
5
+ * * classifier names are looked up,
6
+ * * unused concrete concepts are computed as well.
7
+ */
8
+ export const measure = (serializationChunk, languages) => {
9
+ const symbolTable = new MemoisingSymbolTable(languages);
10
+ const metaPointerAsText = (classifier) => `${classifier.key}:${classifier.language}:${classifier.version}`;
11
+ // group nodes by classifier key, language, and version:
12
+ const groupedInstantiations = groupBy(serializationChunk.nodes, ({ classifier }) => metaPointerAsText(classifier));
13
+ // map grouped nodes to instantiations with count:
14
+ const instantiations = Object.values(groupedInstantiations).map((nodes) => ({
15
+ ...nodes[0].classifier,
16
+ name: symbolTable.entityMatching(nodes[0].classifier)?.name,
17
+ count: nodes.length
18
+ }));
19
+ // compute all concrete concepts for the language:
20
+ const concreteConcepts = languages.flatMap(conceptsOf).filter((concept) => !concept.abstract);
21
+ const unusedConcreteConcepts = concreteConcepts
22
+ .map((concept) => concept.metaPointer())
23
+ .filter((metaPointer) => !(metaPointerAsText(metaPointer) in groupedInstantiations));
24
+ // return the metrics object:
25
+ return {
26
+ instantiations,
27
+ unusedConcreteConcepts
28
+ };
29
+ };
30
+ //# sourceMappingURL=measurer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"measurer.js","sourceRoot":"","sources":["../../src/serialization/measurer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAE,OAAO,EAAY,oBAAoB,EAAkC,MAAM,eAAe,CAAA;AAiBlH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,kBAAsC,EAAE,SAAqB,EAAW,EAAE;IAC9F,MAAM,WAAW,GAAG,IAAI,oBAAoB,CAAC,SAAS,CAAC,CAAA;IAEvD,MAAM,iBAAiB,GAAG,CAAC,UAAuB,EAAE,EAAE,CAAC,GAAG,UAAU,CAAC,GAAG,IAAI,UAAU,CAAC,QAAQ,IAAI,UAAU,CAAC,OAAO,EAAE,CAAA;IAEvH,wDAAwD;IACxD,MAAM,qBAAqB,GAAG,OAAO,CAAC,kBAAkB,CAAC,KAAK,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC,CAAA;IAElH,kDAAkD;IAClD,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACxE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU;QACtB,IAAI,EAAE,WAAW,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,IAAI;QAC3D,KAAK,EAAE,KAAK,CAAC,MAAM;KACtB,CAAC,CAAC,CAAA;IAEH,kDAAkD;IAClD,MAAM,gBAAgB,GAAG,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;IAC7F,MAAM,sBAAsB,GAAG,gBAAgB;SAC1C,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;SACvC,MAAM,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC,iBAAiB,CAAC,WAAW,CAAC,IAAI,qBAAqB,CAAC,CAAC,CAAA;IAExF,6BAA6B;IAC7B,OAAO;QACH,cAAc;QACd,sBAAsB;KACzB,CAAA;AACL,CAAC,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lionweb/utilities",
3
- "version": "0.6.1",
3
+ "version": "0.6.3",
4
4
  "description": "LionWeb utilities",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -15,7 +15,7 @@
15
15
  "url": "https://github.com/LionWeb-io/lionweb-typescript/issues"
16
16
  },
17
17
  "dependencies": {
18
- "@lionweb/core": "0.6.1",
18
+ "@lionweb/core": "0.6.3",
19
19
  "littoral-templates": "0.2.2",
20
20
  "nanoid": "4.0.2"
21
21
  },