@stemy/backend 3.6.0 → 4.0.0
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/commands/fixtures-command.d.ts +9 -0
- package/commands/index.d.ts +2 -0
- package/common-types.d.ts +11 -6
- package/esm2020/commands/clear-command.mjs +17 -0
- package/esm2020/commands/fixtures-command.mjs +23 -0
- package/esm2020/commands/index.mjs +7 -0
- package/esm2020/common-types.mjs +21 -0
- package/esm2020/public_api.mjs +379 -0
- package/esm2020/requests/asset-image-params.mjs +53 -0
- package/esm2020/rest-controllers/assets.controller.mjs +126 -0
- package/esm2020/rest-controllers/auth.controller.mjs +46 -0
- package/esm2020/rest-controllers/gallery.controller.mjs +21 -0
- package/esm2020/rest-controllers/progresses.controller.mjs +29 -0
- package/esm2020/rest-controllers/terminal-styles.mjs +67 -0
- package/esm2020/rest-controllers/terminal.controller.mjs +125 -0
- package/esm2020/rest-middlewares/container.middleware.mjs +20 -0
- package/esm2020/rest-middlewares/error-handler.middleware.mjs +74 -0
- package/esm2020/rest-middlewares/language.middleware.mjs +18 -0
- package/esm2020/rest-middlewares/request-ended.middleware.mjs +23 -0
- package/esm2020/rest-middlewares/request-started.middleware.mjs +22 -0
- package/esm2020/services/asset-processor.mjs +90 -0
- package/esm2020/services/asset-resolver.mjs +31 -0
- package/esm2020/services/assets.mjs +140 -0
- package/esm2020/services/backend-provider.mjs +22 -0
- package/esm2020/services/cache-processor.mjs +16 -0
- package/esm2020/services/cache.mjs +62 -0
- package/{esm2015/services/configuration.js → esm2020/services/configuration.mjs} +3 -15
- package/esm2020/services/endpoint-provider.mjs +13 -0
- package/esm2020/services/entities/asset.mjs +43 -0
- package/esm2020/services/entities/base-entity.mjs +26 -0
- package/esm2020/services/entities/lazy-asset.mjs +73 -0
- package/esm2020/services/entities/progress.mjs +176 -0
- package/esm2020/services/entities/temp-asset.mjs +45 -0
- package/esm2020/services/fixtures.mjs +26 -0
- package/esm2020/services/gallery-cache.mjs +27 -0
- package/esm2020/services/gallery-image.mjs +37 -0
- package/esm2020/services/gallery.mjs +116 -0
- package/esm2020/services/id-generator.mjs +42 -0
- package/esm2020/services/job-manager.mjs +187 -0
- package/esm2020/services/lazy-assets.mjs +48 -0
- package/esm2020/services/logger.mjs +21 -0
- package/esm2020/services/mail-sender.mjs +36 -0
- package/esm2020/services/memory-cache.mjs +57 -0
- package/esm2020/services/mongo-connector.mjs +37 -0
- package/esm2020/services/open-api.mjs +114 -0
- package/esm2020/services/progresses.mjs +86 -0
- package/esm2020/services/template-renderer.mjs +64 -0
- package/esm2020/services/terminal-manager.mjs +77 -0
- package/esm2020/services/token-generator.mjs +35 -0
- package/esm2020/services/translation-provider.mjs +34 -0
- package/esm2020/services/translator.mjs +63 -0
- package/esm2020/services/user-manager.mjs +27 -0
- package/esm2020/socket-controllers/progress.controller.mjs +52 -0
- package/esm2020/socket-controllers/terminal.controller.mjs +48 -0
- package/esm2020/socket-controllers/terminal.mjs +85 -0
- package/esm2020/socket-middlewares/compression.middleware.mjs +14 -0
- package/esm2020/static.mjs +23 -0
- package/esm2020/utilities/decorators.mjs +52 -0
- package/esm2020/utilities/di-container.mjs +83 -0
- package/esm2020/utilities/empty-job.mjs +13 -0
- package/esm2020/utilities/lazy-asset-generator.mjs +35 -0
- package/esm2020/utilities/mongoose.mjs +216 -0
- package/esm2020/utils.mjs +693 -0
- package/esm2020/validators.mjs +46 -0
- package/fesm2015/{stemy-backend.js → stemy-backend.mjs} +1638 -2403
- package/fesm2015/stemy-backend.mjs.map +1 -0
- package/fesm2020/stemy-backend.mjs +4202 -0
- package/fesm2020/stemy-backend.mjs.map +1 -0
- package/{stemy-backend.d.ts → index.d.ts} +1 -0
- package/package.json +35 -23
- package/public_api.d.ts +2 -2
- package/rest-controllers/terminal-styles.d.ts +2 -0
- package/rest-controllers/terminal.controller.d.ts +2 -0
- package/services/assets.d.ts +1 -0
- package/services/entities/asset.d.ts +1 -0
- package/services/entities/temp-asset.d.ts +1 -0
- package/services/fixtures.d.ts +2 -2
- package/utils.d.ts +3 -0
- package/bundles/stemy-backend.umd.js +0 -7553
- package/bundles/stemy-backend.umd.js.map +0 -1
- package/esm2015/common-types.js +0 -20
- package/esm2015/public_api.js +0 -380
- package/esm2015/requests/asset-image-params.js +0 -70
- package/esm2015/rest-controllers/assets.controller.js +0 -180
- package/esm2015/rest-controllers/auth.controller.js +0 -76
- package/esm2015/rest-controllers/gallery.controller.js +0 -37
- package/esm2015/rest-controllers/progresses.controller.js +0 -57
- package/esm2015/rest-controllers/terminal.controller.js +0 -151
- package/esm2015/rest-middlewares/container.middleware.js +0 -32
- package/esm2015/rest-middlewares/error-handler.middleware.js +0 -99
- package/esm2015/rest-middlewares/language.middleware.js +0 -28
- package/esm2015/rest-middlewares/request-ended.middleware.js +0 -33
- package/esm2015/rest-middlewares/request-started.middleware.js +0 -32
- package/esm2015/rest-openapi.js +0 -44
- package/esm2015/services/asset-processor.js +0 -108
- package/esm2015/services/asset-resolver.js +0 -53
- package/esm2015/services/assets.js +0 -181
- package/esm2015/services/backend-provider.js +0 -32
- package/esm2015/services/cache-processor.js +0 -34
- package/esm2015/services/cache.js +0 -93
- package/esm2015/services/endpoint-provider.js +0 -29
- package/esm2015/services/entities/asset.js +0 -60
- package/esm2015/services/entities/base-entity.js +0 -37
- package/esm2015/services/entities/lazy-asset.js +0 -90
- package/esm2015/services/entities/progress.js +0 -213
- package/esm2015/services/entities/temp-asset.js +0 -64
- package/esm2015/services/fixtures.js +0 -45
- package/esm2015/services/gallery-cache.js +0 -36
- package/esm2015/services/gallery-image.js +0 -48
- package/esm2015/services/gallery.js +0 -138
- package/esm2015/services/id-generator.js +0 -63
- package/esm2015/services/job-manager.js +0 -221
- package/esm2015/services/lazy-assets.js +0 -83
- package/esm2015/services/logger.js +0 -31
- package/esm2015/services/mail-sender.js +0 -58
- package/esm2015/services/memory-cache.js +0 -84
- package/esm2015/services/mongo-connector.js +0 -58
- package/esm2015/services/open-api.js +0 -140
- package/esm2015/services/progresses.js +0 -118
- package/esm2015/services/template-renderer.js +0 -88
- package/esm2015/services/terminal-manager.js +0 -94
- package/esm2015/services/token-generator.js +0 -55
- package/esm2015/services/translation-provider.js +0 -54
- package/esm2015/services/translator.js +0 -84
- package/esm2015/services/user-manager.js +0 -47
- package/esm2015/socket-controllers/progress.controller.js +0 -82
- package/esm2015/socket-controllers/terminal.controller.js +0 -83
- package/esm2015/socket-controllers/terminal.js +0 -98
- package/esm2015/socket-middlewares/compression.middleware.js +0 -19
- package/esm2015/static.js +0 -33
- package/esm2015/utilities/clear-command.js +0 -33
- package/esm2015/utilities/decorators.js +0 -54
- package/esm2015/utilities/di-container.js +0 -84
- package/esm2015/utilities/empty-job.js +0 -29
- package/esm2015/utilities/lazy-asset-generator.js +0 -46
- package/esm2015/utilities/mongoose.js +0 -225
- package/esm2015/utils.js +0 -699
- package/esm2015/validators.js +0 -51
- package/fesm2015/stemy-backend.js.map +0 -1
- package/rest-openapi.d.ts +0 -3
- package/stemy-backend.metadata.json +0 -1
- /package/{utilities → commands}/clear-command.d.ts +0 -0
- /package/{esm2015/stemy-backend.js → esm2020/stemy-backend.mjs} +0 -0
- /package/{esm2015/utilities/base-doc.js → esm2020/utilities/base-doc.mjs} +0 -0
- /package/{esm2015/utilities/tree.js → esm2020/utilities/tree.mjs} +0 -0
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { BehaviorSubject, Subject } from "rxjs";
|
|
2
|
+
import { first, map, timeout } from "rxjs/operators";
|
|
3
|
+
import { fileTypeFromBuffer } from "../utils";
|
|
4
|
+
export class Terminal {
|
|
5
|
+
constructor(client) {
|
|
6
|
+
this.client = client;
|
|
7
|
+
this.addons = [];
|
|
8
|
+
this.files$ = new BehaviorSubject([]);
|
|
9
|
+
this.input$ = new Subject();
|
|
10
|
+
}
|
|
11
|
+
onData(cb) {
|
|
12
|
+
const sub = this.input$.pipe(map(v => {
|
|
13
|
+
if (v === "\b") {
|
|
14
|
+
return "\x7f";
|
|
15
|
+
}
|
|
16
|
+
return v;
|
|
17
|
+
})).subscribe(cb);
|
|
18
|
+
return {
|
|
19
|
+
dispose: () => sub.unsubscribe()
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
write(data) {
|
|
23
|
+
this.client.emit("terminal-data", data);
|
|
24
|
+
}
|
|
25
|
+
writeln(data) {
|
|
26
|
+
this.write(data + "\n");
|
|
27
|
+
}
|
|
28
|
+
loadAddon(addon) {
|
|
29
|
+
addon.activate(this);
|
|
30
|
+
this.addons.push(addon);
|
|
31
|
+
}
|
|
32
|
+
dispose() {
|
|
33
|
+
this.input$.complete();
|
|
34
|
+
this.client = null;
|
|
35
|
+
this.addons.forEach(a => a.dispose());
|
|
36
|
+
}
|
|
37
|
+
async suggestFiles(accept) {
|
|
38
|
+
const rand = Math.round(Math.random() * 1000);
|
|
39
|
+
const id = `${Date.now()}-${rand}`;
|
|
40
|
+
const files = this.files$.value;
|
|
41
|
+
return files.filter(f => f.accept === accept).concat([
|
|
42
|
+
{
|
|
43
|
+
id,
|
|
44
|
+
label: "...",
|
|
45
|
+
onAccept: async () => {
|
|
46
|
+
this.client.emit("terminal-upload", {
|
|
47
|
+
id,
|
|
48
|
+
accept
|
|
49
|
+
});
|
|
50
|
+
const file = await this.files$
|
|
51
|
+
.pipe(first(v => v.some(f => f.id === id)))
|
|
52
|
+
.pipe(timeout(120000))
|
|
53
|
+
.pipe(map(v => v.find(f => f.id === id)))
|
|
54
|
+
.toPromise();
|
|
55
|
+
if (file.error) {
|
|
56
|
+
this.files$.next(this.files$.value.filter(f => f.id !== id));
|
|
57
|
+
throw new Error(file.error);
|
|
58
|
+
}
|
|
59
|
+
return file;
|
|
60
|
+
},
|
|
61
|
+
showAlways: true,
|
|
62
|
+
accept: accept,
|
|
63
|
+
}
|
|
64
|
+
]);
|
|
65
|
+
}
|
|
66
|
+
async downloadFile(filename, buffer) {
|
|
67
|
+
const type = await fileTypeFromBuffer(buffer);
|
|
68
|
+
const data = buffer.toString("base64");
|
|
69
|
+
const content = `data:${type.mime};base64,${data}`;
|
|
70
|
+
this.client.emit("terminal-download", {
|
|
71
|
+
filename,
|
|
72
|
+
content
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
addFile(upload) {
|
|
76
|
+
if (upload.content) {
|
|
77
|
+
upload.buffer = Buffer.from(upload.content, "base64");
|
|
78
|
+
}
|
|
79
|
+
this.files$.next(this.files$.value.concat(upload));
|
|
80
|
+
}
|
|
81
|
+
input(data) {
|
|
82
|
+
this.input$.next(data);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVybWluYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc29ja2V0LWNvbnRyb2xsZXJzL3Rlcm1pbmFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxlQUFlLEVBQUUsT0FBTyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQzlDLE9BQU8sRUFBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBR25ELE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUU1QyxNQUFNLE9BQU8sUUFBUTtJQUtqQixZQUFzQixNQUFxQjtRQUFyQixXQUFNLEdBQU4sTUFBTSxDQUFlO1FBQ3ZDLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxlQUFlLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUFFRCxNQUFNLENBQUMsRUFBeUI7UUFDNUIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ2pDLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRTtnQkFDWixPQUFPLE1BQU0sQ0FBQzthQUNqQjtZQUNELE9BQU8sQ0FBQyxDQUFDO1FBQ2IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbEIsT0FBTztZQUNILE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFO1NBQ25DLENBQUM7SUFDTixDQUFDO0lBRUQsS0FBSyxDQUFDLElBQVk7UUFDZCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDNUMsQ0FBQztJ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SUFBSSxDQUFDLG1CQUFtQixFQUFFO1lBQ2xDLFFBQVE7WUFDUixPQUFPO1NBQ1YsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELE9BQU8sQ0FBQyxNQUFxQjtRQUN6QixJQUFJLE1BQU0sQ0FBQyxPQUFPLEVBQUU7WUFDaEIsTUFBTSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUM7U0FDekQ7UUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsS0FBSyxDQUFDLElBQVk7UUFDZCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMzQixDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0JlaGF2aW9yU3ViamVjdCwgU3ViamVjdH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHtmaXJzdCwgbWFwLCB0aW1lb3V0fSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcclxuaW1wb3J0IHtJRGlzcG9zYWJsZSwgSVN1Z2dlc3Rpb24sIElUZXJtaW5hbEFkZG9ufSBmcm9tIFwiQHN0ZW15L3Rlcm1pbmFsLWNvbW1hbmRzLWFkZG9uXCI7XHJcbmltcG9ydCB7SUNsaWVudFNvY2tldCwgSVRlcm1pbmFsLCBJVGVybWluYWxGaWxlfSBmcm9tIFwiLi4vY29tbW9uLXR5cGVzXCI7XHJcbmltcG9ydCB7ZmlsZVR5cGVGcm9tQnVmZmVyfSBmcm9tIFwiLi4vdXRpbHNcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBUZXJtaW5hbCBpbXBsZW1lbnRzIElUZXJtaW5hbCB7XHJcbiAgICBwcm90ZWN0ZWQgYWRkb25zOiBJVGVybWluYWxBZGRvbltdO1xyXG4gICAgcHJvdGVjdGVkIGZpbGVzJDogQmVoYXZpb3JTdWJqZWN0PElUZXJtaW5hbEZpbGVbXT47XHJcbiAgICBwcm90ZWN0ZWQgaW5wdXQkOiBTdWJqZWN0PHN0cmluZz47XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIGNsaWVudDogSUNsaWVudFNvY2tldCkge1xyXG4gICAgICAgIHRoaXMuYWRkb25zID0gW107XHJcbiAgICAgICAgdGhpcy5maWxlcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KFtdKTtcclxuICAgICAgICB0aGlzLmlucHV0JCA9IG5ldyBTdWJqZWN0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgb25EYXRhKGNiOiAoZGF0YTogc3RyaW5nKSA9PiBhbnkpOiBJRGlzcG9zYWJsZSB7XHJcbiAgICAgICAgY29uc3Qgc3ViID0gdGhpcy5pbnB1dCQucGlwZShtYXAodiA9PiB7XHJcbiAgICAgICAgICAgIGlmICh2ID09PSBcIlxcYlwiKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJcXHg3ZlwiO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB2O1xyXG4gICAgICAgIH0pKS5zdWJzY3JpYmUoY2IpO1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGRpc3Bvc2U6ICgpID0+IHN1Yi51bnN1YnNjcmliZSgpXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICB3cml0ZShkYXRhOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmNsaWVudC5lbWl0KFwidGVybWluYWwtZGF0YVwiLCBkYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICB3cml0ZWxuKGRhdGE6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMud3JpdGUoZGF0YSArIFwiXFxuXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIGxvYWRBZGRvbihhZGRvbjogSVRlcm1pbmFsQWRkb24pIHtcclxuICAgICAgICBhZGRvbi5hY3RpdmF0ZSh0aGlzKTtcclxuICAgICAgICB0aGlzLmFkZG9ucy5wdXNoKGFkZG9uKTtcclxuICAgIH1cclxuXHJcbiAgICBkaXNwb3NlKCkge1xyXG4gICAgICAgIHRoaXMuaW5wdXQkLmNvbXBsZXRlKCk7XHJcbiAgICAgICAgdGhpcy5jbGllbnQgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuYWRkb25zLmZvckVhY2goYSA9PiBhLmRpc3Bvc2UoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc3VnZ2VzdEZpbGVzKGFjY2VwdDogc3RyaW5nKTogUHJvbWlzZTxJVGVybWluYWxGaWxlW10+IHtcclxuICAgICAgICBjb25zdCByYW5kID0gTWF0aC5yb3VuZChNYXRoLnJhbmRvbSgpICogMTAwMCk7XHJcbiAgICAgICAgY29uc3QgaWQgPSBgJHtEYXRlLm5vdygpfS0ke3JhbmR9YDtcclxuICAgICAgICBjb25zdCBmaWxlcyA9IHRoaXMuZmlsZXMkLnZhbHVlIGFzIElTdWdnZXN0aW9uW107XHJcbiAgICAgICAgcmV0dXJuIGZpbGVzLmZpbHRlcihmID0+IGYuYWNjZXB0ID09PSBhY2NlcHQpLmNvbmNhdChbXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlkLFxyXG4gICAgICAgICAgICAgICAgbGFiZWw6IFwiLi4uXCIsXHJcbiAgICAgICAgICAgICAgICBvbkFjY2VwdDogYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2xpZW50LmVtaXQoXCJ0ZXJtaW5hbC11cGxvYWRcIiwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXB0XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsZSA9IGF3YWl0IHRoaXMuZmlsZXMkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5waXBlKGZpcnN0KHYgPT4gdi5zb21lKGYgPT4gZi5pZCA9PT0gaWQpKSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgLnBpcGUodGltZW91dCgxMjAwMDApKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAucGlwZShtYXAodiA9PiB2LmZpbmQoZiA9PiBmLmlkID09PSBpZCkpKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAudG9Qcm9taXNlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGUuZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maWxlcyQubmV4dCh0aGlzLmZpbGVzJC52YWx1ZS5maWx0ZXIoZiA9PiBmLmlkICE9PSBpZCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZmlsZS5lcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmaWxlO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHNob3dBbHdheXM6IHRydWUsXHJcbiAgICAgICAgICAgICAgICBhY2NlcHQ6IGFjY2VwdCxcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIF0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGRvd25sb2FkRmlsZShmaWxlbmFtZTogc3RyaW5nLCBidWZmZXI6IEJ1ZmZlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIGNvbnN0IHR5cGUgPSBhd2FpdCBmaWxlVHlwZUZyb21CdWZmZXIoYnVmZmVyKTtcclxuICAgICAgICBjb25zdCBkYXRhID0gYnVmZmVyLnRvU3RyaW5nKFwiYmFzZTY0XCIpO1xyXG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBgZGF0YToke3R5cGUubWltZX07YmFzZTY0LCR7ZGF0YX1gO1xyXG4gICAgICAgIHRoaXMuY2xpZW50LmVtaXQoXCJ0ZXJtaW5hbC1kb3dubG9hZFwiLCB7XHJcbiAgICAgICAgICAgIGZpbGVuYW1lLFxyXG4gICAgICAgICAgICBjb250ZW50XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgYWRkRmlsZSh1cGxvYWQ6IElUZXJtaW5hbEZpbGUpIHtcclxuICAgICAgICBpZiAodXBsb2FkLmNvbnRlbnQpIHtcclxuICAgICAgICAgICAgdXBsb2FkLmJ1ZmZlciA9IEJ1ZmZlci5mcm9tKHVwbG9hZC5jb250ZW50LCBcImJhc2U2NFwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5maWxlcyQubmV4dCh0aGlzLmZpbGVzJC52YWx1ZS5jb25jYXQodXBsb2FkKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5wdXQoZGF0YTogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5pbnB1dCQubmV4dChkYXRhKTtcclxuICAgIH1cclxufVxyXG4iXX0=
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { __decorate } from "tslib";
|
|
2
|
+
import { injectable } from "tsyringe";
|
|
3
|
+
import { Middleware } from "socket-controllers";
|
|
4
|
+
let CompressionMiddleware = class CompressionMiddleware {
|
|
5
|
+
use(socket, next) {
|
|
6
|
+
next();
|
|
7
|
+
}
|
|
8
|
+
};
|
|
9
|
+
CompressionMiddleware = __decorate([
|
|
10
|
+
injectable(),
|
|
11
|
+
Middleware()
|
|
12
|
+
], CompressionMiddleware);
|
|
13
|
+
export { CompressionMiddleware };
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcHJlc3Npb24ubWlkZGxld2FyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zb2NrZXQtbWlkZGxld2FyZXMvY29tcHJlc3Npb24ubWlkZGxld2FyZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUNwQyxPQUFPLEVBQUMsVUFBVSxFQUFzQixNQUFNLG9CQUFvQixDQUFDO0FBSTVELElBQU0scUJBQXFCLEdBQTNCLE1BQU0scUJBQXFCO0lBRTlCLEdBQUcsQ0FBQyxNQUFXLEVBQUUsSUFBd0I7UUFDckMsSUFBSSxFQUFFLENBQUM7SUFDWCxDQUFDO0NBQ0osQ0FBQTtBQUxZLHFCQUFxQjtJQUZqQyxVQUFVLEVBQUU7SUFDWixVQUFVLEVBQUU7R0FDQSxxQkFBcUIsQ0FLakM7U0FMWSxxQkFBcUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2luamVjdGFibGV9IGZyb20gXCJ0c3lyaW5nZVwiO1xyXG5pbXBvcnQge01pZGRsZXdhcmUsIE1pZGRsZXdhcmVJbnRlcmZhY2V9IGZyb20gXCJzb2NrZXQtY29udHJvbGxlcnNcIjtcclxuXHJcbkBpbmplY3RhYmxlKClcclxuQE1pZGRsZXdhcmUoKVxyXG5leHBvcnQgY2xhc3MgQ29tcHJlc3Npb25NaWRkbGV3YXJlIGltcGxlbWVudHMgTWlkZGxld2FyZUludGVyZmFjZSB7XHJcblxyXG4gICAgdXNlKHNvY2tldDogYW55LCBuZXh0OiAoZXJyPzogYW55KSA9PiBhbnkpIHtcclxuICAgICAgICBuZXh0KCk7XHJcbiAgICB9XHJcbn1cclxuIl19
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { existsSync } from "fs";
|
|
2
|
+
import { resolve } from "path";
|
|
3
|
+
import { static as serveStatic } from "express";
|
|
4
|
+
import { EXPRESS } from "./common-types";
|
|
5
|
+
import { EndpointProvider } from "./services/endpoint-provider";
|
|
6
|
+
import { getDirName } from "./utils";
|
|
7
|
+
export async function setupStatic(rootFolder, container) {
|
|
8
|
+
const browserFolder = resolve(rootFolder || getDirName(), `public_html`);
|
|
9
|
+
const app = container.get(EXPRESS);
|
|
10
|
+
const ep = container.get(EndpointProvider);
|
|
11
|
+
console.log(browserFolder, existsSync(browserFolder));
|
|
12
|
+
if (existsSync(browserFolder)) {
|
|
13
|
+
console.log(`public_html exists. setting up static files serving...`);
|
|
14
|
+
app.use(serveStatic(browserFolder, {
|
|
15
|
+
maxAge: "1y"
|
|
16
|
+
}));
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
console.log(`public_html does not exist on path: "${browserFolder}"`);
|
|
20
|
+
}
|
|
21
|
+
await ep.configure(app);
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGljLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N0YXRpYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sSUFBSSxDQUFDO0FBQzlCLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxFQUFDLE1BQU0sSUFBSSxXQUFXLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFDOUMsT0FBTyxFQUFDLE9BQU8sRUFBdUIsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3RCxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSw4QkFBOEIsQ0FBQztBQUM5RCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBRW5DLE1BQU0sQ0FBQyxLQUFLLFVBQVUsV0FBVyxDQUFDLFVBQWtCLEVBQUUsU0FBK0I7SUFFakYsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLFVBQVUsSUFBSSxVQUFVLEVBQUUsRUFBRSxhQUFhLENBQUMsQ0FBQztJQUN6RSxNQUFNLEdBQUcsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ25DLE1BQU0sRUFBRSxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUUzQyxPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztJQUV0RCxJQUFJLFVBQVUsQ0FBQyxhQUFhLENBQUMsRUFBRTtRQUMzQixPQUFPLENBQUMsR0FBRyxDQUFDLHdEQUF3RCxDQUFDLENBQUM7UUFDdEUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUFFO1lBQy9CLE1BQU0sRUFBRSxJQUFJO1NBQ2YsQ0FBQyxDQUFDLENBQUM7S0FDUDtTQUFNO1FBQ0gsT0FBTyxDQUFDLEdBQUcsQ0FBQyx3Q0FBd0MsYUFBYSxHQUFHLENBQUMsQ0FBQztLQUN6RTtJQUVELE1BQU0sRUFBRSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUM1QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtleGlzdHNTeW5jfSBmcm9tIFwiZnNcIjtcclxuaW1wb3J0IHtyZXNvbHZlfSBmcm9tIFwicGF0aFwiO1xyXG5pbXBvcnQge3N0YXRpYyBhcyBzZXJ2ZVN0YXRpY30gZnJvbSBcImV4cHJlc3NcIjtcclxuaW1wb3J0IHtFWFBSRVNTLCBJRGVwZW5kZW5jeUNvbnRhaW5lcn0gZnJvbSBcIi4vY29tbW9uLXR5cGVzXCI7XHJcbmltcG9ydCB7RW5kcG9pbnRQcm92aWRlcn0gZnJvbSBcIi4vc2VydmljZXMvZW5kcG9pbnQtcHJvdmlkZXJcIjtcclxuaW1wb3J0IHtnZXREaXJOYW1lfSBmcm9tIFwiLi91dGlsc1wiO1xyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwU3RhdGljKHJvb3RGb2xkZXI6IHN0cmluZywgY29udGFpbmVyOiBJRGVwZW5kZW5jeUNvbnRhaW5lcik6IFByb21pc2U8YW55PiB7XHJcblxyXG4gICAgY29uc3QgYnJvd3NlckZvbGRlciA9IHJlc29sdmUocm9vdEZvbGRlciB8fCBnZXREaXJOYW1lKCksIGBwdWJsaWNfaHRtbGApO1xyXG4gICAgY29uc3QgYXBwID0gY29udGFpbmVyLmdldChFWFBSRVNTKTtcclxuICAgIGNvbnN0IGVwID0gY29udGFpbmVyLmdldChFbmRwb2ludFByb3ZpZGVyKTtcclxuXHJcbiAgICBjb25zb2xlLmxvZyhicm93c2VyRm9sZGVyLCBleGlzdHNTeW5jKGJyb3dzZXJGb2xkZXIpKTtcclxuXHJcbiAgICBpZiAoZXhpc3RzU3luYyhicm93c2VyRm9sZGVyKSkge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGBwdWJsaWNfaHRtbCBleGlzdHMuIHNldHRpbmcgdXAgc3RhdGljIGZpbGVzIHNlcnZpbmcuLi5gKTtcclxuICAgICAgICBhcHAudXNlKHNlcnZlU3RhdGljKGJyb3dzZXJGb2xkZXIsIHtcclxuICAgICAgICAgICAgbWF4QWdlOiBcIjF5XCJcclxuICAgICAgICB9KSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGBwdWJsaWNfaHRtbCBkb2VzIG5vdCBleGlzdCBvbiBwYXRoOiBcIiR7YnJvd3NlckZvbGRlcn1cImApO1xyXG4gICAgfVxyXG5cclxuICAgIGF3YWl0IGVwLmNvbmZpZ3VyZShhcHApO1xyXG59XHJcbiJdfQ==
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { getStatusCode, OpenAPI } from "routing-controllers-openapi";
|
|
2
|
+
export function IsDocumented(summary = null, paramDescriptions = {}) {
|
|
3
|
+
return OpenAPI(op => {
|
|
4
|
+
op.summary = summary || op.summary;
|
|
5
|
+
op.tags = ["Documented"].concat(op.tags || []);
|
|
6
|
+
op.parameters?.forEach(p => {
|
|
7
|
+
if (p.$ref)
|
|
8
|
+
return;
|
|
9
|
+
const schema = p;
|
|
10
|
+
schema.description = paramDescriptions[schema.name]
|
|
11
|
+
|| schema.description
|
|
12
|
+
|| `param.${op.operationId}.${schema.name}`.toLowerCase();
|
|
13
|
+
});
|
|
14
|
+
return op;
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
export function JsonResponse(description = "Success", statusCode = null) {
|
|
18
|
+
return OpenAPI((op, route) => {
|
|
19
|
+
const status = statusCode ?? getStatusCode(route) + "";
|
|
20
|
+
op.responses = op.responses || {};
|
|
21
|
+
op.responses[status] = {
|
|
22
|
+
description,
|
|
23
|
+
content: {
|
|
24
|
+
"application/json": {}
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
return op;
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
export function ResponseType(type, options = {}) {
|
|
31
|
+
return OpenAPI((op, route) => {
|
|
32
|
+
const contentType = "application/json";
|
|
33
|
+
const statusCode = options?.statusCode ?? getStatusCode(route) + "";
|
|
34
|
+
const reference = {
|
|
35
|
+
$ref: `#/components/schemas/${type.name}`,
|
|
36
|
+
};
|
|
37
|
+
const schema = options.isArray
|
|
38
|
+
? { items: reference, type: "array" }
|
|
39
|
+
: reference;
|
|
40
|
+
op.responses = op.responses || {};
|
|
41
|
+
op.responses[statusCode] = {
|
|
42
|
+
description: options.description || "Success",
|
|
43
|
+
content: {
|
|
44
|
+
[contentType]: {
|
|
45
|
+
schema
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
return op;
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlsaXRpZXMvZGVjb3JhdG9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsYUFBYSxFQUFFLE9BQU8sRUFBQyxNQUFNLDZCQUE2QixDQUFDO0FBR25FLE1BQU0sVUFBVSxZQUFZLENBQUMsVUFBa0IsSUFBSSxFQUFFLG9CQUE4QyxFQUFFO0lBQ2pHLE9BQU8sT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFO1FBQ2hCLEVBQUUsQ0FBQyxPQUFPLEdBQUcsT0FBTyxJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUM7UUFDbkMsRUFBRSxDQUFDLElBQUksR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQy9DLEVBQUUsQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ3ZCLElBQUksQ0FBQyxDQUFDLElBQUk7Z0JBQUUsT0FBTztZQUNuQixNQUFNLE1BQU0sR0FBRyxDQUFpQixDQUFDO1lBQ2pDLE1BQU0sQ0FBQyxXQUFXLEdBQUcsaUJBQWlCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQzttQkFDNUMsTUFBTSxDQUFDLFdBQVc7bUJBQ2xCLFNBQVMsRUFBRSxDQUFDLFdBQVcsSUFBSSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbEUsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLEVBQUUsQ0FBQztJQUNkLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQUVELE1BQU0sVUFBVSxZQUFZLENBQUMsY0FBc0IsU0FBUyxFQUFFLGFBQXFCLElBQUk7SUFDbkYsT0FBTyxPQUFPLENBQUMsQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUU7UUFDekIsTUFBTSxNQUFNLEdBQUcsVUFBVSxJQUFJLGFBQWEsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDdkQsRUFBRSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQztRQUNsQyxFQUFFLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHO1lBQ25CLFdBQVc7WUFDWCxPQUFPLEVBQUU7Z0JBQ0wsa0JBQWtCLEVBQUUsRUFBRTthQUN6QjtTQUNKLENBQUM7UUFDRixPQUFPLEVBQUUsQ0FBQztJQUNkLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQVFELE1BQU0sVUFBVSxZQUFZLENBQUMsSUFBYyxFQUFFLFVBQWdDLEVBQUU7SUFDM0UsT0FBTyxPQUFPLENBQUMsQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUU7UUFDekIsTUFBTSxXQUFXLEdBQUcsa0JBQWtCLENBQUM7UUFDdkMsTUFBTSxVQUFVLEdBQUcsT0FBTyxFQUFFLFVBQVUsSUFBSSxhQUFhLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3BFLE1BQU0sU0FBUyxHQUFvQjtZQUMvQixJQUFJLEVBQUUsd0JBQXdCLElBQUksQ0FBQyxJQUFJLEVBQUU7U0FDNUMsQ0FBQztRQUNGLE1BQU0sTUFBTSxHQUFpQixPQUFPLENBQUMsT0FBTztZQUN4QyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUU7WUFDckMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUNoQixFQUFFLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDO1FBQ2xDLEVBQUUsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLEdBQUc7WUFDdkIsV0FBVyxFQUFFLE9BQU8sQ0FBQyxXQUFXLElBQUksU0FBUztZQUM3QyxPQUFPLEVBQUU7Z0JBQ0wsQ0FBQyxXQUFXLENBQUMsRUFBRTtvQkFDWCxNQUFNO2lCQUNUO2FBQ0o7U0FDSixDQUFDO1FBQ0YsT0FBTyxFQUFFLENBQUM7SUFDZCxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2dldFN0YXR1c0NvZGUsIE9wZW5BUEl9IGZyb20gXCJyb3V0aW5nLWNvbnRyb2xsZXJzLW9wZW5hcGlcIjtcclxuaW1wb3J0IHtSZWZlcmVuY2VPYmplY3QsIFNjaGVtYU9iamVjdH0gZnJvbSBcIm9wZW5hcGkzLXRzXCI7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gSXNEb2N1bWVudGVkKHN1bW1hcnk6IHN0cmluZyA9IG51bGwsIHBhcmFtRGVzY3JpcHRpb25zOiB7W25hbWU6IHN0cmluZ106IHN0cmluZ30gPSB7fSkge1xyXG4gICAgcmV0dXJuIE9wZW5BUEkob3AgPT4ge1xyXG4gICAgICAgIG9wLnN1bW1hcnkgPSBzdW1tYXJ5IHx8IG9wLnN1bW1hcnk7XHJcbiAgICAgICAgb3AudGFncyA9IFtcIkRvY3VtZW50ZWRcIl0uY29uY2F0KG9wLnRhZ3MgfHwgW10pO1xyXG4gICAgICAgIG9wLnBhcmFtZXRlcnM/LmZvckVhY2gocCA9PiB7XHJcbiAgICAgICAgICAgIGlmIChwLiRyZWYpIHJldHVybjtcclxuICAgICAgICAgICAgY29uc3Qgc2NoZW1hID0gcCBhcyBTY2hlbWFPYmplY3Q7XHJcbiAgICAgICAgICAgIHNjaGVtYS5kZXNjcmlwdGlvbiA9IHBhcmFtRGVzY3JpcHRpb25zW3NjaGVtYS5uYW1lXVxyXG4gICAgICAgICAgICAgICAgfHwgc2NoZW1hLmRlc2NyaXB0aW9uXHJcbiAgICAgICAgICAgICAgICB8fCBgcGFyYW0uJHtvcC5vcGVyYXRpb25JZH0uJHtzY2hlbWEubmFtZX1gLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIG9wO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBKc29uUmVzcG9uc2UoZGVzY3JpcHRpb246IHN0cmluZyA9IFwiU3VjY2Vzc1wiLCBzdGF0dXNDb2RlOiBudW1iZXIgPSBudWxsKSB7XHJcbiAgICByZXR1cm4gT3BlbkFQSSgob3AsIHJvdXRlKSA9PiB7XHJcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gc3RhdHVzQ29kZSA/PyBnZXRTdGF0dXNDb2RlKHJvdXRlKSArIFwiXCI7XHJcbiAgICAgICAgb3AucmVzcG9uc2VzID0gb3AucmVzcG9uc2VzIHx8IHt9O1xyXG4gICAgICAgIG9wLnJlc3BvbnNlc1tzdGF0dXNdID0ge1xyXG4gICAgICAgICAgICBkZXNjcmlwdGlvbixcclxuICAgICAgICAgICAgY29udGVudDoge1xyXG4gICAgICAgICAgICAgICAgXCJhcHBsaWNhdGlvbi9qc29uXCI6IHt9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICAgIHJldHVybiBvcDtcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElSZXNwb25zZVR5cGVPcHRpb25zIHtcclxuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xyXG4gICAgc3RhdHVzQ29kZT86IG51bWJlcjtcclxuICAgIGlzQXJyYXk/OiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gUmVzcG9uc2VUeXBlKHR5cGU6IEZ1bmN0aW9uLCBvcHRpb25zOiBJUmVzcG9uc2VUeXBlT3B0aW9ucyA9IHt9KSB7XHJcbiAgICByZXR1cm4gT3BlbkFQSSgob3AsIHJvdXRlKSA9PiB7XHJcbiAgICAgICAgY29uc3QgY29udGVudFR5cGUgPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcclxuICAgICAgICBjb25zdCBzdGF0dXNDb2RlID0gb3B0aW9ucz8uc3RhdHVzQ29kZSA/PyBnZXRTdGF0dXNDb2RlKHJvdXRlKSArIFwiXCI7XHJcbiAgICAgICAgY29uc3QgcmVmZXJlbmNlOiBSZWZlcmVuY2VPYmplY3QgPSB7XHJcbiAgICAgICAgICAgICRyZWY6IGAjL2NvbXBvbmVudHMvc2NoZW1hcy8ke3R5cGUubmFtZX1gLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3Qgc2NoZW1hOiBTY2hlbWFPYmplY3QgPSBvcHRpb25zLmlzQXJyYXlcclxuICAgICAgICAgICAgPyB7IGl0ZW1zOiByZWZlcmVuY2UsIHR5cGU6IFwiYXJyYXlcIiB9XHJcbiAgICAgICAgICAgIDogcmVmZXJlbmNlO1xyXG4gICAgICAgIG9wLnJlc3BvbnNlcyA9IG9wLnJlc3BvbnNlcyB8fCB7fTtcclxuICAgICAgICBvcC5yZXNwb25zZXNbc3RhdHVzQ29kZV0gPSB7XHJcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBvcHRpb25zLmRlc2NyaXB0aW9uIHx8IFwiU3VjY2Vzc1wiLFxyXG4gICAgICAgICAgICBjb250ZW50OiB7XHJcbiAgICAgICAgICAgICAgICBbY29udGVudFR5cGVdOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2NoZW1hXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICAgIHJldHVybiBvcDtcclxuICAgIH0pO1xyXG59XHJcbiJdfQ==
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { isFactoryProvider } from "tsyringe";
|
|
2
|
+
import { Tree } from "./tree";
|
|
3
|
+
import { isString } from "../utils";
|
|
4
|
+
export class DiContainer {
|
|
5
|
+
constructor(container, parent = null) {
|
|
6
|
+
this.container = container;
|
|
7
|
+
this.parent = parent;
|
|
8
|
+
container["wrapperContainer"] = this;
|
|
9
|
+
this.tokens = [];
|
|
10
|
+
this.tokenSet = new Set();
|
|
11
|
+
this.root = new Tree(this, false, "");
|
|
12
|
+
}
|
|
13
|
+
get registeredTokens() {
|
|
14
|
+
return (this.parent?.registeredTokens || []).concat(this.tokens);
|
|
15
|
+
}
|
|
16
|
+
get tree() {
|
|
17
|
+
return this.root;
|
|
18
|
+
}
|
|
19
|
+
beforeResolution(token, callback, options) {
|
|
20
|
+
this.container.beforeResolution(token, callback, options);
|
|
21
|
+
}
|
|
22
|
+
afterResolution(token, callback, options) {
|
|
23
|
+
this.container.afterResolution(token, callback, options);
|
|
24
|
+
}
|
|
25
|
+
clearInstances() {
|
|
26
|
+
this.container.clearInstances();
|
|
27
|
+
}
|
|
28
|
+
createChildContainer() {
|
|
29
|
+
return new DiContainer(this.container.createChildContainer(), this);
|
|
30
|
+
}
|
|
31
|
+
isRegistered(token, recursive) {
|
|
32
|
+
return this.container.isRegistered(token, recursive);
|
|
33
|
+
}
|
|
34
|
+
register(token, provider, options) {
|
|
35
|
+
if (isFactoryProvider(provider)) {
|
|
36
|
+
this.container.register(token, {
|
|
37
|
+
useFactory: dc => {
|
|
38
|
+
return provider.useFactory(dc["wrapperContainer"]);
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
return this.addToken(token);
|
|
42
|
+
}
|
|
43
|
+
this.container.register(token, provider);
|
|
44
|
+
return this.addToken(token);
|
|
45
|
+
}
|
|
46
|
+
registerInstance(token, instance) {
|
|
47
|
+
this.container.registerInstance(token, instance);
|
|
48
|
+
return this.addToken(token);
|
|
49
|
+
}
|
|
50
|
+
registerSingleton(from, to) {
|
|
51
|
+
this.container.registerSingleton(from, to);
|
|
52
|
+
return this.addToken(from);
|
|
53
|
+
}
|
|
54
|
+
registerType(from, to) {
|
|
55
|
+
this.container.registerType(from, to);
|
|
56
|
+
return this.addToken(from);
|
|
57
|
+
}
|
|
58
|
+
reset() {
|
|
59
|
+
this.tokens = [];
|
|
60
|
+
this.tokenSet = new Set();
|
|
61
|
+
this.container.reset();
|
|
62
|
+
}
|
|
63
|
+
resolve(token) {
|
|
64
|
+
return this.container.resolve(token);
|
|
65
|
+
}
|
|
66
|
+
resolveAll(token) {
|
|
67
|
+
return this.container.resolveAll(token);
|
|
68
|
+
}
|
|
69
|
+
get(token) {
|
|
70
|
+
return this.container.resolve(token);
|
|
71
|
+
}
|
|
72
|
+
addToken(token) {
|
|
73
|
+
if (this.tokenSet.has(token))
|
|
74
|
+
return this;
|
|
75
|
+
this.tokenSet.add(token);
|
|
76
|
+
this.tokens.push(token);
|
|
77
|
+
if (isString(token)) {
|
|
78
|
+
this.root.addPath(token);
|
|
79
|
+
}
|
|
80
|
+
return this;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGktY29udGFpbmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3V0aWxpdGllcy9kaS1jb250YWluZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUtILGlCQUFpQixFQUlwQixNQUFNLFVBQVUsQ0FBQztBQUVsQixPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFVbEMsTUFBTSxPQUFPLFdBQVc7SUFjcEIsWUFBc0IsU0FBOEIsRUFBVyxTQUErQixJQUFJO1FBQTVFLGNBQVMsR0FBVCxTQUFTLENBQXFCO1FBQVcsV0FBTSxHQUFOLE1BQU0sQ0FBNkI7UUFDOUYsU0FBUyxDQUFDLGtCQUFrQixDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQ3JDLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7UUFDMUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFqQkQsSUFBSSxnQkFBZ0I7UUFDaEIsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsZ0JBQWdCLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBRUQsSUFBSSxJQUFJO1FBQ0osT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ3JCLENBQUM7SUFhRCxnQkFBZ0IsQ0FBSSxLQUF3QixFQUFFLFFBQTZDLEVBQUUsT0FBa0M7UUFDM0gsSUFBSSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFFRCxlQUFlLENB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Q0FBQztRQUN6QixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4QixJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNqQixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUM1QjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgICBDbGFzc1Byb3ZpZGVyLFxyXG4gICAgRGVwZW5kZW5jeUNvbnRhaW5lcixcclxuICAgIEZyZXF1ZW5jeSxcclxuICAgIEluamVjdGlvblRva2VuLFxyXG4gICAgaXNGYWN0b3J5UHJvdmlkZXIsXHJcbiAgICBSZWdpc3RyYXRpb25PcHRpb25zLFxyXG4gICAgVG9rZW5Qcm92aWRlcixcclxuICAgIFZhbHVlUHJvdmlkZXJcclxufSBmcm9tIFwidHN5cmluZ2VcIjtcclxuaW1wb3J0IHtGYWN0b3J5UHJvdmlkZXIsIElEZXBlbmRlbmN5Q29udGFpbmVyLCBJVHJlZSwgVHlwZX0gZnJvbSBcIi4uL2NvbW1vbi10eXBlc1wiO1xyXG5pbXBvcnQge1RyZWV9IGZyb20gXCIuL3RyZWVcIjtcclxuaW1wb3J0IHtpc1N0cmluZ30gZnJvbSBcIi4uL3V0aWxzXCI7XHJcblxyXG5pbnRlcmZhY2UgUHJlUmVzb2x1dGlvbkludGVyY2VwdG9yQ2FsbGJhY2s8VCA9IGFueT4ge1xyXG4gICAgKHRva2VuOiBJbmplY3Rpb25Ub2tlbjxUPiwgcmVzb2x1dGlvblR5cGU6IFwiU2luZ2xlXCIgfCBcIkFsbFwiKTogdm9pZDtcclxufVxyXG5cclxuaW50ZXJmYWNlIFBvc3RSZXNvbHV0aW9uSW50ZXJjZXB0b3JDYWxsYmFjazxUID0gYW55PiB7XHJcbiAgICAodG9rZW46IEluamVjdGlvblRva2VuPFQ+LCByZXN1bHQ6IFQgfCBUW10sIHJlc29sdXRpb25UeXBlOiBcIlNpbmdsZVwiIHwgXCJBbGxcIik6IHZvaWQ7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBEaUNvbnRhaW5lciBpbXBsZW1lbnRzIElEZXBlbmRlbmN5Q29udGFpbmVyIHtcclxuXHJcbiAgICBnZXQgcmVnaXN0ZXJlZFRva2VucygpOiBSZWFkb25seUFycmF5PEluamVjdGlvblRva2VuPiB7XHJcbiAgICAgICAgcmV0dXJuICh0aGlzLnBhcmVudD8ucmVnaXN0ZXJlZFRva2VucyB8fCBbXSkuY29uY2F0KHRoaXMudG9rZW5zKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgdHJlZSgpOiBJVHJlZSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucm9vdDtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgdG9rZW5zOiBBcnJheTxJbmplY3Rpb25Ub2tlbj47XHJcbiAgICBwcm90ZWN0ZWQgdG9rZW5TZXQ6IFNldDxJbmplY3Rpb25Ub2tlbj47XHJcbiAgICBwcm90ZWN0ZWQgcm9vdDogVHJlZTtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgY29udGFpbmVyOiBEZXBlbmRlbmN5Q29udGFpbmVyLCByZWFkb25seSBwYXJlbnQ6IElEZXBlbmRlbmN5Q29udGFpbmVyID0gbnVsbCkge1xyXG4gICAgICAgIGNvbnRhaW5lcltcIndyYXBwZXJDb250YWluZXJcIl0gPSB0aGlzO1xyXG4gICAgICAgIHRoaXMudG9rZW5zID0gW107XHJcbiAgICAgICAgdGhpcy50b2tlblNldCA9IG5ldyBTZXQ8SW5qZWN0aW9uVG9rZW4+KCk7XHJcbiAgICAgICAgdGhpcy5yb290ID0gbmV3IFRyZWUodGhpcywgZmFsc2UsIFwiXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIGJlZm9yZVJlc29sdXRpb248VD4odG9rZW46IEluamVjdGlvblRva2VuPFQ+LCBjYWxsYmFjazogUHJlUmVzb2x1dGlvbkludGVyY2VwdG9yQ2FsbGJhY2s8VD4sIG9wdGlvbnM/OiB7IGZyZXF1ZW5jeTogRnJlcXVlbmN5IH0pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmNvbnRhaW5lci5iZWZvcmVSZXNvbHV0aW9uKHRva2VuLCBjYWxsYmFjaywgb3B0aW9ucyk7XHJcbiAgICB9XHJcblxyXG4gICAgYWZ0ZXJSZXNvbHV0aW9uPFQ+KHRva2VuOiBJbmplY3Rpb25Ub2tlbjxUPiwgY2FsbGJhY2s6IFBvc3RSZXNvbHV0aW9uSW50ZXJjZXB0b3JDYWxsYmFjazxUPiwgb3B0aW9ucz86IHsgZnJlcXVlbmN5OiBGcmVxdWVuY3kgfSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuY29udGFpbmVyLmFmdGVyUmVzb2x1dGlvbih0b2tlbiwgY2FsbGJhY2ssIG9wdGlvbnMpO1xyXG4gICAgfVxyXG5cclxuICAgIGNsZWFySW5zdGFuY2VzKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuY29udGFpbmVyLmNsZWFySW5zdGFuY2VzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgY3JlYXRlQ2hpbGRDb250YWluZXIoKTogSURlcGVuZGVuY3lDb250YWluZXIge1xyXG4gICAgICAgIHJldHVybiBuZXcgRGlDb250YWluZXIodGhpcy5jb250YWluZXIuY3JlYXRlQ2hpbGRDb250YWluZXIoKSwgdGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgaXNSZWdpc3RlcmVkPFQ+KHRva2VuOiBJbmplY3Rpb25Ub2tlbjxUPiwgcmVjdXJzaXZlPzogYm9vbGVhbik6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5lci5pc1JlZ2lzdGVyZWQodG9rZW4sIHJlY3Vyc2l2ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVnaXN0ZXI8VD4odG9rZW46IEluamVjdGlvblRva2VuPFQ+LCBwcm92aWRlcjogVmFsdWVQcm92aWRlcjxUPik6IElEZXBlbmRlbmN5Q29udGFpbmVyO1xyXG4gICAgcmVnaXN0ZXI8VD4odG9rZW46IEluamVjdGlvblRva2VuPFQ+LCBwcm92aWRlcjogRmFjdG9yeVByb3ZpZGVyPFQ+KTogSURlcGVuZGVuY3lDb250YWluZXI7XHJcbiAgICByZWdpc3RlcjxUPih0b2tlbjogSW5qZWN0aW9uVG9rZW48VD4sIHByb3ZpZGVyOiBUb2tlblByb3ZpZGVyPFQ+LCBvcHRpb25zPzogUmVnaXN0cmF0aW9uT3B0aW9ucyk6IElEZXBlbmRlbmN5Q29udGFpbmVyO1xyXG4gICAgcmVnaXN0ZXI8VD4odG9rZW46IEluamVjdGlvblRva2VuPFQ+LCBwcm92aWRlcjogQ2xhc3NQcm92aWRlcjxUPiwgb3B0aW9ucz86IFJlZ2lzdHJhdGlvbk9wdGlvbnMpOiBJRGVwZW5kZW5jeUNvbnRhaW5lcjtcclxuICAgIHJlZ2lzdGVyPFQ+KHRva2VuOiBJbmplY3Rpb25Ub2tlbjxUPiwgcHJvdmlkZXI6IFR5cGU8VD4sIG9wdGlvbnM/OiBSZWdpc3RyYXRpb25PcHRpb25zKTogSURlcGVuZGVuY3lDb250YWluZXI7XHJcbiAgICByZWdpc3Rlcih0b2tlbiwgcHJvdmlkZXIsIG9wdGlvbnM/OiBSZWdpc3RyYXRpb25PcHRpb25zKTogSURlcGVuZGVuY3lDb250YWluZXIge1xyXG4gICAgICAgIGlmIChpc0ZhY3RvcnlQcm92aWRlcihwcm92aWRlcikpIHtcclxuICAgICAgICAgICAgdGhpcy5jb250YWluZXIucmVnaXN0ZXIodG9rZW4sIHtcclxuICAgICAgICAgICAgICAgIHVzZUZhY3Rvcnk6IGRjID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJvdmlkZXIudXNlRmFjdG9yeShkY1tcIndyYXBwZXJDb250YWluZXJcIl0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWRkVG9rZW4odG9rZW4pO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmNvbnRhaW5lci5yZWdpc3Rlcih0b2tlbiwgcHJvdmlkZXIpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmFkZFRva2VuKHRva2VuKTtcclxuICAgIH1cclxuXHJcbiAgICByZWdpc3Rlckluc3RhbmNlPFQ+KHRva2VuOiBJbmplY3Rpb25Ub2tlbjxUPiwgaW5zdGFuY2U6IFQpOiBJRGVwZW5kZW5jeUNvbnRhaW5lciB7XHJcbiAgICAgICAgdGhpcy5jb250YWluZXIucmVnaXN0ZXJJbnN0YW5jZSh0b2tlbiwgaW5zdGFuY2UpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmFkZFRva2VuKHRva2VuKTtcclxuICAgIH1cclxuXHJcbiAgICByZWdpc3RlclNpbmdsZXRvbjxUPihmcm9tOiBJbmplY3Rpb25Ub2tlbjxUPiwgdG86IEluamVjdGlvblRva2VuPFQ+KTogSURlcGVuZGVuY3lDb250YWluZXI7XHJcbiAgICByZWdpc3RlclNpbmdsZXRvbjxUPih0b2tlbjogVHlwZTxUPik6IElEZXBlbmRlbmN5Q29udGFpbmVyO1xyXG4gICAgcmVnaXN0ZXJTaW5nbGV0b24oZnJvbSwgdG8/KTogSURlcGVuZGVuY3lDb250YWluZXIge1xyXG4gICAgICAgIHRoaXMuY29udGFpbmVyLnJlZ2lzdGVyU2luZ2xldG9uKGZyb20sIHRvKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5hZGRUb2tlbihmcm9tKTtcclxuICAgIH1cclxuXHJcbiAgICByZWdpc3RlclR5cGU8VD4oZnJvbTogSW5qZWN0aW9uVG9rZW48VD4sIHRvOiBJbmplY3Rpb25Ub2tlbjxUPik6IElEZXBlbmRlbmN5Q29udGFpbmVyIHtcclxuICAgICAgICB0aGlzLmNvbnRhaW5lci5yZWdpc3RlclR5cGUoZnJvbSwgdG8pO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmFkZFRva2VuKGZyb20pO1xyXG4gICAgfVxyXG5cclxuICAgIHJlc2V0KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMudG9rZW5zID0gW107XHJcbiAgICAgICAgdGhpcy50b2tlblNldCA9IG5ldyBTZXQ8SW5qZWN0aW9uVG9rZW4+KCk7XHJcbiAgICAgICAgdGhpcy5jb250YWluZXIucmVzZXQoKTtcclxuICAgIH1cclxuXHJcbiAgICByZXNvbHZlPFQ+KHRva2VuOiBJbmplY3Rpb25Ub2tlbjxUPik6IFQge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5lci5yZXNvbHZlKHRva2VuKTtcclxuICAgIH1cclxuXHJcbiAgICByZXNvbHZlQWxsPFQ+KHRva2VuOiBJbmplY3Rpb25Ub2tlbjxUPik6IFRbXSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyLnJlc29sdmVBbGwodG9rZW4pO1xyXG4gICAgfVxyXG5cclxuICAgIGdldDxUPih0b2tlbjogSW5qZWN0aW9uVG9rZW48VD4pOiBUIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb250YWluZXIucmVzb2x2ZSh0b2tlbik7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGFkZFRva2VuPFQ+KHRva2VuOiBJbmplY3Rpb25Ub2tlbjxUPik6IHRoaXMge1xyXG4gICAgICAgIGlmICh0aGlzLnRva2VuU2V0Lmhhcyh0b2tlbikpIHJldHVybiB0aGlzO1xyXG4gICAgICAgIHRoaXMudG9rZW5TZXQuYWRkKHRva2VuKTtcclxuICAgICAgICB0aGlzLnRva2Vucy5wdXNoKHRva2VuKTtcclxuICAgICAgICBpZiAoaXNTdHJpbmcodG9rZW4pKSB7XHJcbiAgICAgICAgICAgIHRoaXMucm9vdC5hZGRQYXRoKHRva2VuKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbn1cclxuIl19
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { __decorate } from "tslib";
|
|
2
|
+
import { injectable, Lifecycle, scoped } from "tsyringe";
|
|
3
|
+
let EmptyJob = class EmptyJob {
|
|
4
|
+
async process() {
|
|
5
|
+
return null;
|
|
6
|
+
}
|
|
7
|
+
};
|
|
8
|
+
EmptyJob = __decorate([
|
|
9
|
+
injectable(),
|
|
10
|
+
scoped(Lifecycle.ContainerScoped)
|
|
11
|
+
], EmptyJob);
|
|
12
|
+
export { EmptyJob };
|
|
13
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1wdHktam9iLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3V0aWxpdGllcy9lbXB0eS1qb2IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBQyxVQUFVLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUtoRCxJQUFNLFFBQVEsR0FBZCxNQUFNLFFBQVE7SUFFakIsS0FBSyxDQUFDLE9BQU87UUFDVCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0NBQ0osQ0FBQTtBQUxZLFFBQVE7SUFGcEIsVUFBVSxFQUFFO0lBQ1osTUFBTSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUM7R0FDckIsUUFBUSxDQUtwQjtTQUxZLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2luamVjdGFibGUsIExpZmVjeWNsZSwgc2NvcGVkfSBmcm9tIFwidHN5cmluZ2VcIjtcclxuaW1wb3J0IHtJSm9ifSBmcm9tIFwiLi4vY29tbW9uLXR5cGVzXCI7XHJcblxyXG5AaW5qZWN0YWJsZSgpXHJcbkBzY29wZWQoTGlmZWN5Y2xlLkNvbnRhaW5lclNjb3BlZClcclxuZXhwb3J0IGNsYXNzIEVtcHR5Sm9iIGltcGxlbWVudHMgSUpvYiB7XHJcblxyXG4gICAgYXN5bmMgcHJvY2VzcygpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export class LazyAssetGenerator {
|
|
2
|
+
constructor(assetResolver, progresses, lazyId) {
|
|
3
|
+
this.assetResolver = assetResolver;
|
|
4
|
+
this.progresses = progresses;
|
|
5
|
+
this.lazyId = lazyId;
|
|
6
|
+
}
|
|
7
|
+
get assets() {
|
|
8
|
+
return this.assetResolver.assets;
|
|
9
|
+
}
|
|
10
|
+
get lazyAssets() {
|
|
11
|
+
return this.assetResolver.lazyAssets;
|
|
12
|
+
}
|
|
13
|
+
async process(messaging) {
|
|
14
|
+
const lazyAsset = await this.lazyAssets.read(this.lazyId);
|
|
15
|
+
let progress = await this.progresses.get(lazyAsset.progressId);
|
|
16
|
+
if (!progress || progress.canceled)
|
|
17
|
+
return null;
|
|
18
|
+
progress.setMessageBridge(messaging);
|
|
19
|
+
try {
|
|
20
|
+
const asset = await this.generate(progress, messaging);
|
|
21
|
+
progress = await progress.load();
|
|
22
|
+
if (!progress || progress.canceled)
|
|
23
|
+
return null;
|
|
24
|
+
await lazyAsset.writeAsset(asset);
|
|
25
|
+
}
|
|
26
|
+
catch (e) {
|
|
27
|
+
await progress.setError(e.message || e);
|
|
28
|
+
throw e;
|
|
29
|
+
}
|
|
30
|
+
if (progress.remaining > 0) {
|
|
31
|
+
await progress.advance(progress.remaining);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF6eS1hc3NldC1nZW5lcmF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbGl0aWVzL2xhenktYXNzZXQtZ2VuZXJhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQU1BLE1BQU0sT0FBZ0Isa0JBQWtCO0lBVXBDLFlBQWdDLGFBQTRCLEVBQVksVUFBc0IsRUFBWSxNQUFjO1FBQXhGLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQVksZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUFZLFdBQU0sR0FBTixNQUFNLENBQVE7SUFDeEgsQ0FBQztJQVRELElBQUksTUFBTTtRQUNOLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUM7SUFDckMsQ0FBQztJQUVELElBQUksVUFBVTtRQUNWLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUM7SUFDekMsQ0FBQztJQU9ELEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBeUI7UUFDbkMsTUFBTSxTQUFTLEdBQUcsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDMUQsSUFBSSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDL0QsSUFBSSxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUMsUUFBUTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ2hELFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNyQyxJQUFJO1lBQ0EsTUFBTSxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUN2RCxRQUFRLEdBQUcsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDakMsSUFBSSxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUMsUUFBUTtnQkFBRSxPQUFPLElBQUksQ0FBQztZQUNoRCxNQUFNLFNBQVMsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDckM7UUFBQyxPQUFPLENBQUMsRUFBRTtZQUNSLE1BQU0sUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ3hDLE1BQU0sQ0FBQyxDQUFDO1NBQ1g7UUFDRCxJQUFJLFFBQVEsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxFQUFFO1lBQ3hCLE1BQU0sUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDOUM7SUFDTCxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0lBc3NldCwgSUpvYiwgSU1lc3NhZ2VCcmlkZ2UsIElQcm9ncmVzc30gZnJvbSBcIi4uL2NvbW1vbi10eXBlc1wiO1xyXG5pbXBvcnQge0Fzc2V0c30gZnJvbSBcIi4uL3NlcnZpY2VzL2Fzc2V0c1wiO1xyXG5pbXBvcnQge0xhenlBc3NldHN9IGZyb20gXCIuLi9zZXJ2aWNlcy9sYXp5LWFzc2V0c1wiO1xyXG5pbXBvcnQge0Fzc2V0UmVzb2x2ZXJ9IGZyb20gXCIuLi9zZXJ2aWNlcy9hc3NldC1yZXNvbHZlclwiO1xyXG5pbXBvcnQge1Byb2dyZXNzZXN9IGZyb20gXCIuLi9zZXJ2aWNlcy9wcm9ncmVzc2VzXCI7XHJcblxyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTGF6eUFzc2V0R2VuZXJhdG9yIGltcGxlbWVudHMgSUpvYiB7XHJcblxyXG4gICAgZ2V0IGFzc2V0cygpOiBBc3NldHMge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmFzc2V0UmVzb2x2ZXIuYXNzZXRzO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBsYXp5QXNzZXRzKCk6IExhenlBc3NldHMge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmFzc2V0UmVzb2x2ZXIubGF6eUFzc2V0cztcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgY29uc3RydWN0b3IocHJvdGVjdGVkIGFzc2V0UmVzb2x2ZXI6IEFzc2V0UmVzb2x2ZXIsIHByb3RlY3RlZCBwcm9ncmVzc2VzOiBQcm9ncmVzc2VzLCBwcm90ZWN0ZWQgbGF6eUlkOiBzdHJpbmcpIHtcclxuICAgIH1cclxuXHJcbiAgICBhYnN0cmFjdCBnZW5lcmF0ZShwcm9ncmVzczogSVByb2dyZXNzLCBtZXNzYWdpbmc/OiBJTWVzc2FnZUJyaWRnZSk6IFByb21pc2U8SUFzc2V0PjtcclxuXHJcbiAgICBhc3luYyBwcm9jZXNzKG1lc3NhZ2luZzogSU1lc3NhZ2VCcmlkZ2UpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgICAgIGNvbnN0IGxhenlBc3NldCA9IGF3YWl0IHRoaXMubGF6eUFzc2V0cy5yZWFkKHRoaXMubGF6eUlkKTtcclxuICAgICAgICBsZXQgcHJvZ3Jlc3MgPSBhd2FpdCB0aGlzLnByb2dyZXNzZXMuZ2V0KGxhenlBc3NldC5wcm9ncmVzc0lkKTtcclxuICAgICAgICBpZiAoIXByb2dyZXNzIHx8IHByb2dyZXNzLmNhbmNlbGVkKSByZXR1cm4gbnVsbDtcclxuICAgICAgICBwcm9ncmVzcy5zZXRNZXNzYWdlQnJpZGdlKG1lc3NhZ2luZyk7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29uc3QgYXNzZXQgPSBhd2FpdCB0aGlzLmdlbmVyYXRlKHByb2dyZXNzLCBtZXNzYWdpbmcpO1xyXG4gICAgICAgICAgICBwcm9ncmVzcyA9IGF3YWl0IHByb2dyZXNzLmxvYWQoKTtcclxuICAgICAgICAgICAgaWYgKCFwcm9ncmVzcyB8fCBwcm9ncmVzcy5jYW5jZWxlZCkgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIGF3YWl0IGxhenlBc3NldC53cml0ZUFzc2V0KGFzc2V0KTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHByb2dyZXNzLnNldEVycm9yKGUubWVzc2FnZSB8fCBlKTtcclxuICAgICAgICAgICAgdGhyb3cgZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHByb2dyZXNzLnJlbWFpbmluZyA+IDApIHtcclxuICAgICAgICAgICAgYXdhaXQgcHJvZ3Jlc3MuYWR2YW5jZShwcm9ncmVzcy5yZW1haW5pbmcpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iXX0=
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
import { model, Types } from "mongoose";
|
|
2
|
+
import { getValue as getMongoValue, setValue as setMongoValue } from "mongoose/lib/utils";
|
|
3
|
+
import { BadRequestError, createParamDecorator, HttpError } from "routing-controllers";
|
|
4
|
+
import { diContainers, isArray, isFunction, isObject, isString, valueToPromise } from "../utils";
|
|
5
|
+
const pluginsKey = "typegoose:plugins";
|
|
6
|
+
/**
|
|
7
|
+
* A mongoose/typegoose plugin to inject services from the main di container to a schema as virtuals
|
|
8
|
+
* @param schema
|
|
9
|
+
* @param services
|
|
10
|
+
*/
|
|
11
|
+
export function injectServices(schema, services) {
|
|
12
|
+
const serviceMap = {};
|
|
13
|
+
if (!isObject(services)) {
|
|
14
|
+
throw new Error(`services object should be defined to inject services to schema!`);
|
|
15
|
+
}
|
|
16
|
+
Object.keys(services).forEach(prop => {
|
|
17
|
+
schema
|
|
18
|
+
.virtual(prop)
|
|
19
|
+
.get(() => {
|
|
20
|
+
const diContainer = diContainers.appContainer;
|
|
21
|
+
serviceMap[prop] = serviceMap[prop] || (!diContainer ? {} : diContainer.resolve(services[prop]));
|
|
22
|
+
return serviceMap[prop];
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Decorates a property to inject a service with the help of the injectServices mongoose/typegoose plugin
|
|
28
|
+
* @param token optional InjectionToken to use
|
|
29
|
+
* @return PropertyDecorator
|
|
30
|
+
*/
|
|
31
|
+
export function service(token) {
|
|
32
|
+
return (target, propertyKey) => {
|
|
33
|
+
const propertyType = Reflect.getOwnMetadata("design:type", target, propertyKey);
|
|
34
|
+
const plugins = Array.from(Reflect.getMetadata(pluginsKey, target.constructor) ?? []);
|
|
35
|
+
let plugin = plugins.find(t => t.mongoosePlugin === injectServices);
|
|
36
|
+
if (!plugin) {
|
|
37
|
+
plugin = { mongoosePlugin: injectServices, options: {} };
|
|
38
|
+
plugins.push(plugin);
|
|
39
|
+
}
|
|
40
|
+
plugin.options = Object.assign(plugin.options || {}, { [propertyKey]: token ?? propertyType });
|
|
41
|
+
Reflect.defineMetadata(pluginsKey, plugins, target.constructor);
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Paginate using a typegoose model using a simple where query and pagination params
|
|
46
|
+
* @param model Typegoose model
|
|
47
|
+
* @param where Simple query to filter the results
|
|
48
|
+
* @param params Pagination params
|
|
49
|
+
*/
|
|
50
|
+
export function paginate(model, where, params) {
|
|
51
|
+
return model.countDocuments(where).then(count => {
|
|
52
|
+
let query = model.find(where);
|
|
53
|
+
if (isString(params.sort)) {
|
|
54
|
+
query = query.sort(params.sort);
|
|
55
|
+
}
|
|
56
|
+
if (isArray(params.populate)) {
|
|
57
|
+
params.populate.forEach(field => {
|
|
58
|
+
query = query.populate(field);
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
return (params.limit > 0 ? query.skip(params.page * params.limit).limit(params.limit) : query).then(items => {
|
|
62
|
+
const meta = { total: count };
|
|
63
|
+
return { count, items, meta };
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
export function lookupStages(from, localField, as = null, foreignField = "_id", shouldUnwind = true) {
|
|
68
|
+
as = as || localField.replace("Id", "");
|
|
69
|
+
const stages = [
|
|
70
|
+
{
|
|
71
|
+
$lookup: {
|
|
72
|
+
from,
|
|
73
|
+
localField,
|
|
74
|
+
foreignField,
|
|
75
|
+
as
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
$unwind: {
|
|
80
|
+
path: `$${as}`,
|
|
81
|
+
preserveNullAndEmptyArrays: true
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
];
|
|
85
|
+
if (!shouldUnwind) {
|
|
86
|
+
stages.splice(1, 1);
|
|
87
|
+
}
|
|
88
|
+
return stages;
|
|
89
|
+
}
|
|
90
|
+
export function letsLookupStage(from, pipeline, as = null, letFields = null) {
|
|
91
|
+
as = as || from;
|
|
92
|
+
letFields = letFields || { id: "$_id" };
|
|
93
|
+
return {
|
|
94
|
+
$lookup: {
|
|
95
|
+
from,
|
|
96
|
+
let: letFields,
|
|
97
|
+
pipeline,
|
|
98
|
+
as
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
export function matchStage(match) {
|
|
103
|
+
return { $match: match };
|
|
104
|
+
}
|
|
105
|
+
export function matchField(field, filter, when) {
|
|
106
|
+
return { field, filter, when };
|
|
107
|
+
}
|
|
108
|
+
export function matchFieldStages(...fields) {
|
|
109
|
+
const match = {};
|
|
110
|
+
fields.forEach(field => {
|
|
111
|
+
if (field.when) {
|
|
112
|
+
match[field.field] = field.filter;
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
return Object.keys(match).length > 0 ? [matchStage(match)] : [];
|
|
116
|
+
}
|
|
117
|
+
export function projectStage(fields) {
|
|
118
|
+
return { $project: fields };
|
|
119
|
+
}
|
|
120
|
+
export function unwindStage(fieldOrOpts) {
|
|
121
|
+
return { $unwind: fieldOrOpts };
|
|
122
|
+
}
|
|
123
|
+
export function hydratePopulated(modelType, json) {
|
|
124
|
+
let object = modelType.hydrate(json);
|
|
125
|
+
for (const [path, obj] of Object.entries(modelType.schema.obj)) {
|
|
126
|
+
let { ref, type } = obj;
|
|
127
|
+
if (Array.isArray(type) && type.length > 0) {
|
|
128
|
+
ref = type[0].ref;
|
|
129
|
+
}
|
|
130
|
+
if (!ref)
|
|
131
|
+
continue;
|
|
132
|
+
const value = getMongoValue(path, json);
|
|
133
|
+
const hydrateVal = val => {
|
|
134
|
+
if (val == null || val instanceof Types.ObjectId)
|
|
135
|
+
return val;
|
|
136
|
+
return hydratePopulated(model(ref), val);
|
|
137
|
+
};
|
|
138
|
+
if (Array.isArray(value)) {
|
|
139
|
+
setMongoValue(path, value.map(hydrateVal), object);
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
setMongoValue(path, hydrateVal(value), object);
|
|
143
|
+
}
|
|
144
|
+
return object;
|
|
145
|
+
}
|
|
146
|
+
export async function paginateAggregations(model, aggregations, params, metaProjection = {}) {
|
|
147
|
+
const sortField = !isString(params.sort) || !params.sort ? null : (params.sort.startsWith("-") ? params.sort.substr(1) : params.sort);
|
|
148
|
+
const sortAggregation = !sortField ? [] : [{
|
|
149
|
+
$sort: { [sortField]: sortField == params.sort ? 1 : -1 }
|
|
150
|
+
}];
|
|
151
|
+
const result = await model.aggregate([
|
|
152
|
+
...aggregations,
|
|
153
|
+
...sortAggregation,
|
|
154
|
+
{
|
|
155
|
+
$group: {
|
|
156
|
+
_id: "results",
|
|
157
|
+
result: { $push: "$$CURRENT" }
|
|
158
|
+
}
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
$project: {
|
|
162
|
+
_id: 0,
|
|
163
|
+
items: params.limit > 0 ? { $slice: ["$result", params.page * params.limit, params.limit] } : "$result",
|
|
164
|
+
count: { $size: "$result" },
|
|
165
|
+
meta: {
|
|
166
|
+
total: { $size: "$result" },
|
|
167
|
+
...metaProjection
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
]);
|
|
172
|
+
const pagination = result[0];
|
|
173
|
+
if (!pagination) {
|
|
174
|
+
return { items: [], count: 0, meta: { total: 0 } };
|
|
175
|
+
}
|
|
176
|
+
pagination.items = pagination.items.map(i => hydratePopulated(model, i));
|
|
177
|
+
return pagination;
|
|
178
|
+
}
|
|
179
|
+
export function ResolveEntity(model, extraCheck) {
|
|
180
|
+
const modelName = model.modelName;
|
|
181
|
+
const paramName = modelName.toLowerCase();
|
|
182
|
+
return createParamDecorator({
|
|
183
|
+
required: false,
|
|
184
|
+
value: async (action) => {
|
|
185
|
+
const req = action.request;
|
|
186
|
+
const token = req.header(`x-${paramName}-token`);
|
|
187
|
+
const id = req.params[`${paramName}Id`];
|
|
188
|
+
if (!id && !token) {
|
|
189
|
+
throw new BadRequestError(`${modelName} id or token should be defined!`);
|
|
190
|
+
}
|
|
191
|
+
const query = !token
|
|
192
|
+
? model.findById(id)
|
|
193
|
+
: model.findOne({ token });
|
|
194
|
+
let doc = null;
|
|
195
|
+
if (isFunction(extraCheck)) {
|
|
196
|
+
try {
|
|
197
|
+
doc = await valueToPromise(extraCheck(query, action));
|
|
198
|
+
}
|
|
199
|
+
catch (e) {
|
|
200
|
+
throw new BadRequestError(`${modelName} check error: ${e.message || e}`);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
doc = await query;
|
|
205
|
+
}
|
|
206
|
+
if (!doc) {
|
|
207
|
+
throw new HttpError(404, !token
|
|
208
|
+
? `${modelName} could not be found with id: ${id}`
|
|
209
|
+
: `${modelName} could not be found with token: ${token}`);
|
|
210
|
+
}
|
|
211
|
+
action.request[paramName] = doc;
|
|
212
|
+
return doc;
|
|
213
|
+
}
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9uZ29vc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbGl0aWVzL21vbmdvb3NlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBd0IsS0FBSyxFQUF1QyxLQUFLLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFDbEcsT0FBTyxFQUFDLFFBQVEsSUFBSSxhQUFhLEVBQUUsUUFBUSxJQUFJLGFBQWEsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRXhGLE9BQU8sRUFBUyxlQUFlLEVBQUUsb0JBQW9CLEVBQUUsU0FBUyxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFZN0YsT0FBTyxFQUFDLFlBQVksRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsY0FBYyxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBRS9GLE1BQU0sVUFBVSxHQUFHLG1CQUFtQixDQUFDO0FBT3ZDOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUFDLE1BQW1CLEVBQUUsUUFBa0Q7SUFDbEcsTUFBTSxVQUFVLEdBQTRCLEVBQUUsQ0FBQztJQUMvQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFO1FBQ3JCLE1BQU0sSUFBSSxLQUFLLENBQUMsaUVBQWlFLENBQUMsQ0FBQTtLQUNyRjtJQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1FBQ2pDLE1BQU07YUFDRCxPQUFPLENBQUMsSUFBSSxDQUFDO2FBQ2IsR0FBRyxDQUFDLEdBQUcsRUFBRTtZQUNOLE1BQU0sV0FBVyxHQUFHLFlBQVksQ0FBQyxZQUFZLENBQUM7WUFDOUMsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxPQUFP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U0FBUyxpQkFBaUIsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2lCQUM1RTthQUNKO2lCQUFNO2dCQUNILEdBQUcsR0FBRyxNQUFNLEtBQUssQ0FBQzthQUNyQjtZQUNELElBQUksQ0FBQyxHQUFHLEVBQUU7Z0JBQ04sTUFBTSxJQUFJLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLO29CQUMzQixDQUFDLENBQUMsR0FBRyxTQUFTLGdDQUFnQyxFQUFFLEVBQUU7b0JBQ2xELENBQUMsQ0FBQyxHQUFHLFNBQVMsbUNBQW1DLEtBQUssRUFBRSxDQUFDLENBQUM7YUFDakU7WUFDRCxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztZQUNoQyxPQUFPLEdBQUcsQ0FBQztRQUNmLENBQUM7S0FDSixDQUFDLENBQUM7QUFDUCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtEb2N1bWVudCwgRmlsdGVyUXVlcnksIG1vZGVsLCBNb2RlbCwgUGlwZWxpbmVTdGFnZSwgUXVlcnksIFNjaGVtYSwgVHlwZXN9IGZyb20gXCJtb25nb29zZVwiO1xyXG5pbXBvcnQge2dldFZhbHVlIGFzIGdldE1vbmdvVmFsdWUsIHNldFZhbHVlIGFzIHNldE1vbmdvVmFsdWV9IGZyb20gXCJtb25nb29zZS9saWIvdXRpbHNcIjtcclxuaW1wb3J0IHtEb2N1bWVudFR5cGUsIFJldHVybk1vZGVsVHlwZX0gZnJvbSBcIkB0eXBlZ29vc2UvdHlwZWdvb3NlXCI7XHJcbmltcG9ydCB7QWN0aW9uLCBCYWRSZXF1ZXN0RXJyb3IsIGNyZWF0ZVBhcmFtRGVjb3JhdG9yLCBIdHRwRXJyb3J9IGZyb20gXCJyb3V0aW5nLWNvbnRyb2xsZXJzXCI7XHJcbmltcG9ydCB7SW5qZWN0aW9uVG9rZW59IGZyb20gXCJ0c3lyaW5nZVwiO1xyXG5pbXBvcnQge1xyXG4gICAgSU1hdGNoRmllbGQsXHJcbiAgICBJbmZlckdlbmVyaWMsXHJcbiAgICBJUGFnaW5hdGlvbkJhc2UsXHJcbiAgICBJUGFnaW5hdGlvblBhcmFtcyxcclxuICAgIElQcm9qZWN0T3B0aW9ucyxcclxuICAgIElSZXF1ZXN0LFxyXG4gICAgSVVud2luZE9wdGlvbnMsXHJcbiAgICBUeXBlXHJcbn0gZnJvbSBcIi4uL2NvbW1vbi10eXBlc1wiO1xyXG5pbXBvcnQge2RpQ29udGFpbmVycywgaXNBcnJheSwgaXNGdW5jdGlvbiwgaXNPYmplY3QsIGlzU3RyaW5nLCB2YWx1ZVRvUHJvbWlzZX0gZnJvbSBcIi4uL3V0aWxzXCI7XHJcblxyXG5jb25zdCBwbHVnaW5zS2V5ID0gXCJ0eXBlZ29vc2U6cGx1Z2luc1wiO1xyXG5cclxuaW50ZXJmYWNlIElQbHVnaW5XaXRoT3B0aW9ucyB7XHJcbiAgICBtb25nb29zZVBsdWdpbjogRnVuY3Rpb247XHJcbiAgICBvcHRpb25zOiBhbnk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBIG1vbmdvb3NlL3R5cGVnb29zZSBwbHVnaW4gdG8gaW5qZWN0IHNlcnZpY2VzIGZyb20gdGhlIG1haW4gZGkgY29udGFpbmVyIHRvIGEgc2NoZW1hIGFzIHZpcnR1YWxzXHJcbiAqIEBwYXJhbSBzY2hlbWFcclxuICogQHBhcmFtIHNlcnZpY2VzXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0U2VydmljZXMoc2NoZW1hOiBTY2hlbWE8YW55Piwgc2VydmljZXM/OiB7IFtwcm9wOiBzdHJpbmddOiBJbmplY3Rpb25Ub2tlbjxhbnk+IH0pOiB2b2lkIHtcclxuICAgIGNvbnN0IHNlcnZpY2VNYXA6IHsgW3Byb3A6IHN0cmluZ106IGFueSB9ID0ge307XHJcbiAgICBpZiAoIWlzT2JqZWN0KHNlcnZpY2VzKSkge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgc2VydmljZXMgb2JqZWN0IHNob3VsZCBiZSBkZWZpbmVkIHRvIGluamVjdCBzZXJ2aWNlcyB0byBzY2hlbWEhYClcclxuICAgIH1cclxuICAgIE9iamVjdC5rZXlzKHNlcnZpY2VzKS5mb3JFYWNoKHByb3AgPT4ge1xyXG4gICAgICAgIHNjaGVtYVxyXG4gICAgICAgICAgICAudmlydHVhbChwcm9wKVxyXG4gICAgICAgICAgICAuZ2V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRpQ29udGFpbmVyID0gZGlDb250YWluZXJzLmFwcENvbnRhaW5lcjtcclxuICAgICAgICAgICAgICAgIHNlcnZpY2VNYXBbcHJvcF0gPSBzZXJ2aWNlTWFwW3Byb3BdIHx8ICghZGlDb250YWluZXIgPyB7fSA6IGRpQ29udGFpbmVyLnJlc29sdmUoc2VydmljZXNbcHJvcF0pKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlTWFwW3Byb3BdO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH0pO1xyXG59XHJcblxyXG4vKipcclxuICogRGVjb3JhdGVzIGEgcHJvcGVydHkgdG8gaW5qZWN0IGEgc2VydmljZSB3aXRoIHRoZSBoZWxwIG9mIHRoZSBpbmplY3RTZXJ2aWNlcyBtb25nb29zZS90eXBlZ29vc2UgcGx1Z2luXHJcbiAqIEBwYXJhbSB0b2tlbiBvcHRpb25hbCBJbmplY3Rpb25Ub2tlbiB0byB1c2VcclxuICogQHJldHVybiBQcm9wZXJ0eURlY29yYXRvclxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHNlcnZpY2UodG9rZW4/OiBJbmplY3Rpb25Ub2tlbjxhbnk+KTogUHJvcGVydHlEZWNvcmF0b3Ige1xyXG4gICAgcmV0dXJuICh0YXJnZXQ6IGFueSwgcHJvcGVydHlLZXk6IHN0cmluZyk6IHZvaWQgPT4ge1xyXG4gICAgICAgIGNvbnN0IHByb3BlcnR5VHlwZSA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCB0YXJnZXQsIHByb3BlcnR5S2V5KTtcclxuICAgICAgICBjb25zdCBwbHVnaW5zID0gQXJyYXkuZnJvbShSZWZsZWN0LmdldE1ldGFkYXRhKHBsdWdpbnNLZXksIHRhcmdldC5jb25zdHJ1Y3RvcikgPz8gW10pIGFzIElQbHVnaW5XaXRoT3B0aW9uc1tdO1xyXG4gICAgICAgIGxldCBwbHVnaW4gPSBwbHVnaW5zLmZpbmQodCA9PiB0Lm1vbmdvb3NlUGx1Z2luID09PSBpbmplY3RTZXJ2aWNlcyk7XHJcbiAgICAgICAgaWYgKCFwbHVnaW4pIHtcclxuICAgICAgICAgICAgcGx1Z2luID0geyBtb25nb29zZVBsdWdpbjogaW5qZWN0U2VydmljZXMsIG9wdGlvbnM6IHt9IH07XHJcbiAgICAgICAgICAgIHBsdWdpbnMucHVzaChwbHVnaW4pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBwbHVnaW4ub3B0aW9ucyA9IE9iamVjdC5hc3NpZ24ocGx1Z2luLm9wdGlvbnMgfHwge30sIHtbcHJvcGVydHlLZXldOiB0b2tlbiA/PyBwcm9wZXJ0eVR5cGV9KTtcclxuICAgICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKHBsdWdpbnNLZXksIHBsdWdpbnMsIHRhcmdldC5jb25zdHJ1Y3Rvcik7XHJcbiAgICB9O1xyXG59XHJcblxyXG4vKipcclxuICogUGFnaW5hdGUgdXNpbmcgYSB0eXBlZ29vc2UgbW9kZWwgdXNpbmcgYSBzaW1wbGUgd2hlcmUgcXVlcnkgYW5kIHBhZ2luYXRpb24gcGFyYW1zXHJcbiAqIEBwYXJhbSBtb2RlbCBUeXBlZ29vc2UgbW9kZWxcclxuICogQHBhcmFtIHdoZXJlIFNpbXBsZSBxdWVyeSB0byBmaWx0ZXIgdGhlIHJlc3VsdHNcclxuICogQHBhcmFtIHBhcmFtcyBQYWdpbmF0aW9uIHBhcmFtc1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHBhZ2luYXRlPFQgZXh0ZW5kcyBUeXBlPGFueT4sIFUgPSBJbmZlckdlbmVyaWM8VD4+KG1vZGVsOiBSZXR1cm5Nb2RlbFR5cGU8VD4sIHdoZXJlOiBGaWx0ZXJRdWVyeTxEb2N1bWVudFR5cGU8VT4+LCBwYXJhbXM6IElQYWdpbmF0aW9uUGFyYW1zKTogUHJvbWlzZTxJUGFnaW5hdGlvbkJhc2U8RG9jdW1lbnRUeXBlPFU+Pj4ge1xyXG4gICAgcmV0dXJuIG1vZGVsLmNvdW50RG9jdW1lbnRzKHdoZXJlKS50aGVuKGNvdW50ID0+IHtcclxuICAgICAgICBsZXQgcXVlcnk6IFF1ZXJ5PGFueSwgYW55PiA9IG1vZGVsLmZpbmQod2hlcmUpO1xyXG4gICAgICAgIGlmIChpc1N0cmluZyhwYXJhbXMuc29ydCkpIHtcclxuICAgICAgICAgICAgcXVlcnkgPSBxdWVyeS5zb3J0KHBhcmFtcy5zb3J0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGlzQXJyYXkocGFyYW1zLnBvcHVsYXRlKSkge1xyXG4gICAgICAgICAgICBwYXJhbXMucG9wdWxhdGUuZm9yRWFjaChmaWVsZCA9PiB7XHJcbiAgICAgICAgICAgICAgICBxdWVyeSA9IHF1ZXJ5LnBvcHVsYXRlKGZpZWxkKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAocGFyYW1zLmxpbWl0ID4gMCA/IHF1ZXJ5LnNraXAocGFyYW1zLnBhZ2UgKiBwYXJhbXMubGltaXQpLmxpbWl0KHBhcmFtcy5saW1pdCkgOiBxdWVyeSkudGhlbihpdGVtcyA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IG1ldGEgPSB7dG90YWw6IGNvdW50fTtcclxuICAgICAgICAgICAgcmV0dXJuIHtjb3VudCwgaXRlbXMsIG1ldGF9O1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBsb29rdXBTdGFnZXMoZnJvbTogc3RyaW5nLCBsb2NhbEZpZWxkOiBzdHJpbmcsIGFzOiBzdHJpbmcgPSBudWxsLCBmb3JlaWduRmllbGQ6IHN0cmluZyA9IFwiX2lkXCIsIHNob3VsZFVud2luZDogYm9vbGVhbiA9IHRydWUpOiBbUGlwZWxpbmVTdGFnZS5Mb29rdXAsIFBpcGVsaW5lU3RhZ2UuVW53aW5kXSB7XHJcbiAgICBhcyA9IGFzIHx8IGxvY2FsRmllbGQucmVwbGFjZShcIklkXCIsIFwiXCIpO1xyXG4gICAgY29uc3Qgc3RhZ2VzOiBbUGlwZWxpbmVTdGFnZS5Mb29rdXAsIFBpcGVsaW5lU3RhZ2UuVW53aW5kXSA9IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgICRsb29rdXA6IHtcclxuICAgICAgICAgICAgICAgIGZyb20sXHJcbiAgICAgICAgICAgICAgICBsb2NhbEZpZWxkLFxyXG4gICAgICAgICAgICAgICAgZm9yZWlnbkZpZWxkLFxyXG4gICAgICAgICAgICAgICAgYXNcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAkdW53aW5kOiB7XHJcbiAgICAgICAgICAgICAgICBwYXRoOiBgJCR7YXN9YCxcclxuICAgICAgICAgICAgICAgIHByZXNlcnZlTnVsbEFuZEVtcHR5QXJyYXlzOiB0cnVlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICBdO1xyXG4gICAgaWYgKCFzaG91bGRVbndpbmQpIHtcclxuICAgICAgICBzdGFnZXMuc3BsaWNlKDEsIDEpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHN0YWdlcztcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGxldHNMb29rdXBTdGFnZShmcm9tOiBzdHJpbmcsIHBpcGVsaW5lOiBFeGNsdWRlPFBpcGVsaW5lU3RhZ2UsIFBpcGVsaW5lU3RhZ2UuTWVyZ2UgfCBQaXBlbGluZVN0YWdlLk91dCB8IFBpcGVsaW5lU3RhZ2UuU2VhcmNoPltdLCBhczogc3RyaW5nID0gbnVsbCwgbGV0RmllbGRzOiBhbnkgPSBudWxsKTogUGlwZWxpbmVTdGFnZS5Mb29rdXAge1xyXG4gICAgYXMgPSBhcyB8fCBmcm9tO1xyXG4gICAgbGV0RmllbGRzID0gbGV0RmllbGRzIHx8IHtpZDogXCIkX2lkXCJ9O1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICAkbG9va3VwOiB7XHJcbiAgICAgICAgICAgIGZyb20sXHJcbiAgICAgICAgICAgIGxldDogbGV0RmllbGRzLFxyXG4gICAgICAgICAgICBwaXBlbGluZSxcclxuICAgICAgICAgICAgYXNcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gbWF0Y2hTdGFnZShtYXRjaDogRmlsdGVyUXVlcnk8YW55Pik6IFBpcGVsaW5lU3RhZ2UuTWF0Y2gge1xyXG4gICAgcmV0dXJuIHskbWF0Y2g6IG1hdGNofTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIG1hdGNoRmllbGQoZmllbGQ6IHN0cmluZywgZmlsdGVyOiBhbnksIHdoZW46IGJvb2xlYW4pOiBJTWF0Y2hGaWVsZCB7XHJcbiAgICByZXR1cm4ge2ZpZWxkLCBmaWx0ZXIsIHdoZW59O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gbWF0Y2hGaWVsZFN0YWdlcyguLi5maWVsZHM6IElNYXRjaEZpZWxkW10pOiBSZWFkb25seUFycmF5PFBpcGVsaW5lU3RhZ2UuTWF0Y2g+IHtcclxuICAgIGNvbnN0IG1hdGNoID0ge307XHJcbiAgICBmaWVsZHMuZm9yRWFjaChmaWVsZCA9PiB7XHJcbiAgICAgICAgaWYgKGZpZWxkLndoZW4pIHtcclxuICAgICAgICAgICAgbWF0Y2hbZmllbGQuZmllbGRdID0gZmllbGQuZmlsdGVyO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKG1hdGNoKS5sZW5ndGggPiAwID8gW21hdGNoU3RhZ2UobWF0Y2gpXSA6IFtdO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcHJvamVjdFN0YWdlKGZpZWxkczogSVByb2plY3RPcHRpb25zKTogUGlwZWxpbmVTdGFnZS5Qcm9qZWN0IHtcclxuICAgIHJldHVybiB7JHByb2plY3Q6IGZpZWxkc307XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB1bndpbmRTdGFnZShmaWVsZE9yT3B0czogc3RyaW5nIHwgSVVud2luZE9wdGlvbnMpOiBQaXBlbGluZVN0YWdlLlVud2luZCB7XHJcbiAgICByZXR1cm4geyR1bndpbmQ6IGZpZWxkT3JPcHRzfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGh5ZHJhdGVQb3B1bGF0ZWQ8VCBleHRlbmRzIERvY3VtZW50Pihtb2RlbFR5cGU6IE1vZGVsPFQ+LCBqc29uOiBhbnkpOiBUIHtcclxuICAgIGxldCBvYmplY3QgPSBtb2RlbFR5cGUuaHlkcmF0ZShqc29uKTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IFtwYXRoLCBvYmpdIG9mIE9iamVjdC5lbnRyaWVzKG1vZGVsVHlwZS5zY2hlbWEub2JqKSkge1xyXG4gICAgICAgIGxldCB7cmVmLCB0eXBlfSA9IG9iaiBhcyBhbnk7XHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodHlwZSkgJiYgdHlwZS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHJlZiA9IHR5cGVbMF0ucmVmO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXJlZikgY29udGludWU7XHJcbiAgICAgICAgY29uc3QgdmFsdWUgPSBnZXRNb25nb1ZhbHVlKHBhdGgsIGpzb24pO1xyXG4gICAgICAgIGNvbnN0IGh5ZHJhdGVWYWwgPSB2YWwgPT4ge1xyXG4gICAgICAgICAgICBpZiAodmFsID09IG51bGwgfHwgdmFsIGluc3RhbmNlb2YgVHlwZXMuT2JqZWN0SWQpIHJldHVybiB2YWw7XHJcbiAgICAgICAgICAgIHJldHVybiBoeWRyYXRlUG9wdWxhdGVkKG1vZGVsKHJlZikgYXMgYW55LCB2YWwpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XHJcbiAgICAgICAgICAgIHNldE1vbmdvVmFsdWUocGF0aCwgdmFsdWUubWFwKGh5ZHJhdGVWYWwpLCBvYmplY3QpO1xyXG4gICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0TW9uZ29WYWx1ZShwYXRoLCBoeWRyYXRlVmFsKHZhbHVlKSwgb2JqZWN0KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gb2JqZWN0O1xyXG5cclxufVxyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHBhZ2luYXRlQWdncmVnYXRpb25zPFQgZXh0ZW5kcyBUeXBlPGFueT4sIFUgPSBJbmZlckdlbmVyaWM8VD4+KG1vZGVsOiBSZXR1cm5Nb2RlbFR5cGU8VD4sIGFnZ3JlZ2F0aW9uczogUGlwZWxpbmVTdGFnZVtdLCBwYXJhbXM6IElQYWdpbmF0aW9uUGFyYW1zLCBtZXRhUHJvamVjdGlvbjogYW55ID0ge30pOiBQcm9taXNlPElQYWdpbmF0aW9uQmFzZTxEb2N1bWVudFR5cGU8VT4+PiB7XHJcbiAgICBjb25zdCBzb3J0RmllbGQgPSAhaXNTdHJpbmcocGFyYW1zLnNvcnQpIHx8ICFwYXJhbXMuc29ydCA/IG51bGwgOiAocGFyYW1zLnNvcnQuc3RhcnRzV2l0aChcIi1cIikgPyBwYXJhbXMuc29ydC5zdWJzdHIoMSkgOiBwYXJhbXMuc29ydCk7XHJcbiAgICBjb25zdCBzb3J0QWdncmVnYXRpb246IFBpcGVsaW5lU3RhZ2UuU29ydFtdID0gIXNvcnRGaWVsZCA/IFtdIDogW3tcclxuICAgICAgICAkc29ydDoge1tzb3J0RmllbGRdOiBzb3J0RmllbGQgPT0gcGFyYW1zLnNvcnQgPyAxIDogLTF9XHJcbiAgICB9XTtcclxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG1vZGVsLmFnZ3JlZ2F0ZShbXHJcbiAgICAgICAgLi4uYWdncmVnYXRpb25zLFxyXG4gICAgICAgIC4uLnNvcnRBZ2dyZWdhdGlvbixcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgICRncm91cDoge1xyXG4gICAgICAgICAgICAgICAgX2lkOiBcInJlc3VsdHNcIixcclxuICAgICAgICAgICAgICAgIHJlc3VsdDogeyRwdXNoOiBcIiQkQ1VSUkVOVFwifVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgICRwcm9qZWN0OiB7XHJcbiAgICAgICAgICAgICAgICBfaWQ6IDAsXHJcbiAgICAgICAgICAgICAgICBpdGVtczogcGFyYW1zLmxpbWl0ID4gMCA/IHskc2xpY2U6IFtcIiRyZXN1bHRcIiwgcGFyYW1zLnBhZ2UgKiBwYXJhbXMubGltaXQsIHBhcmFtcy5saW1pdF19IDogXCIkcmVzdWx0XCIsXHJcbiAgICAgICAgICAgICAgICBjb3VudDogeyRzaXplOiBcIiRyZXN1bHRcIn0sXHJcbiAgICAgICAgICAgICAgICBtZXRhOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdG90YWw6IHskc2l6ZTogXCIkcmVzdWx0XCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgIC4uLm1ldGFQcm9qZWN0aW9uXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICBdKTtcclxuICAgIGNvbnN0IHBhZ2luYXRpb24gPSByZXN1bHRbMF0gYXMgSVBhZ2luYXRpb25CYXNlPERvY3VtZW50VHlwZTxVPj47XHJcbiAgICBpZiAoIXBhZ2luYXRpb24pIHtcclxuICAgICAgICByZXR1cm4ge2l0ZW1zOiBbXSwgY291bnQ6IDAsIG1ldGE6IHt0b3RhbDogMH19O1xyXG4gICAgfVxyXG4gICAgcGFnaW5hdGlvbi5pdGVtcyA9IHBhZ2luYXRpb24uaXRlbXMubWFwKGkgPT4gaHlkcmF0ZVBvcHVsYXRlZChtb2RlbCwgaSkgYXMgYW55KTtcclxuICAgIHJldHVybiBwYWdpbmF0aW9uO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gUmVzb2x2ZUVudGl0eTxUIGV4dGVuZHMgVHlwZTxhbnk+LCBVID0gSW5mZXJHZW5lcmljPFQ+Pihtb2RlbDogUmV0dXJuTW9kZWxUeXBlPFQ+LCBleHRyYUNoZWNrPzogKHF1ZXJ5OiBRdWVyeTxEb2N1bWVudFR5cGU8VT4sIGFueT4sIGFjdGlvbjogQWN0aW9uKSA9PiBQcm9taXNlPERvY3VtZW50VHlwZTxVPj4pOiBQYXJhbWV0ZXJEZWNvcmF0b3Ige1xyXG4gICAgY29uc3QgbW9kZWxOYW1lID0gbW9kZWwubW9kZWxOYW1lO1xyXG4gICAgY29uc3QgcGFyYW1OYW1lID0gbW9kZWxOYW1lLnRvTG93ZXJDYXNlKCk7XHJcbiAgICByZXR1cm4gY3JlYXRlUGFyYW1EZWNvcmF0b3Ioe1xyXG4gICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcclxuICAgICAgICB2YWx1ZTogYXN5bmMgYWN0aW9uID0+IHtcclxuICAgICAgICAgICAgY29uc3QgcmVxID0gYWN0aW9uLnJlcXVlc3QgYXMgSVJlcXVlc3Q7XHJcbiAgICAgICAgICAgIGNvbnN0IHRva2VuID0gcmVxLmhlYWRlcihgeC0ke3BhcmFtTmFtZX0tdG9rZW5gKTtcclxuICAgICAgICAgICAgY29uc3QgaWQgPSByZXEucGFyYW1zW2Ake3BhcmFtTmFtZX1JZGBdIGFzIHN0cmluZztcclxuICAgICAgICAgICAgaWYgKCFpZCAmJiAhdG9rZW4pIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXJyb3IoYCR7bW9kZWxOYW1lfSBpZCBvciB0b2tlbiBzaG91bGQgYmUgZGVmaW5lZCFgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCBxdWVyeSA9ICF0b2tlblxyXG4gICAgICAgICAgICAgICAgPyBtb2RlbC5maW5kQnlJZChpZClcclxuICAgICAgICAgICAgICAgIDogbW9kZWwuZmluZE9uZSh7dG9rZW59IGFzIGFueSk7XHJcbiAgICAgICAgICAgIGxldCBkb2M6IERvY3VtZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgaWYgKGlzRnVuY3Rpb24oZXh0cmFDaGVjaykpIHtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZG9jID0gYXdhaXQgdmFsdWVUb1Byb21pc2UoZXh0cmFDaGVjayhxdWVyeSwgYWN0aW9uKSk7XHJcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFcnJvcihgJHttb2RlbE5hbWV9IGNoZWNrIGVycm9yOiAke2UubWVzc2FnZSB8fCBlfWApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZG9jID0gYXdhaXQgcXVlcnk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCFkb2MpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBIdHRwRXJyb3IoNDA0LCAhdG9rZW5cclxuICAgICAgICAgICAgICAgICAgICA/IGAke21vZGVsTmFtZX0gY291bGQgbm90IGJlIGZvdW5kIHdpdGggaWQ6ICR7aWR9YFxyXG4gICAgICAgICAgICAgICAgICAgIDogYCR7bW9kZWxOYW1lfSBjb3VsZCBub3QgYmUgZm91bmQgd2l0aCB0b2tlbjogJHt0b2tlbn1gKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBhY3Rpb24ucmVxdWVzdFtwYXJhbU5hbWVdID0gZG9jO1xyXG4gICAgICAgICAgICByZXR1cm4gZG9jO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG59XHJcbiJdfQ==
|