@stemy/backend 2.6.1 → 2.7.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.
Files changed (117) hide show
  1. package/README.md +2 -2
  2. package/bundles/stemy-backend.umd.js +5553 -5465
  3. package/bundles/stemy-backend.umd.js.map +1 -1
  4. package/bundles/stemy-backend.umd.min.js +1 -1
  5. package/bundles/stemy-backend.umd.min.js.map +1 -1
  6. package/common-types.d.ts +226 -214
  7. package/esm2015/common-types.js +18 -18
  8. package/esm2015/public_api.js +338 -338
  9. package/esm2015/rest-controllers/assets.controller.js +116 -116
  10. package/esm2015/rest-controllers/auth.controller.js +75 -75
  11. package/esm2015/rest-controllers/gallery.controller.js +37 -37
  12. package/esm2015/rest-controllers/progresses.controller.js +57 -57
  13. package/esm2015/rest-middlewares/container.middleware.js +32 -32
  14. package/esm2015/rest-middlewares/error-handler.middleware.js +83 -83
  15. package/esm2015/rest-middlewares/language.middleware.js +28 -28
  16. package/esm2015/rest-middlewares/request-ended.middleware.js +25 -25
  17. package/esm2015/rest-middlewares/request-started.middleware.js +24 -24
  18. package/esm2015/rest-openapi.js +44 -44
  19. package/esm2015/services/asset-processor.js +101 -101
  20. package/esm2015/services/asset-resolver.js +53 -53
  21. package/esm2015/services/assets.js +110 -110
  22. package/esm2015/services/backend-provider.js +32 -32
  23. package/esm2015/services/cache-processor.js +34 -34
  24. package/esm2015/services/cache.js +94 -94
  25. package/esm2015/services/configuration.js +55 -55
  26. package/esm2015/services/endpoint-provider.js +29 -29
  27. package/esm2015/services/entities/asset.js +166 -112
  28. package/esm2015/services/entities/lazy-asset.js +93 -93
  29. package/esm2015/services/entities/progress.js +181 -181
  30. package/esm2015/services/fixtures.js +45 -45
  31. package/esm2015/services/gallery-cache.js +36 -36
  32. package/esm2015/services/gallery-image.js +48 -48
  33. package/esm2015/services/gallery.js +138 -138
  34. package/esm2015/services/id-generator.js +63 -63
  35. package/esm2015/services/job-manager.js +203 -203
  36. package/esm2015/services/lazy-assets.js +74 -74
  37. package/esm2015/services/mail-sender.js +59 -59
  38. package/esm2015/services/memory-cache.js +84 -84
  39. package/esm2015/services/mongo-connector.js +61 -61
  40. package/esm2015/services/progresses.js +91 -91
  41. package/esm2015/services/template-renderer.js +89 -89
  42. package/esm2015/services/translation-provider.js +31 -31
  43. package/esm2015/services/translator.js +85 -85
  44. package/esm2015/services/user-manager.js +47 -47
  45. package/esm2015/socket-controllers/progress.controller.js +82 -82
  46. package/esm2015/socket-middlewares/compression.middleware.js +19 -19
  47. package/esm2015/static.js +33 -33
  48. package/esm2015/stemy-backend.js +4 -4
  49. package/esm2015/utilities/di-container.js +84 -84
  50. package/esm2015/utilities/lazy-asset-generator.js +40 -40
  51. package/esm2015/utilities/tree.js +111 -111
  52. package/esm2015/utils.js +618 -601
  53. package/esm2015/validators.js +51 -51
  54. package/fesm2015/stemy-backend.js +3656 -3585
  55. package/fesm2015/stemy-backend.js.map +1 -1
  56. package/package.json +1 -1
  57. package/public_api.d.ts +33 -33
  58. package/rest-controllers/assets.controller.d.ts +16 -16
  59. package/rest-controllers/auth.controller.d.ts +14 -14
  60. package/rest-controllers/gallery.controller.d.ts +7 -7
  61. package/rest-controllers/progresses.controller.d.ts +9 -9
  62. package/rest-middlewares/container.middleware.d.ts +8 -8
  63. package/rest-middlewares/error-handler.middleware.d.ts +13 -13
  64. package/rest-middlewares/language.middleware.d.ts +8 -8
  65. package/rest-middlewares/request-ended.middleware.d.ts +5 -5
  66. package/rest-middlewares/request-started.middleware.d.ts +5 -5
  67. package/rest-openapi.d.ts +3 -3
  68. package/services/asset-processor.d.ts +12 -12
  69. package/services/asset-resolver.d.ts +9 -9
  70. package/services/assets.d.ts +19 -19
  71. package/services/backend-provider.d.ts +11 -11
  72. package/services/cache-processor.d.ts +4 -4
  73. package/services/cache.d.ts +23 -23
  74. package/services/configuration.d.ts +10 -10
  75. package/services/endpoint-provider.d.ts +4 -4
  76. package/services/entities/asset.d.ts +25 -23
  77. package/services/entities/lazy-asset.d.ts +29 -29
  78. package/services/entities/progress.d.ts +49 -49
  79. package/services/fixtures.d.ts +6 -6
  80. package/services/gallery-cache.d.ts +9 -9
  81. package/services/gallery-image.d.ts +11 -11
  82. package/services/gallery.d.ts +13 -13
  83. package/services/id-generator.d.ts +11 -11
  84. package/services/job-manager.d.ts +27 -27
  85. package/services/lazy-assets.d.ts +19 -19
  86. package/services/mail-sender.d.ts +20 -20
  87. package/services/memory-cache.d.ts +10 -10
  88. package/services/mongo-connector.d.ts +14 -14
  89. package/services/progresses.d.ts +18 -18
  90. package/services/template-renderer.d.ts +14 -14
  91. package/services/translation-provider.d.ts +10 -10
  92. package/services/translator.d.ts +15 -15
  93. package/services/user-manager.d.ts +6 -6
  94. package/socket-controllers/progress.controller.d.ts +10 -10
  95. package/socket-middlewares/compression.middleware.d.ts +4 -4
  96. package/static.d.ts +2 -2
  97. package/stemy-backend.d.ts +4 -4
  98. package/stemy-backend.metadata.json +1 -1
  99. package/utilities/di-container.d.ts +43 -43
  100. package/utilities/lazy-asset-generator.d.ts +15 -15
  101. package/utilities/tree.d.ts +14 -14
  102. package/utils.d.ts +76 -73
  103. package/validators.d.ts +7 -7
  104. package/di-container.d.ts +0 -40
  105. package/esm2015/di-container.js +0 -75
  106. package/esm2015/models/lazy-asset.js +0 -12
  107. package/esm2015/models/progress.js +0 -23
  108. package/esm2015/rest-middlewares/injector.middleware.js +0 -26
  109. package/esm2015/services/lazy-asset-helper.js +0 -74
  110. package/esm2015/services/logger.js +0 -14
  111. package/esm2015/services/progress-helper.js +0 -168
  112. package/models/lazy-asset.d.ts +0 -45
  113. package/models/progress.d.ts +0 -56
  114. package/rest-middlewares/injector.middleware.d.ts +0 -8
  115. package/services/lazy-asset-helper.d.ts +0 -15
  116. package/services/logger.d.ts +0 -2
  117. package/services/progress-helper.d.ts +0 -37
@@ -1,111 +1,111 @@
1
- import { isString } from "../utils";
2
- export class Tree {
3
- constructor(container, path) {
4
- this.container = container;
5
- this.path = path;
6
- this.map = new Map();
7
- }
8
- get parentTree() {
9
- return this.container.parent.tree;
10
- }
11
- resolveService() {
12
- return this.container.resolve(this.path);
13
- }
14
- resolveLeaves() {
15
- let map;
16
- try {
17
- const parentTree = this.parentTree.resolvePath(this.path);
18
- map = parentTree.resolveLeaves();
19
- }
20
- catch (e) {
21
- map = new Map();
22
- }
23
- const visitor = (treeMap, path) => {
24
- treeMap.forEach((tree, key) => {
25
- const subKey = !path ? key : `${path}.${key}`;
26
- if (tree.map.size == 0) {
27
- map.set(subKey, tree);
28
- return;
29
- }
30
- visitor(tree.map, subKey);
31
- });
32
- };
33
- visitor(this.map, "");
34
- return map;
35
- }
36
- resolveServices() {
37
- const map = new Map();
38
- this.resolveLeaves().forEach((leaf, key) => {
39
- map.set(key, leaf.resolveService());
40
- });
41
- return map;
42
- }
43
- resolveAncestor(path) {
44
- if (!isString(path) || path.length == 0) {
45
- return this;
46
- }
47
- let parentTree;
48
- try {
49
- parentTree = this.parentTree.resolvePath(this.path);
50
- parentTree = parentTree.resolveAncestor(path);
51
- }
52
- catch (e) {
53
- parentTree = new Tree(this.container, "");
54
- }
55
- const pathParts = path.split(".");
56
- let tree = this;
57
- let previousTree = this;
58
- for (let part of pathParts) {
59
- tree = tree.map.get(part);
60
- if (!tree) {
61
- if (previousTree == this) {
62
- if (parentTree.path.length > 0) {
63
- return parentTree;
64
- }
65
- throw new Error(`Ancestor '${path}' not found in current tree: '${this.path}'`);
66
- }
67
- return previousTree;
68
- }
69
- previousTree = tree;
70
- }
71
- return parentTree.path.length > previousTree.path.length
72
- ? parentTree : previousTree;
73
- }
74
- resolvePath(path, throwError = true) {
75
- const absolutePath = !this.path ? path : `${this.path}.${path}`;
76
- let tree = new Tree(this.container, absolutePath);
77
- try {
78
- tree = this.resolveAncestor(path);
79
- }
80
- catch (e) {
81
- if (throwError) {
82
- throw new Error(`Path '${path}' not found in current tree: '${this.path}'`);
83
- }
84
- return tree;
85
- }
86
- if (tree.path !== absolutePath) {
87
- if (throwError) {
88
- throw new Error(`Path '${path}' not found in current tree: '${this.path}'`);
89
- }
90
- return tree;
91
- }
92
- return tree;
93
- }
94
- addPath(path) {
95
- if (!isString(path) || path.length == 0) {
96
- return this;
97
- }
98
- const pathParts = path.split(".");
99
- let tree = this;
100
- path = this.path;
101
- for (let part of pathParts) {
102
- if (!tree.map.has(part)) {
103
- tree.map.set(part, new Tree(this.container, !path ? part : `${path}.${part}`));
104
- }
105
- tree = tree.map.get(part);
106
- path = tree.path;
107
- }
108
- return this;
109
- }
110
- }
111
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlsaXRpZXMvdHJlZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBRWxDLE1BQU0sT0FBTyxJQUFJO0lBUWIsWUFBc0IsU0FBK0IsRUFBVyxJQUFZO1FBQXRELGNBQVMsR0FBVCxTQUFTLENBQXNCO1FBQVcsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUN4RSxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxFQUFnQixDQUFDO0lBQ3ZDLENBQUM7SUFORCxJQUFjLFVBQVU7UUFDcEIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7SUFDdEMsQ0FBQztJQU1ELGNBQWM7UUFDVixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQsYUFBYTtRQUNULElBQUksR0FBdUIsQ0FBQztRQUM1QixJQUFJO1lBQ0EsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzFELEdBQUcsR0FBRyxVQUFVLENBQUMsYUFBYSxFQUFFLENBQUM7U0FDcEM7UUFBQyxPQUFPLENBQUMsRUFBRTtZQUNSLEdBQUcsR0FBRyxJQUFJLEdBQUcsRUFBaUIsQ0FBQztTQUNsQztRQUNELE1BQU0sT0FBTyxHQUFHLENBQUMsT0FBMEIsRUFBRSxJQUFZLEVBQUUsRUFBRTtZQUN6RCxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxFQUFFO2dCQUMxQixNQUFNLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksSUFBSSxHQUFHLEVBQUUs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LENBQUMsQ0FBQztZQUMxQixJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztTQUNwQjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SURlcGVuZGVuY3lDb250YWluZXIsIElUcmVlfSBmcm9tIFwiLi4vY29tbW9uLXR5cGVzXCI7XG5pbXBvcnQge2lzU3RyaW5nfSBmcm9tIFwiLi4vdXRpbHNcIjtcblxuZXhwb3J0IGNsYXNzIFRyZWUgaW1wbGVtZW50cyBJVHJlZSB7XG5cbiAgICBwcm90ZWN0ZWQgbWFwOiBNYXA8c3RyaW5nLCBUcmVlPjtcblxuICAgIHByb3RlY3RlZCBnZXQgcGFyZW50VHJlZSgpOiBJVHJlZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5lci5wYXJlbnQudHJlZTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgY29udGFpbmVyOiBJRGVwZW5kZW5jeUNvbnRhaW5lciwgcmVhZG9ubHkgcGF0aDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMubWFwID0gbmV3IE1hcDxzdHJpbmcsIFRyZWU+KCk7XG4gICAgfVxuXG4gICAgcmVzb2x2ZVNlcnZpY2UoKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyLnJlc29sdmUodGhpcy5wYXRoKTtcbiAgICB9XG5cbiAgICByZXNvbHZlTGVhdmVzKCk6IE1hcDxzdHJpbmcsIElUcmVlPiB7XG4gICAgICAgIGxldCBtYXA6IE1hcDxzdHJpbmcsIElUcmVlPjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudFRyZWUgPSB0aGlzLnBhcmVudFRyZWUucmVzb2x2ZVBhdGgodGhpcy5wYXRoKTtcbiAgICAgICAgICAgIG1hcCA9IHBhcmVudFRyZWUucmVzb2x2ZUxlYXZlcygpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBtYXAgPSBuZXcgTWFwPHN0cmluZywgSVRyZWU+KCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmlzaXRvciA9ICh0cmVlTWFwOiBNYXA8c3RyaW5nLCBUcmVlPiwgcGF0aDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICB0cmVlTWFwLmZvckVhY2goKHRyZWUsIGtleSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN1YktleSA9ICFwYXRoID8ga2V5IDogYCR7cGF0aH0uJHtrZXl9YDtcbiAgICAgICAgICAgICAgICBpZiAodHJlZS5tYXAuc2l6ZSA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIG1hcC5zZXQoc3ViS2V5LCB0cmVlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2aXNpdG9yKHRyZWUubWFwLCBzdWJLZXkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIHZpc2l0b3IodGhpcy5tYXAsIFwiXCIpO1xuICAgICAgICByZXR1cm4gbWFwO1xuICAgIH1cblxuICAgIHJlc29sdmVTZXJ2aWNlcygpOiBNYXA8c3RyaW5nLCBhbnk+IHtcbiAgICAgICAgY29uc3QgbWFwID0gbmV3IE1hcDxzdHJpbmcsIGFueT4oKTtcbiAgICAgICAgdGhpcy5yZXNvbHZlTGVhdmVzKCkuZm9yRWFjaCgobGVhZiwga2V5KSA9PiB7XG4gICAgICAgICAgICBtYXAuc2V0KGtleSwgbGVhZi5yZXNvbHZlU2VydmljZSgpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBtYXA7XG4gICAgfVxuXG4gICAgcmVzb2x2ZUFuY2VzdG9yKHBhdGg6IHN0cmluZyk6IElUcmVlIHtcbiAgICAgICAgaWYgKCFpc1N0cmluZyhwYXRoKSB8fCBwYXRoLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICBsZXQgcGFyZW50VHJlZTogSVRyZWU7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBwYXJlbnRUcmVlID0gdGhpcy5wYXJlbnRUcmVlLnJlc29sdmVQYXRoKHRoaXMucGF0aCk7XG4gICAgICAgICAgICBwYXJlbnRUcmVlID0gcGFyZW50VHJlZS5yZXNvbHZlQW5jZXN0b3IocGF0aCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHBhcmVudFRyZWUgPSBuZXcgVHJlZSh0aGlzLmNvbnRhaW5lciwgXCJcIik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGF0aFBhcnRzID0gcGF0aC5zcGxpdChcIi5cIik7XG4gICAgICAgIGxldCB0cmVlOiBUcmVlID0gdGhpcztcbiAgICAgICAgbGV0IHByZXZpb3VzVHJlZTogVHJlZSA9IHRoaXM7XG4gICAgICAgIGZvciAobGV0IHBhcnQgb2YgcGF0aFBhcnRzKSB7XG4gICAgICAgICAgICB0cmVlID0gdHJlZS5tYXAuZ2V0KHBhcnQpO1xuICAgICAgICAgICAgaWYgKCF0cmVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHByZXZpb3VzVHJlZSA9PSB0aGlzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnRUcmVlLnBhdGgubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcmVudFRyZWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBbmNlc3RvciAnJHtwYXRofScgbm90IGZvdW5kIGluIGN1cnJlbnQgdHJlZTogJyR7dGhpcy5wYXRofSdgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByZXZpb3VzVHJlZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByZXZpb3VzVHJlZSA9IHRyZWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhcmVudFRyZWUucGF0aC5sZW5ndGggPiBwcmV2aW91c1RyZWUucGF0aC5sZW5ndGhcbiAgICAgICAgICAgID8gcGFyZW50VHJlZSA6IHByZXZpb3VzVHJlZTtcbiAgICB9XG5cbiAgICByZXNvbHZlUGF0aChwYXRoOiBzdHJpbmcsIHRocm93RXJyb3I6IGJvb2xlYW4gPSB0cnVlKTogSVRyZWUge1xuICAgICAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSAhdGhpcy5wYXRoID8gcGF0aCA6IGAke3RoaXMucGF0aH0uJHtwYXRofWA7XG4gICAgICAgIGxldCB0cmVlOiBJVHJlZSA9IG5ldyBUcmVlKHRoaXMuY29udGFpbmVyLCBhYnNvbHV0ZVBhdGgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdHJlZSA9IHRoaXMucmVzb2x2ZUFuY2VzdG9yKHBhdGgpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBpZiAodGhyb3dFcnJvcikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUGF0aCAnJHtwYXRofScgbm90IGZvdW5kIGluIGN1cnJlbnQgdHJlZTogJyR7dGhpcy5wYXRofSdgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cmVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0cmVlLnBhdGggIT09IGFic29sdXRlUGF0aCkge1xuICAgICAgICAgICAgaWYgKHRocm93RXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFBhdGggJyR7cGF0aH0nIG5vdCBmb3VuZCBpbiBjdXJyZW50IHRyZWU6ICcke3RoaXMucGF0aH0nYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJlZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJlZTtcbiAgICB9XG5cbiAgICBhZGRQYXRoKHBhdGg6IHN0cmluZyk6IHRoaXMge1xuICAgICAgICBpZiAoIWlzU3RyaW5nKHBhdGgpIHx8IHBhdGgubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhdGhQYXJ0cyA9IHBhdGguc3BsaXQoXCIuXCIpO1xuICAgICAgICBsZXQgdHJlZTogVHJlZSA9IHRoaXM7XG4gICAgICAgIHBhdGggPSB0aGlzLnBhdGg7XG4gICAgICAgIGZvciAobGV0IHBhcnQgb2YgcGF0aFBhcnRzKSB7XG4gICAgICAgICAgICBpZiAoIXRyZWUubWFwLmhhcyhwYXJ0KSkge1xuICAgICAgICAgICAgICAgIHRyZWUubWFwLnNldChwYXJ0LCBuZXcgVHJlZSh0aGlzLmNvbnRhaW5lciwgIXBhdGggPyBwYXJ0IDogYCR7cGF0aH0uJHtwYXJ0fWApKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJlZSA9IHRyZWUubWFwLmdldChwYXJ0KTtcbiAgICAgICAgICAgIHBhdGggPSB0cmVlLnBhdGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxufVxuIl19
1
+ import { isString } from "../utils";
2
+ export class Tree {
3
+ constructor(container, path) {
4
+ this.container = container;
5
+ this.path = path;
6
+ this.map = new Map();
7
+ }
8
+ get parentTree() {
9
+ return this.container.parent.tree;
10
+ }
11
+ resolveService() {
12
+ return this.container.resolve(this.path);
13
+ }
14
+ resolveLeaves() {
15
+ let map;
16
+ try {
17
+ const parentTree = this.parentTree.resolvePath(this.path);
18
+ map = parentTree.resolveLeaves();
19
+ }
20
+ catch (e) {
21
+ map = new Map();
22
+ }
23
+ const visitor = (treeMap, path) => {
24
+ treeMap.forEach((tree, key) => {
25
+ const subKey = !path ? key : `${path}.${key}`;
26
+ if (tree.map.size == 0) {
27
+ map.set(subKey, tree);
28
+ return;
29
+ }
30
+ visitor(tree.map, subKey);
31
+ });
32
+ };
33
+ visitor(this.map, "");
34
+ return map;
35
+ }
36
+ resolveServices() {
37
+ const map = new Map();
38
+ this.resolveLeaves().forEach((leaf, key) => {
39
+ map.set(key, leaf.resolveService());
40
+ });
41
+ return map;
42
+ }
43
+ resolveAncestor(path) {
44
+ if (!isString(path) || path.length == 0) {
45
+ return this;
46
+ }
47
+ let parentTree;
48
+ try {
49
+ parentTree = this.parentTree.resolvePath(this.path);
50
+ parentTree = parentTree.resolveAncestor(path);
51
+ }
52
+ catch (e) {
53
+ parentTree = new Tree(this.container, "");
54
+ }
55
+ const pathParts = path.split(".");
56
+ let tree = this;
57
+ let previousTree = this;
58
+ for (let part of pathParts) {
59
+ tree = tree.map.get(part);
60
+ if (!tree) {
61
+ if (previousTree == this) {
62
+ if (parentTree.path.length > 0) {
63
+ return parentTree;
64
+ }
65
+ throw new Error(`Ancestor '${path}' not found in current tree: '${this.path}'`);
66
+ }
67
+ return previousTree;
68
+ }
69
+ previousTree = tree;
70
+ }
71
+ return parentTree.path.length > previousTree.path.length
72
+ ? parentTree : previousTree;
73
+ }
74
+ resolvePath(path, throwError = true) {
75
+ const absolutePath = !this.path ? path : `${this.path}.${path}`;
76
+ let tree = new Tree(this.container, absolutePath);
77
+ try {
78
+ tree = this.resolveAncestor(path);
79
+ }
80
+ catch (e) {
81
+ if (throwError) {
82
+ throw new Error(`Path '${path}' not found in current tree: '${this.path}'`);
83
+ }
84
+ return tree;
85
+ }
86
+ if (tree.path !== absolutePath) {
87
+ if (throwError) {
88
+ throw new Error(`Path '${path}' not found in current tree: '${this.path}'`);
89
+ }
90
+ return tree;
91
+ }
92
+ return tree;
93
+ }
94
+ addPath(path) {
95
+ if (!isString(path) || path.length == 0) {
96
+ return this;
97
+ }
98
+ const pathParts = path.split(".");
99
+ let tree = this;
100
+ path = this.path;
101
+ for (let part of pathParts) {
102
+ if (!tree.map.has(part)) {
103
+ tree.map.set(part, new Tree(this.container, !path ? part : `${path}.${part}`));
104
+ }
105
+ tree = tree.map.get(part);
106
+ path = tree.path;
107
+ }
108
+ return this;
109
+ }
110
+ }
111
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlsaXRpZXMvdHJlZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBRWxDLE1BQU0sT0FBTyxJQUFJO0lBUWIsWUFBc0IsU0FBK0IsRUFBVyxJQUFZO1FBQXRELGNBQVMsR0FBVCxTQUFTLENBQXNCO1FBQVcsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUN4RSxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxFQUFnQixDQUFDO0lBQ3ZDLENBQUM7SUFORCxJQUFjLFVBQVU7UUFDcEIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7SUFDdEMsQ0FBQztJQU1ELGNBQWM7UUFDVixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQsYUFBYTtRQUNULElBQUksR0FBdUIsQ0FBQztRQUM1QixJQUFJO1lBQ0EsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzFELEdBQUcsR0FBRyxVQUFVLENBQUMsYUFBYSxFQUFFLENBQUM7U0FDcEM7UUFBQyxPQUFPLENBQUMsRUFBRTtZQUNSLEdBQUcsR0FBRyxJQUFJLEdBQUcsRUFBaUIsQ0FBQztTQUNsQztRQUNELE1BQU0sT0FBTyxHQUFHLENBQUMsT0FBMEIsRUFBRSxJQUFZLEVBQUUsRUFBRTtZQUN6RCxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxFQUFFO2dCQUMxQixNQUFNLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksSUFBSSxHQUFHLEVBQUUs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LENBQUMsQ0FBQztZQUMxQixJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztTQUNwQjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SURlcGVuZGVuY3lDb250YWluZXIsIElUcmVlfSBmcm9tIFwiLi4vY29tbW9uLXR5cGVzXCI7XHJcbmltcG9ydCB7aXNTdHJpbmd9IGZyb20gXCIuLi91dGlsc1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFRyZWUgaW1wbGVtZW50cyBJVHJlZSB7XHJcblxyXG4gICAgcHJvdGVjdGVkIG1hcDogTWFwPHN0cmluZywgVHJlZT47XHJcblxyXG4gICAgcHJvdGVjdGVkIGdldCBwYXJlbnRUcmVlKCk6IElUcmVlIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb250YWluZXIucGFyZW50LnRyZWU7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIGNvbnRhaW5lcjogSURlcGVuZGVuY3lDb250YWluZXIsIHJlYWRvbmx5IHBhdGg6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMubWFwID0gbmV3IE1hcDxzdHJpbmcsIFRyZWU+KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVzb2x2ZVNlcnZpY2UoKTogYW55IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb250YWluZXIucmVzb2x2ZSh0aGlzLnBhdGgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlc29sdmVMZWF2ZXMoKTogTWFwPHN0cmluZywgSVRyZWU+IHtcclxuICAgICAgICBsZXQgbWFwOiBNYXA8c3RyaW5nLCBJVHJlZT47XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29uc3QgcGFyZW50VHJlZSA9IHRoaXMucGFyZW50VHJlZS5yZXNvbHZlUGF0aCh0aGlzLnBhdGgpO1xyXG4gICAgICAgICAgICBtYXAgPSBwYXJlbnRUcmVlLnJlc29sdmVMZWF2ZXMoKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIG1hcCA9IG5ldyBNYXA8c3RyaW5nLCBJVHJlZT4oKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgdmlzaXRvciA9ICh0cmVlTWFwOiBNYXA8c3RyaW5nLCBUcmVlPiwgcGF0aDogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICAgIHRyZWVNYXAuZm9yRWFjaCgodHJlZSwga2V5KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzdWJLZXkgPSAhcGF0aCA/IGtleSA6IGAke3BhdGh9LiR7a2V5fWA7XHJcbiAgICAgICAgICAgICAgICBpZiAodHJlZS5tYXAuc2l6ZSA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbWFwLnNldChzdWJLZXksIHRyZWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHZpc2l0b3IodHJlZS5tYXAsIHN1YktleSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdmlzaXRvcih0aGlzLm1hcCwgXCJcIik7XHJcbiAgICAgICAgcmV0dXJuIG1hcDtcclxuICAgIH1cclxuXHJcbiAgICByZXNvbHZlU2VydmljZXMoKTogTWFwPHN0cmluZywgYW55PiB7XHJcbiAgICAgICAgY29uc3QgbWFwID0gbmV3IE1hcDxzdHJpbmcsIGFueT4oKTtcclxuICAgICAgICB0aGlzLnJlc29sdmVMZWF2ZXMoKS5mb3JFYWNoKChsZWFmLCBrZXkpID0+IHtcclxuICAgICAgICAgICAgbWFwLnNldChrZXksIGxlYWYucmVzb2x2ZVNlcnZpY2UoKSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIG1hcDtcclxuICAgIH1cclxuXHJcbiAgICByZXNvbHZlQW5jZXN0b3IocGF0aDogc3RyaW5nKTogSVRyZWUge1xyXG4gICAgICAgIGlmICghaXNTdHJpbmcocGF0aCkgfHwgcGF0aC5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IHBhcmVudFRyZWU6IElUcmVlO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHBhcmVudFRyZWUgPSB0aGlzLnBhcmVudFRyZWUucmVzb2x2ZVBhdGgodGhpcy5wYXRoKTtcclxuICAgICAgICAgICAgcGFyZW50VHJlZSA9IHBhcmVudFRyZWUucmVzb2x2ZUFuY2VzdG9yKHBhdGgpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgcGFyZW50VHJlZSA9IG5ldyBUcmVlKHRoaXMuY29udGFpbmVyLCBcIlwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcGF0aFBhcnRzID0gcGF0aC5zcGxpdChcIi5cIik7XHJcbiAgICAgICAgbGV0IHRyZWU6IFRyZWUgPSB0aGlzO1xyXG4gICAgICAgIGxldCBwcmV2aW91c1RyZWU6IFRyZWUgPSB0aGlzO1xyXG4gICAgICAgIGZvciAobGV0IHBhcnQgb2YgcGF0aFBhcnRzKSB7XHJcbiAgICAgICAgICAgIHRyZWUgPSB0cmVlLm1hcC5nZXQocGFydCk7XHJcbiAgICAgICAgICAgIGlmICghdHJlZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHByZXZpb3VzVHJlZSA9PSB0aGlzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudFRyZWUucGF0aC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJlbnRUcmVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEFuY2VzdG9yICcke3BhdGh9JyBub3QgZm91bmQgaW4gY3VycmVudCB0cmVlOiAnJHt0aGlzLnBhdGh9J2ApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHByZXZpb3VzVHJlZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBwcmV2aW91c1RyZWUgPSB0cmVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcGFyZW50VHJlZS5wYXRoLmxlbmd0aCA+IHByZXZpb3VzVHJlZS5wYXRoLmxlbmd0aFxyXG4gICAgICAgICAgICA/IHBhcmVudFRyZWUgOiBwcmV2aW91c1RyZWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmVzb2x2ZVBhdGgocGF0aDogc3RyaW5nLCB0aHJvd0Vycm9yOiBib29sZWFuID0gdHJ1ZSk6IElUcmVlIHtcclxuICAgICAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSAhdGhpcy5wYXRoID8gcGF0aCA6IGAke3RoaXMucGF0aH0uJHtwYXRofWA7XHJcbiAgICAgICAgbGV0IHRyZWU6IElUcmVlID0gbmV3IFRyZWUodGhpcy5jb250YWluZXIsIGFic29sdXRlUGF0aCk7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdHJlZSA9IHRoaXMucmVzb2x2ZUFuY2VzdG9yKHBhdGgpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgaWYgKHRocm93RXJyb3IpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUGF0aCAnJHtwYXRofScgbm90IGZvdW5kIGluIGN1cnJlbnQgdHJlZTogJyR7dGhpcy5wYXRofSdgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gdHJlZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRyZWUucGF0aCAhPT0gYWJzb2x1dGVQYXRoKSB7XHJcbiAgICAgICAgICAgIGlmICh0aHJvd0Vycm9yKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFBhdGggJyR7cGF0aH0nIG5vdCBmb3VuZCBpbiBjdXJyZW50IHRyZWU6ICcke3RoaXMucGF0aH0nYCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHRyZWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cmVlO1xyXG4gICAgfVxyXG5cclxuICAgIGFkZFBhdGgocGF0aDogc3RyaW5nKTogdGhpcyB7XHJcbiAgICAgICAgaWYgKCFpc1N0cmluZyhwYXRoKSB8fCBwYXRoLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBwYXRoUGFydHMgPSBwYXRoLnNwbGl0KFwiLlwiKTtcclxuICAgICAgICBsZXQgdHJlZTogVHJlZSA9IHRoaXM7XHJcbiAgICAgICAgcGF0aCA9IHRoaXMucGF0aDtcclxuICAgICAgICBmb3IgKGxldCBwYXJ0IG9mIHBhdGhQYXJ0cykge1xyXG4gICAgICAgICAgICBpZiAoIXRyZWUubWFwLmhhcyhwYXJ0KSkge1xyXG4gICAgICAgICAgICAgICAgdHJlZS5tYXAuc2V0KHBhcnQsIG5ldyBUcmVlKHRoaXMuY29udGFpbmVyLCAhcGF0aCA/IHBhcnQgOiBgJHtwYXRofS4ke3BhcnR9YCkpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdHJlZSA9IHRyZWUubWFwLmdldChwYXJ0KTtcclxuICAgICAgICAgICAgcGF0aCA9IHRyZWUucGF0aDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbn1cclxuIl19