@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.
- package/README.md +2 -2
- package/bundles/stemy-backend.umd.js +5553 -5465
- package/bundles/stemy-backend.umd.js.map +1 -1
- package/bundles/stemy-backend.umd.min.js +1 -1
- package/bundles/stemy-backend.umd.min.js.map +1 -1
- package/common-types.d.ts +226 -214
- package/esm2015/common-types.js +18 -18
- package/esm2015/public_api.js +338 -338
- package/esm2015/rest-controllers/assets.controller.js +116 -116
- package/esm2015/rest-controllers/auth.controller.js +75 -75
- package/esm2015/rest-controllers/gallery.controller.js +37 -37
- package/esm2015/rest-controllers/progresses.controller.js +57 -57
- package/esm2015/rest-middlewares/container.middleware.js +32 -32
- package/esm2015/rest-middlewares/error-handler.middleware.js +83 -83
- package/esm2015/rest-middlewares/language.middleware.js +28 -28
- package/esm2015/rest-middlewares/request-ended.middleware.js +25 -25
- package/esm2015/rest-middlewares/request-started.middleware.js +24 -24
- package/esm2015/rest-openapi.js +44 -44
- package/esm2015/services/asset-processor.js +101 -101
- package/esm2015/services/asset-resolver.js +53 -53
- package/esm2015/services/assets.js +110 -110
- package/esm2015/services/backend-provider.js +32 -32
- package/esm2015/services/cache-processor.js +34 -34
- package/esm2015/services/cache.js +94 -94
- package/esm2015/services/configuration.js +55 -55
- package/esm2015/services/endpoint-provider.js +29 -29
- package/esm2015/services/entities/asset.js +166 -112
- package/esm2015/services/entities/lazy-asset.js +93 -93
- package/esm2015/services/entities/progress.js +181 -181
- package/esm2015/services/fixtures.js +45 -45
- package/esm2015/services/gallery-cache.js +36 -36
- package/esm2015/services/gallery-image.js +48 -48
- package/esm2015/services/gallery.js +138 -138
- package/esm2015/services/id-generator.js +63 -63
- package/esm2015/services/job-manager.js +203 -203
- package/esm2015/services/lazy-assets.js +74 -74
- package/esm2015/services/mail-sender.js +59 -59
- package/esm2015/services/memory-cache.js +84 -84
- package/esm2015/services/mongo-connector.js +61 -61
- package/esm2015/services/progresses.js +91 -91
- package/esm2015/services/template-renderer.js +89 -89
- package/esm2015/services/translation-provider.js +31 -31
- package/esm2015/services/translator.js +85 -85
- package/esm2015/services/user-manager.js +47 -47
- package/esm2015/socket-controllers/progress.controller.js +82 -82
- package/esm2015/socket-middlewares/compression.middleware.js +19 -19
- package/esm2015/static.js +33 -33
- package/esm2015/stemy-backend.js +4 -4
- package/esm2015/utilities/di-container.js +84 -84
- package/esm2015/utilities/lazy-asset-generator.js +40 -40
- package/esm2015/utilities/tree.js +111 -111
- package/esm2015/utils.js +618 -601
- package/esm2015/validators.js +51 -51
- package/fesm2015/stemy-backend.js +3656 -3585
- package/fesm2015/stemy-backend.js.map +1 -1
- package/package.json +1 -1
- package/public_api.d.ts +33 -33
- package/rest-controllers/assets.controller.d.ts +16 -16
- package/rest-controllers/auth.controller.d.ts +14 -14
- package/rest-controllers/gallery.controller.d.ts +7 -7
- package/rest-controllers/progresses.controller.d.ts +9 -9
- package/rest-middlewares/container.middleware.d.ts +8 -8
- package/rest-middlewares/error-handler.middleware.d.ts +13 -13
- package/rest-middlewares/language.middleware.d.ts +8 -8
- package/rest-middlewares/request-ended.middleware.d.ts +5 -5
- package/rest-middlewares/request-started.middleware.d.ts +5 -5
- package/rest-openapi.d.ts +3 -3
- package/services/asset-processor.d.ts +12 -12
- package/services/asset-resolver.d.ts +9 -9
- package/services/assets.d.ts +19 -19
- package/services/backend-provider.d.ts +11 -11
- package/services/cache-processor.d.ts +4 -4
- package/services/cache.d.ts +23 -23
- package/services/configuration.d.ts +10 -10
- package/services/endpoint-provider.d.ts +4 -4
- package/services/entities/asset.d.ts +25 -23
- package/services/entities/lazy-asset.d.ts +29 -29
- package/services/entities/progress.d.ts +49 -49
- package/services/fixtures.d.ts +6 -6
- package/services/gallery-cache.d.ts +9 -9
- package/services/gallery-image.d.ts +11 -11
- package/services/gallery.d.ts +13 -13
- package/services/id-generator.d.ts +11 -11
- package/services/job-manager.d.ts +27 -27
- package/services/lazy-assets.d.ts +19 -19
- package/services/mail-sender.d.ts +20 -20
- package/services/memory-cache.d.ts +10 -10
- package/services/mongo-connector.d.ts +14 -14
- package/services/progresses.d.ts +18 -18
- package/services/template-renderer.d.ts +14 -14
- package/services/translation-provider.d.ts +10 -10
- package/services/translator.d.ts +15 -15
- package/services/user-manager.d.ts +6 -6
- package/socket-controllers/progress.controller.d.ts +10 -10
- package/socket-middlewares/compression.middleware.d.ts +4 -4
- package/static.d.ts +2 -2
- package/stemy-backend.d.ts +4 -4
- package/stemy-backend.metadata.json +1 -1
- package/utilities/di-container.d.ts +43 -43
- package/utilities/lazy-asset-generator.d.ts +15 -15
- package/utilities/tree.d.ts +14 -14
- package/utils.d.ts +76 -73
- package/validators.d.ts +7 -7
- package/di-container.d.ts +0 -40
- package/esm2015/di-container.js +0 -75
- package/esm2015/models/lazy-asset.js +0 -12
- package/esm2015/models/progress.js +0 -23
- package/esm2015/rest-middlewares/injector.middleware.js +0 -26
- package/esm2015/services/lazy-asset-helper.js +0 -74
- package/esm2015/services/logger.js +0 -14
- package/esm2015/services/progress-helper.js +0 -168
- package/models/lazy-asset.d.ts +0 -45
- package/models/progress.d.ts +0 -56
- package/rest-middlewares/injector.middleware.d.ts +0 -8
- package/services/lazy-asset-helper.d.ts +0 -15
- package/services/logger.d.ts +0 -2
- 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
|