@wertzui/ngx-restworld-client 2.0.0 → 3.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.
Files changed (38) hide show
  1. package/{esm2015/lib/constants/link-names.js → esm2020/lib/constants/link-names.mjs} +0 -0
  2. package/{esm2015/lib/models/api-url.js → esm2020/lib/models/api-url.mjs} +0 -0
  3. package/{esm2015/lib/models/client-settings.js → esm2020/lib/models/client-settings.mjs} +0 -0
  4. package/{esm2015/lib/models/problem-details.js → esm2020/lib/models/problem-details.mjs} +0 -0
  5. package/{esm2015/lib/models/restworld-options.js → esm2020/lib/models/restworld-options.mjs} +0 -0
  6. package/{esm2015/lib/pipes/as.pipe.js → esm2020/lib/pipes/as.pipe.mjs} +4 -4
  7. package/{esm2015/lib/pipes/safe-url.pipe.js → esm2020/lib/pipes/safe-url.pipe.mjs} +4 -4
  8. package/esm2020/lib/restworld-client.module.mjs +200 -0
  9. package/{esm2015/lib/services/avatar-generator.js → esm2020/lib/services/avatar-generator.mjs} +4 -4
  10. package/{esm2015/lib/services/form.service.js → esm2020/lib/services/form.service.mjs} +4 -4
  11. package/esm2020/lib/services/restworld-client-collection.mjs +39 -0
  12. package/esm2020/lib/services/restworld-client.mjs +162 -0
  13. package/esm2020/lib/services/settings.service.mjs +39 -0
  14. package/esm2020/lib/views/restworld-edit-form/restworld-edit-form.component.mjs +230 -0
  15. package/esm2020/lib/views/restworld-edit-view/restworld-edit-view.component.mjs +313 -0
  16. package/esm2020/lib/views/restworld-file-view/restworld-file-view.component.mjs +57 -0
  17. package/esm2020/lib/views/restworld-image-view/restworld-image-view.component.mjs +100 -0
  18. package/esm2020/lib/views/restworld-list-view/restworld-list-view.component.mjs +341 -0
  19. package/{esm2015/public-api.js → esm2020/public-api.mjs} +0 -0
  20. package/{esm2015/wertzui-ngx-restworld-client.js → esm2020/wertzui-ngx-restworld-client.mjs} +0 -0
  21. package/fesm2015/wertzui-ngx-restworld-client.mjs +1706 -0
  22. package/fesm2015/wertzui-ngx-restworld-client.mjs.map +1 -0
  23. package/fesm2020/wertzui-ngx-restworld-client.mjs +1646 -0
  24. package/fesm2020/wertzui-ngx-restworld-client.mjs.map +1 -0
  25. package/package.json +42 -31
  26. package/bundles/wertzui-ngx-restworld-client.umd.js +0 -2477
  27. package/bundles/wertzui-ngx-restworld-client.umd.js.map +0 -1
  28. package/esm2015/lib/restworld-client.module.js +0 -201
  29. package/esm2015/lib/services/restworld-client-collection.js +0 -42
  30. package/esm2015/lib/services/restworld-client.js +0 -183
  31. package/esm2015/lib/services/settings.service.js +0 -47
  32. package/esm2015/lib/views/restworld-edit-form/restworld-edit-form.component.js +0 -238
  33. package/esm2015/lib/views/restworld-edit-view/restworld-edit-view.component.js +0 -335
  34. package/esm2015/lib/views/restworld-file-view/restworld-file-view.component.js +0 -63
  35. package/esm2015/lib/views/restworld-image-view/restworld-image-view.component.js +0 -107
  36. package/esm2015/lib/views/restworld-list-view/restworld-list-view.component.js +0 -353
  37. package/fesm2015/wertzui-ngx-restworld-client.js +0 -1728
  38. package/fesm2015/wertzui-ngx-restworld-client.js.map +0 -1
@@ -0,0 +1,162 @@
1
+ import { HttpHeaders } from '@angular/common/http';
2
+ import * as _ from "lodash";
3
+ import { FormsResource, Link, PagedListResource, Resource } from "@wertzui/ngx-hal-client";
4
+ import { LinkNames } from "../constants/link-names";
5
+ import { ProblemDetails } from "../models/problem-details";
6
+ export class RESTworldClient {
7
+ constructor(_halClient, _options) {
8
+ this._halClient = _halClient;
9
+ this._options = _options;
10
+ }
11
+ get halClient() {
12
+ return this._halClient;
13
+ }
14
+ async ensureHomeResourceIsSet() {
15
+ if (!this._homeResource) {
16
+ const response = await this.getHomeForced();
17
+ if (ProblemDetails.isProblemDetails(response.body)) {
18
+ throw new Error(`Cannot get the home resource from ${this._options.BaseUrl} with Version ${this._options.Version}. Response was: ${response}`);
19
+ }
20
+ if (!response.body)
21
+ throw new Error(`Cannot get the home resource from ${this._options.BaseUrl} with Version ${this._options.Version}. Response was empty.`);
22
+ this._homeResource = response.body;
23
+ this.setDefaultCurie();
24
+ }
25
+ }
26
+ async getHomeForced() {
27
+ const header = RESTworldClient.createHeaders('application/hal+json', this._options.Version);
28
+ const response = await this.halClient.get(this._options.BaseUrl, Resource, ProblemDetails, header);
29
+ return response;
30
+ }
31
+ setDefaultCurie() {
32
+ const curies = this._homeResource?._links?.curies;
33
+ if (!curies || curies.length === 0 || !curies[0])
34
+ this._defaultCurie = undefined;
35
+ else
36
+ this._defaultCurie = curies[0].name;
37
+ }
38
+ async getList(rel, parameters, headers, curie) {
39
+ const link = this.getLinkFromHome(rel, LinkNames.getList, curie);
40
+ const uri = link.fillTemplate(parameters);
41
+ const response = await this.halClient.get(uri, PagedListResource, ProblemDetails, headers);
42
+ return response;
43
+ }
44
+ async getListByUri(uri, parameters, headers) {
45
+ const link = new Link();
46
+ link.href = uri;
47
+ const filledUri = link.fillTemplate(parameters);
48
+ const response = await this.halClient.get(filledUri, PagedListResource, ProblemDetails, headers);
49
+ return response;
50
+ }
51
+ async getSingle(relOrUri, id, headers, curie) {
52
+ let uri;
53
+ if (relOrUri.startsWith('http')) {
54
+ if (id !== undefined)
55
+ throw new Error('When supplying a URI, an ID cannot be supplied too.');
56
+ if (curie)
57
+ throw new Error('When supplying a URI, a curie cannot be supplied too.');
58
+ uri = relOrUri;
59
+ }
60
+ else {
61
+ if (!_.isNumber(id))
62
+ throw new Error('When supplying a rel, an ID must be supplied too.');
63
+ const link = this.getLinkFromHome(relOrUri, LinkNames.get, curie);
64
+ uri = link.fillTemplate({ id: id.toString() });
65
+ }
66
+ const response = await this.halClient.get(uri, Resource, ProblemDetails, headers);
67
+ return response;
68
+ }
69
+ async save(resource) {
70
+ const saveLink = resource.findLink('save');
71
+ if (!saveLink)
72
+ throw new Error(`The resource ${resource} does not have a save link.`);
73
+ if (!saveLink.name)
74
+ throw new Error(`The save link ${saveLink} does not have a save name.`);
75
+ const uri = saveLink.href;
76
+ const method = saveLink.name.toLowerCase();
77
+ const header = RESTworldClient.createHeaders('application/hal+json', this._options.Version);
78
+ let response;
79
+ switch (method) {
80
+ case 'put':
81
+ response = await this.halClient.put(uri, resource, Resource, ProblemDetails, header);
82
+ break;
83
+ case 'post':
84
+ response = await this.halClient.post(uri, resource, Resource, ProblemDetails, header);
85
+ break;
86
+ default:
87
+ throw new Error(`'${method}' is not allowed as link name for the save link. Only 'POST' and 'PUT' are allowed.`);
88
+ }
89
+ return response;
90
+ }
91
+ async getAllForms(resource) {
92
+ const urls = resource.getFormLinkHrefs();
93
+ const header = RESTworldClient.createHeaders('application/prs.hal-forms+json', this._options.Version);
94
+ const formsPromises = urls.map(url => this._halClient.get(url, FormsResource, ProblemDetails, header));
95
+ const formsAndProblems = await Promise.all(formsPromises);
96
+ return formsAndProblems;
97
+ }
98
+ async submit(template, formValues) {
99
+ const uri = template.target || '';
100
+ const method = template.method?.toLowerCase();
101
+ const header = RESTworldClient.createHeaders('application/prs.hal-forms+json', this._options.Version);
102
+ let response;
103
+ switch (method) {
104
+ case 'put':
105
+ response = await this.halClient.put(uri, formValues, FormsResource, ProblemDetails, header);
106
+ break;
107
+ case 'post':
108
+ response = await this.halClient.post(uri, formValues, FormsResource, ProblemDetails, header);
109
+ break;
110
+ default:
111
+ response = await this.halClient.get(uri, FormsResource, ProblemDetails, header);
112
+ }
113
+ return response;
114
+ }
115
+ async delete(resource) {
116
+ const deleteLink = resource.findLink('delete');
117
+ if (!deleteLink)
118
+ throw new Error(`The resource ${resource} does not have a delete link.`);
119
+ const uri = deleteLink.href;
120
+ const header = RESTworldClient.createHeaders('application/hal+json', this._options.Version);
121
+ const response = await this.halClient.delete(uri, ProblemDetails, header);
122
+ return response;
123
+ }
124
+ getAllLinksFromHome() {
125
+ if (!this._homeResource)
126
+ throw new Error('Home resource is not set. Call ensureHomeResourceIsSet() first.');
127
+ return this._homeResource._links;
128
+ }
129
+ getLinkFromHome(rel, name, curie) {
130
+ const links = this.getLinksFromHome(rel, curie);
131
+ const link = name ? links.find(l => l.name === name) : links[0];
132
+ if (!link)
133
+ throw new Error(`The home resource does not have a link with the rel '${this.getFullRel(rel, curie)}' and the name '${name}'.`);
134
+ return link;
135
+ }
136
+ getLinksFromHome(rel, curie) {
137
+ if (!this._homeResource)
138
+ throw new Error('Home resource is not set. Call ensureHomeResourceIsSet() first.');
139
+ const fullRel = this.getFullRel(rel, curie);
140
+ const links = this._homeResource._links[fullRel];
141
+ if (!links || links.length === 0)
142
+ throw Error(`The home resource does not have a link with the rel '${fullRel}'.`);
143
+ return links;
144
+ }
145
+ getFullRel(rel, curie) {
146
+ // rel already includes a curie => just return it
147
+ if (rel.includes(':'))
148
+ return rel;
149
+ // No curie given => use default curie.
150
+ if (!curie)
151
+ curie = this._defaultCurie;
152
+ // Combine curie and rel
153
+ const fullRel = `${curie}:${rel}`;
154
+ return fullRel;
155
+ }
156
+ static createHeaders(mediaType, version) {
157
+ if (version)
158
+ return new HttpHeaders({ 'Accept': `${mediaType || 'application/hal+json'}; v=${version}` });
159
+ return new HttpHeaders();
160
+ }
161
+ }
162
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdHdvcmxkLWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1yZXN0d29ybGQtY2xpZW50L3NyYy9saWIvc2VydmljZXMvcmVzdHdvcmxkLWNsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFnQixNQUFNLHNCQUFzQixDQUFDO0FBQ2pFLE9BQU8sS0FBSyxDQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBRSxhQUFhLEVBQWEsSUFBSSxFQUFFLGlCQUFpQixFQUFFLFFBQVEsRUFBWSxNQUFNLHlCQUF5QixDQUFBO0FBQy9HLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFHM0QsTUFBTSxPQUFPLGVBQWU7SUFRMUIsWUFDVSxVQUFxQixFQUNyQixRQUEwQjtRQUQxQixlQUFVLEdBQVYsVUFBVSxDQUFXO1FBQ3JCLGFBQVEsR0FBUixRQUFRLENBQWtCO0lBQ2hDLENBQUM7SUFQTCxJQUFXLFNBQVM7UUFDbEIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ3pCLENBQUM7SUFPTSxLQUFLLENBQUMsdUJBQXVCO1FBQ2xDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ3ZCLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQzVDLElBQUksY0FBYyxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDbEQsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQ0FBcUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLGlCQUFpQixJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sbUJBQW1CLFFBQVEsRUFBRSxDQUFDLENBQUM7YUFDaEo7WUFDRCxJQUFJLENBQUMsUUFBUSxD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USxDQUFDLEdBQUcsQ0FBQztZQUNuQixPQUFPLEdBQUcsQ0FBQztRQUViLHVDQUF1QztRQUN2QyxJQUFJLENBQUMsS0FBSztZQUNSLEtBQUssR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBRTdCLHdCQUF3QjtRQUN4QixNQUFNLE9BQU8sR0FBRyxHQUFHLEtBQUssSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUVsQyxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRU8sTUFBTSxDQUFDLGFBQWEsQ0FBQyxTQUFxRSxFQUFFLE9BQWdCO1FBQ2xILElBQUksT0FBTztZQUNULE9BQU8sSUFBSSxXQUFXLENBQUMsRUFBRSxRQUFRLEVBQUUsR0FBRyxTQUFTLElBQUksc0JBQXNCLE9BQU8sT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQy9GLE9BQU8sSUFBSSxXQUFXLEVBQUUsQ0FBQztJQUMzQixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwSGVhZGVycywgSHR0cFJlc3BvbnNlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgKiBhcyBfIGZyb20gXCJsb2Rhc2hcIjtcclxuaW1wb3J0IHsgRm9ybXNSZXNvdXJjZSwgSGFsQ2xpZW50LCBMaW5rLCBQYWdlZExpc3RSZXNvdXJjZSwgUmVzb3VyY2UsIFRlbXBsYXRlIH0gZnJvbSBcIkB3ZXJ0enVpL25neC1oYWwtY2xpZW50XCJcclxuaW1wb3J0IHsgTGlua05hbWVzIH0gZnJvbSBcIi4uL2NvbnN0YW50cy9saW5rLW5hbWVzXCI7XHJcbmltcG9ydCB7IFByb2JsZW1EZXRhaWxzIH0gZnJvbSBcIi4uL21vZGVscy9wcm9ibGVtLWRldGFpbHNcIjtcclxuaW1wb3J0IHsgUkVTVHdvcmxkT3B0aW9ucyB9IGZyb20gXCIuLi9tb2RlbHMvcmVzdHdvcmxkLW9wdGlvbnNcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBSRVNUd29ybGRDbGllbnQge1xyXG5cclxuICBwcml2YXRlIF9ob21lUmVzb3VyY2U/OiBSZXNvdXJjZTtcclxuICBwcml2YXRlIF9kZWZhdWx0Q3VyaWU/OiBzdHJpbmc7XHJcbiAgcHVibGljIGdldCBoYWxDbGllbnQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5faGFsQ2xpZW50O1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIF9oYWxDbGllbnQ6IEhhbENsaWVudCxcclxuICAgIHByaXZhdGUgX29wdGlvbnM6IFJFU1R3b3JsZE9wdGlvbnNcclxuICApIHsgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZW5zdXJlSG9tZVJlc291cmNlSXNTZXQoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoIXRoaXMuX2hvbWVSZXNvdXJjZSkge1xyXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuZ2V0SG9tZUZvcmNlZCgpO1xyXG4gICAgICBpZiAoUHJvYmxlbURldGFpbHMuaXNQcm9ibGVtRGV0YWlscyhyZXNwb25zZS5ib2R5KSkge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGdldCB0aGUgaG9tZSByZXNvdXJjZSBmcm9tICR7dGhpcy5fb3B0aW9ucy5CYXNlVXJsfSB3aXRoIFZlcnNpb24gJHt0aGlzLl9vcHRpb25zLlZlcnNpb259LiBSZXNwb25zZSB3YXM6ICR7cmVzcG9uc2V9YCk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCFyZXNwb25zZS5ib2R5KVxyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGdldCB0aGUgaG9tZSByZXNvdXJjZSBmcm9tICR7dGhpcy5fb3B0aW9ucy5CYXNlVXJsfSB3aXRoIFZlcnNpb24gJHt0aGlzLl9vcHRpb25zLlZlcnNpb259LiBSZXNwb25zZSB3YXMgZW1wdHkuYClcclxuICAgICAgdGhpcy5faG9tZVJlc291cmNlID0gcmVzcG9uc2UuYm9keTtcclxuICAgICAgdGhpcy5zZXREZWZhdWx0Q3VyaWUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgZ2V0SG9tZUZvcmNlZCgpOiBQcm9taXNlPEh0dHBSZXNwb25zZTxSZXNvdXJjZSB8IFByb2JsZW1EZXRhaWxzPj4ge1xyXG4gICAgY29uc3QgaGVhZGVyID0gUkVTVHdvcmxkQ2xpZW50LmNyZWF0ZUhlYWRlcnMoJ2FwcGxpY2F0aW9uL2hhbCtqc29uJywgdGhpcy5fb3B0aW9ucy5WZXJzaW9uKTtcclxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5oYWxDbGllbnQuZ2V0KHRoaXMuX29wdGlvbnMuQmFzZVVybCwgUmVzb3VyY2UsIFByb2JsZW1EZXRhaWxzLCBoZWFkZXIpO1xyXG4gICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXREZWZhdWx0Q3VyaWUoKTogdm9pZCB7XHJcbiAgICBjb25zdCBjdXJpZXMgPSB0aGlzLl9ob21lUmVzb3VyY2U/Ll9saW5rcz8uY3VyaWVzO1xyXG4gICAgaWYgKCFjdXJpZXMgfHwgY3VyaWVzLmxlbmd0aCA9PT0gMCB8fCAhY3VyaWVzWzBdKVxyXG4gICAgICB0aGlzLl9kZWZhdWx0Q3VyaWUgPSB1bmRlZmluZWQ7XHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMuX2RlZmF1bHRDdXJpZSA9IGN1cmllc1swXS5uYW1lO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldExpc3QocmVsOiBzdHJpbmcsIHBhcmFtZXRlcnM6IHt9LCBoZWFkZXJzPzogSHR0cEhlYWRlcnMsIGN1cmllPzogc3RyaW5nKTogUHJvbWlzZTxIdHRwUmVzcG9uc2U8UGFnZWRMaXN0UmVzb3VyY2UgfCBQcm9ibGVtRGV0YWlscz4+e1xyXG4gICAgY29uc3QgbGluayA9IHRoaXMuZ2V0TGlua0Zyb21Ib21lKHJlbCwgTGlua05hbWVzLmdldExpc3QsIGN1cmllKTtcclxuICAgIGNvbnN0IHVyaSA9IGxpbmsuZmlsbFRlbXBsYXRlKHBhcmFtZXRlcnMpO1xyXG5cclxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5oYWxDbGllbnQuZ2V0KHVyaSwgUGFnZWRMaXN0UmVzb3VyY2UsIFByb2JsZW1EZXRhaWxzLCBoZWFkZXJzKTtcclxuXHJcbiAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2V0TGlzdEJ5VXJpKHVyaTogc3RyaW5nLCBwYXJhbWV0ZXJzOiB7fSwgaGVhZGVycz86IEh0dHBIZWFkZXJzKTogUHJvbWlzZTxIdHRwUmVzcG9uc2U8UGFnZWRMaXN0UmVzb3VyY2UgfCBQcm9ibGVtRGV0YWlscz4+IHtcclxuICAgIGNvbnN0IGxpbmsgPSBuZXcgTGluaygpO1xyXG4gICAgbGluay5ocmVmID0gdXJpO1xyXG4gICAgY29uc3QgZmlsbGVkVXJpID0gbGluay5maWxsVGVtcGxhdGUocGFyYW1ldGVycyk7XHJcblxyXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmhhbENsaWVudC5nZXQoZmlsbGVkVXJpLCBQYWdlZExpc3RSZXNvdXJjZSwgUHJvYmxlbURldGFpbHMsIGhlYWRlcnMpO1xyXG5cclxuICAgIHJldHVybiByZXNwb25zZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBnZXRTaW5nbGUocmVsT3JVcmk6IHN0cmluZywgaWQ/OiBudW1iZXIsIGhlYWRlcnM/OiBIdHRwSGVhZGVycywgY3VyaWU/OiBzdHJpbmcpOiBQcm9taXNlPEh0dHBSZXNwb25zZTxSZXNvdXJjZSB8IFByb2JsZW1EZXRhaWxzPj4ge1xyXG4gICAgbGV0IHVyaTtcclxuICAgIGlmIChyZWxPclVyaS5zdGFydHNXaXRoKCdodHRwJykpIHtcclxuICAgICAgaWYgKGlkICE9PSB1bmRlZmluZWQpXHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXaGVuIHN1cHBseWluZyBhIFVSSSwgYW4gSUQgY2Fubm90IGJlIHN1cHBsaWVkIHRvby4nKVxyXG4gICAgICBpZiAoY3VyaWUpXHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXaGVuIHN1cHBseWluZyBhIFVSSSwgYSBjdXJpZSBjYW5ub3QgYmUgc3VwcGxpZWQgdG9vLicpXHJcblxyXG4gICAgICB1cmkgPSByZWxPclVyaTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAoIV8uaXNOdW1iZXIoaWQpKVxyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignV2hlbiBzdXBwbHlpbmcgYSByZWwsIGFuIElEIG11c3QgYmUgc3VwcGxpZWQgdG9vLicpXHJcblxyXG4gICAgICBjb25zdCBsaW5rID0gdGhpcy5nZXRMaW5rRnJvbUhvbWUocmVsT3JVcmksIExpbmtOYW1lcy5nZXQsIGN1cmllKTtcclxuICAgICAgdXJpID0gbGluay5maWxsVGVtcGxhdGUoeyBpZDogaWQudG9TdHJpbmcoKSB9KTtcclxuICAgIH1cclxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5oYWxDbGllbnQuZ2V0KHVyaSwgUmVzb3VyY2UsIFByb2JsZW1EZXRhaWxzLCBoZWFkZXJzKTtcclxuXHJcbiAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgc2F2ZShyZXNvdXJjZTogUmVzb3VyY2UpOiBQcm9taXNlPEh0dHBSZXNwb25zZTxSZXNvdXJjZSB8IFByb2JsZW1EZXRhaWxzPj4ge1xyXG4gICAgY29uc3Qgc2F2ZUxpbmsgPSByZXNvdXJjZS5maW5kTGluaygnc2F2ZScpO1xyXG4gICAgaWYgKCFzYXZlTGluaylcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgcmVzb3VyY2UgJHtyZXNvdXJjZX0gZG9lcyBub3QgaGF2ZSBhIHNhdmUgbGluay5gKTtcclxuICAgIGlmICghc2F2ZUxpbmsubmFtZSlcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgc2F2ZSBsaW5rICR7c2F2ZUxpbmt9IGRvZXMgbm90IGhhdmUgYSBzYXZlIG5hbWUuYCk7XHJcblxyXG4gICAgY29uc3QgdXJpID0gc2F2ZUxpbmsuaHJlZjtcclxuICAgIGNvbnN0IG1ldGhvZCA9IHNhdmVMaW5rLm5hbWUudG9Mb3dlckNhc2UoKTtcclxuICAgIGNvbnN0IGhlYWRlciA9IFJFU1R3b3JsZENsaWVudC5jcmVhdGVIZWFkZXJzKCdhcHBsaWNhdGlvbi9oYWwranNvbicsIHRoaXMuX29wdGlvbnMuVmVyc2lvbik7XHJcblxyXG4gICAgbGV0IHJlc3BvbnNlO1xyXG4gICAgc3dpdGNoIChtZXRob2QpIHtcclxuICAgICAgY2FzZSAncHV0JzpcclxuICAgICAgICByZXNwb25zZSA9IGF3YWl0IHRoaXMuaGFsQ2xpZW50LnB1dCh1cmksIHJlc291cmNlLCBSZXNvdXJjZSwgUHJvYmxlbURldGFpbHMsIGhlYWRlcik7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ3Bvc3QnOlxyXG4gICAgICAgIHJlc3BvbnNlID0gYXdhaXQgdGhpcy5oYWxDbGllbnQucG9zdCh1cmksIHJlc291cmNlLCBSZXNvdXJjZSwgUHJvYmxlbURldGFpbHMsIGhlYWRlcik7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAnJHttZXRob2R9JyBpcyBub3QgYWxsb3dlZCBhcyBsaW5rIG5hbWUgZm9yIHRoZSBzYXZlIGxpbmsuIE9ubHkgJ1BPU1QnIGFuZCAnUFVUJyBhcmUgYWxsb3dlZC5gKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2V0QWxsRm9ybXMocmVzb3VyY2U6IFJlc291cmNlKTogUHJvbWlzZTxIdHRwUmVzcG9uc2U8Rm9ybXNSZXNvdXJjZSB8IFByb2JsZW1EZXRhaWxzPltdPiB7XHJcbiAgICBjb25zdCB1cmxzID0gcmVzb3VyY2UuZ2V0Rm9ybUxpbmtIcmVmcygpO1xyXG4gICAgY29uc3QgaGVhZGVyID0gUkVTVHdvcmxkQ2xpZW50LmNyZWF0ZUhlYWRlcnMoJ2FwcGxpY2F0aW9uL3Bycy5oYWwtZm9ybXMranNvbicsIHRoaXMuX29wdGlvbnMuVmVyc2lvbik7XHJcbiAgICBjb25zdCBmb3Jtc1Byb21pc2VzID0gdXJscy5tYXAodXJsID0+IHRoaXMuX2hhbENsaWVudC5nZXQodXJsLCBGb3Jtc1Jlc291cmNlLCBQcm9ibGVtRGV0YWlscywgaGVhZGVyKSk7XHJcbiAgICBjb25zdCBmb3Jtc0FuZFByb2JsZW1zID0gYXdhaXQgUHJvbWlzZS5hbGwoZm9ybXNQcm9taXNlcyk7XHJcbiAgICByZXR1cm4gZm9ybXNBbmRQcm9ibGVtcztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBzdWJtaXQodGVtcGxhdGU6IFRlbXBsYXRlLCBmb3JtVmFsdWVzOiB7fSk6IFByb21pc2U8SHR0cFJlc3BvbnNlPEZvcm1zUmVzb3VyY2UgfCBQcm9ibGVtRGV0YWlscz4+IHtcclxuICAgIGNvbnN0IHVyaSA9IHRlbXBsYXRlLnRhcmdldCB8fCAnJztcclxuICAgIGNvbnN0IG1ldGhvZCA9IHRlbXBsYXRlLm1ldGhvZD8udG9Mb3dlckNhc2UoKTtcclxuICAgIGNvbnN0IGhlYWRlciA9IFJFU1R3b3JsZENsaWVudC5jcmVhdGVIZWFkZXJzKCdhcHBsaWNhdGlvbi9wcnMuaGFsLWZvcm1zK2pzb24nLCB0aGlzLl9vcHRpb25zLlZlcnNpb24pO1xyXG5cclxuICAgIGxldCByZXNwb25zZTtcclxuICAgIHN3aXRjaCAobWV0aG9kKSB7XHJcbiAgICAgIGNhc2UgJ3B1dCc6XHJcbiAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmhhbENsaWVudC5wdXQodXJpLCBmb3JtVmFsdWVzLCBGb3Jtc1Jlc291cmNlLCBQcm9ibGVtRGV0YWlscywgaGVhZGVyKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAncG9zdCc6XHJcbiAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmhhbENsaWVudC5wb3N0KHVyaSwgZm9ybVZhbHVlcywgRm9ybXNSZXNvdXJjZSwgUHJvYmxlbURldGFpbHMsIGhlYWRlcik7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmhhbENsaWVudC5nZXQodXJpLCBGb3Jtc1Jlc291cmNlLCBQcm9ibGVtRGV0YWlscywgaGVhZGVyKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmVzcG9uc2U7XHJcblxyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGRlbGV0ZShyZXNvdXJjZTogUmVzb3VyY2UpOiBQcm9taXNlPEh0dHBSZXNwb25zZTx2b2lkIHwgUHJvYmxlbURldGFpbHM+PiB7XHJcbiAgICBjb25zdCBkZWxldGVMaW5rID0gcmVzb3VyY2UuZmluZExpbmsoJ2RlbGV0ZScpO1xyXG4gICAgaWYgKCFkZWxldGVMaW5rKVxyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSByZXNvdXJjZSAke3Jlc291cmNlfSBkb2VzIG5vdCBoYXZlIGEgZGVsZXRlIGxpbmsuYCk7XHJcbiAgICBjb25zdCB1cmkgPSBkZWxldGVMaW5rLmhyZWY7XHJcbiAgICBjb25zdCBoZWFkZXIgPSBSRVNUd29ybGRDbGllbnQuY3JlYXRlSGVhZGVycygnYXBwbGljYXRpb24vaGFsK2pzb24nLCB0aGlzLl9vcHRpb25zLlZlcnNpb24pO1xyXG5cclxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5oYWxDbGllbnQuZGVsZXRlKHVyaSwgUHJvYmxlbURldGFpbHMsIGhlYWRlcik7XHJcblxyXG4gICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldEFsbExpbmtzRnJvbUhvbWUoKTogeyBbcmVsOiBzdHJpbmddOiBMaW5rW10gfCB1bmRlZmluZWQgfSB7XHJcbiAgICBpZiAoIXRoaXMuX2hvbWVSZXNvdXJjZSlcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdIb21lIHJlc291cmNlIGlzIG5vdCBzZXQuIENhbGwgZW5zdXJlSG9tZVJlc291cmNlSXNTZXQoKSBmaXJzdC4nKTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5faG9tZVJlc291cmNlLl9saW5rcztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRMaW5rRnJvbUhvbWUocmVsOiBzdHJpbmcsIG5hbWU/OiBzdHJpbmcsIGN1cmllPzogc3RyaW5nKTogTGluayB7XHJcbiAgICBjb25zdCBsaW5rcyA9IHRoaXMuZ2V0TGlua3NGcm9tSG9tZShyZWwsIGN1cmllKTtcclxuXHJcbiAgICBjb25zdCBsaW5rID0gbmFtZSA/IGxpbmtzLmZpbmQobCA9PiBsLm5hbWUgPT09IG5hbWUpIDogbGlua3NbMF07XHJcblxyXG4gICAgaWYgKCFsaW5rKVxyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBob21lIHJlc291cmNlIGRvZXMgbm90IGhhdmUgYSBsaW5rIHdpdGggdGhlIHJlbCAnJHt0aGlzLmdldEZ1bGxSZWwocmVsLCBjdXJpZSl9JyBhbmQgdGhlIG5hbWUgJyR7bmFtZX0nLmApXHJcblxyXG4gICAgcmV0dXJuIGxpbms7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0TGlua3NGcm9tSG9tZShyZWw6IHN0cmluZywgY3VyaWU/OiBzdHJpbmcpOiBMaW5rW10ge1xyXG4gICAgaWYgKCF0aGlzLl9ob21lUmVzb3VyY2UpXHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignSG9tZSByZXNvdXJjZSBpcyBub3Qgc2V0LiBDYWxsIGVuc3VyZUhvbWVSZXNvdXJjZUlzU2V0KCkgZmlyc3QuJyk7XHJcblxyXG4gICAgY29uc3QgZnVsbFJlbCA9IHRoaXMuZ2V0RnVsbFJlbChyZWwsIGN1cmllKTtcclxuICAgIGNvbnN0IGxpbmtzID0gdGhpcy5faG9tZVJlc291cmNlLl9saW5rc1tmdWxsUmVsXTtcclxuICAgIGlmICghbGlua3MgfHwgbGlua3MubGVuZ3RoID09PSAwKVxyXG4gICAgICB0aHJvdyBFcnJvcihgVGhlIGhvbWUgcmVzb3VyY2UgZG9lcyBub3QgaGF2ZSBhIGxpbmsgd2l0aCB0aGUgcmVsICcke2Z1bGxSZWx9Jy5gKTtcclxuXHJcbiAgICByZXR1cm4gbGlua3M7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEZ1bGxSZWwocmVsOiBzdHJpbmcsIGN1cmllPzogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIC8vIHJlbCBhbHJlYWR5IGluY2x1ZGVzIGEgY3VyaWUgPT4ganVzdCByZXR1cm4gaXRcclxuICAgIGlmIChyZWwuaW5jbHVkZXMoJzonKSlcclxuICAgICAgcmV0dXJuIHJlbDtcclxuXHJcbiAgICAvLyBObyBjdXJpZSBnaXZlbiA9PiB1c2UgZGVmYXVsdCBjdXJpZS5cclxuICAgIGlmICghY3VyaWUpXHJcbiAgICAgIGN1cmllID0gdGhpcy5fZGVmYXVsdEN1cmllO1xyXG5cclxuICAgIC8vIENvbWJpbmUgY3VyaWUgYW5kIHJlbFxyXG4gICAgY29uc3QgZnVsbFJlbCA9IGAke2N1cmllfToke3JlbH1gO1xyXG5cclxuICAgIHJldHVybiBmdWxsUmVsO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgY3JlYXRlSGVhZGVycyhtZWRpYVR5cGU/OiAnYXBwbGljYXRpb24vaGFsK2pzb24nIHwgJ2FwcGxpY2F0aW9uL3Bycy5oYWwtZm9ybXMranNvbicsIHZlcnNpb24/OiBudW1iZXIpOiBIdHRwSGVhZGVycyB7XHJcbiAgICBpZiAodmVyc2lvbilcclxuICAgICAgcmV0dXJuIG5ldyBIdHRwSGVhZGVycyh7ICdBY2NlcHQnOiBgJHttZWRpYVR5cGUgfHwgJ2FwcGxpY2F0aW9uL2hhbCtqc29uJ307IHY9JHt2ZXJzaW9ufWAgfSk7XHJcbiAgICByZXR1cm4gbmV3IEh0dHBIZWFkZXJzKCk7XHJcbiAgfVxyXG59XHJcbiJdfQ==
@@ -0,0 +1,39 @@
1
+ import { HttpClient } from "@angular/common/http";
2
+ import { Injectable } from "@angular/core";
3
+ import { RESTworldOptions } from "../models/restworld-options";
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "@angular/common/http";
6
+ import * as i2 from "./restworld-client-collection";
7
+ export class SettingsService {
8
+ constructor(backend, _clients) {
9
+ this._clients = _clients;
10
+ this._client = new HttpClient(backend);
11
+ }
12
+ get settings() {
13
+ return this._settings;
14
+ }
15
+ async initialize() {
16
+ await this.ensureSettingsAreLoaded();
17
+ await this.populateRESTworldClientCollectionFromSettings();
18
+ }
19
+ async ensureSettingsAreLoaded() {
20
+ this._settings = await this._client
21
+ .get('/settings')
22
+ .toPromise();
23
+ }
24
+ async populateRESTworldClientCollectionFromSettings() {
25
+ if (!this._settings?.apiUrls)
26
+ return;
27
+ await Promise.all(this._settings.apiUrls
28
+ .map(api => this._clients.addOrGetExistingClient(api.name, new RESTworldOptions(api.url, api.version))));
29
+ }
30
+ }
31
+ SettingsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: SettingsService, deps: [{ token: i1.HttpBackend }, { token: i2.RESTworldClientCollection }], target: i0.ɵɵFactoryTarget.Injectable });
32
+ SettingsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: SettingsService, providedIn: 'root' });
33
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: SettingsService, decorators: [{
34
+ type: Injectable,
35
+ args: [{
36
+ providedIn: 'root'
37
+ }]
38
+ }], ctorParameters: function () { return [{ type: i1.HttpBackend }, { type: i2.RESTworldClientCollection }]; } });
39
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dGluZ3Muc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1yZXN0d29ybGQtY2xpZW50L3NyYy9saWIvc2VydmljZXMvc2V0dGluZ3Muc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDL0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQzs7OztBQU0vRCxNQUFNLE9BQU8sZUFBZTtJQVExQixZQUFZLE9BQW9CLEVBQVUsUUFBbUM7UUFBbkMsYUFBUSxHQUFSLFFBQVEsQ0FBMkI7UUFDM0UsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBTkQsSUFBVyxRQUFRO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN4QixDQUFDO0lBTU0sS0FBSyxDQUFDLFVBQVU7UUFDckIsTUFBTSxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztRQUNyQyxNQUFNLElBQUksQ0FBQyw2Q0FBNkMsRUFBRSxDQUFDO0lBQzdELENBQUM7SUFFTyxLQUFLLENBQUMsdUJBQXVCO1FBQ25DLElBQUksQ0FBQyxTQUFTLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTzthQUNoQyxHQUFHLENBQWlCLFdBQVcsQ0FBQzthQUNoQyxTQUFTLEVBQUUsQ0FBQztJQUNqQixDQUFDO0lBRU8sS0FBSyxDQUFDLDZDQUE2QztRQUN6RCxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxPQUFPO1lBQzFCLE9BQU87UUFFVCxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPO2FBQ3JDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsc0JBQXNCLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzlHLENBQUM7OzRHQTdCVSxlQUFlO2dIQUFmLGVBQWUsY0FGZCxNQUFNOzJGQUVQLGVBQWU7a0JBSDNCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cEJhY2tlbmQsIEh0dHBDbGllbnQgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uL2h0dHBcIjtcclxuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IENsaWVudFNldHRpbmdzIH0gZnJvbSBcIi4uL21vZGVscy9jbGllbnQtc2V0dGluZ3NcIjtcclxuaW1wb3J0IHsgUkVTVHdvcmxkT3B0aW9ucyB9IGZyb20gXCIuLi9tb2RlbHMvcmVzdHdvcmxkLW9wdGlvbnNcIjtcclxuaW1wb3J0IHsgUkVTVHdvcmxkQ2xpZW50Q29sbGVjdGlvbiB9IGZyb20gXCIuL3Jlc3R3b3JsZC1jbGllbnQtY29sbGVjdGlvblwiO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgU2V0dGluZ3NTZXJ2aWNlIHtcclxuICBwcml2YXRlIHJlYWRvbmx5IF9jbGllbnQ6IEh0dHBDbGllbnQ7XHJcblxyXG4gIHByaXZhdGUgX3NldHRpbmdzOiBDbGllbnRTZXR0aW5ncyB8IHVuZGVmaW5lZDtcclxuICBwdWJsaWMgZ2V0IHNldHRpbmdzKCk6IENsaWVudFNldHRpbmdzIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0aGlzLl9zZXR0aW5ncztcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKGJhY2tlbmQ6IEh0dHBCYWNrZW5kLCBwcml2YXRlIF9jbGllbnRzOiBSRVNUd29ybGRDbGllbnRDb2xsZWN0aW9uKSB7XHJcbiAgICB0aGlzLl9jbGllbnQgPSBuZXcgSHR0cENsaWVudChiYWNrZW5kKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBpbml0aWFsaXplKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgdGhpcy5lbnN1cmVTZXR0aW5nc0FyZUxvYWRlZCgpO1xyXG4gICAgYXdhaXQgdGhpcy5wb3B1bGF0ZVJFU1R3b3JsZENsaWVudENvbGxlY3Rpb25Gcm9tU2V0dGluZ3MoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlU2V0dGluZ3NBcmVMb2FkZWQoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLl9zZXR0aW5ncyA9IGF3YWl0IHRoaXMuX2NsaWVudFxyXG4gICAgICAuZ2V0PENsaWVudFNldHRpbmdzPignL3NldHRpbmdzJylcclxuICAgICAgLnRvUHJvbWlzZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBwb3B1bGF0ZVJFU1R3b3JsZENsaWVudENvbGxlY3Rpb25Gcm9tU2V0dGluZ3MoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoIXRoaXMuX3NldHRpbmdzPy5hcGlVcmxzKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwodGhpcy5fc2V0dGluZ3MuYXBpVXJsc1xyXG4gICAgICAubWFwKGFwaSA9PiAgdGhpcy5fY2xpZW50cy5hZGRPckdldEV4aXN0aW5nQ2xpZW50KGFwaS5uYW1lLCBuZXcgUkVTVHdvcmxkT3B0aW9ucyhhcGkudXJsLCBhcGkudmVyc2lvbikpKSk7XHJcbiAgfVxyXG5cclxufVxyXG4iXX0=