@rxap/config 13.1.5 → 13.2.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/README.md +4 -4
- package/esm2020/lib/config.service.mjs +64 -60
- package/fesm2015/rxap-config.mjs +68 -64
- package/fesm2015/rxap-config.mjs.map +1 -1
- package/fesm2020/rxap-config.mjs +63 -59
- package/fesm2020/rxap-config.mjs.map +1 -1
- package/lib/config.service.d.ts +7 -3
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -28,11 +28,11 @@ Update the angular application `main.ts` to support @rxap/config.
|
|
|
28
28
|
|
|
29
29
|
```
|
|
30
30
|
|
|
31
|
-
// (optional) Defines a list of configuration urls.
|
|
32
|
-
ConfigService.Urls = ['/config/config.json'];
|
|
33
|
-
|
|
34
31
|
// Ensures that the configuration is loaded before the angular application is started
|
|
35
|
-
Promise.all([ConfigService.Load(
|
|
32
|
+
Promise.all([ConfigService.Load({
|
|
33
|
+
// (optional) Defines a list of configuration urls. Defaults to ['config.json']
|
|
34
|
+
url: ['/config/config.json']
|
|
35
|
+
})]).then(() =>
|
|
36
36
|
platformBrowserDynamic()
|
|
37
37
|
.bootstrapModule(AppModule)
|
|
38
38
|
.catch((err) => console.error(err))
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Injectable, Optional, Inject } from '@angular/core';
|
|
2
|
-
import { deepMerge, SetObjectValue } from '@rxap/utilities';
|
|
2
|
+
import { deepMerge, SetObjectValue, coerceArray } from '@rxap/utilities';
|
|
3
3
|
import { RXAP_CONFIG } from './tokens';
|
|
4
4
|
import * as i0 from "@angular/core";
|
|
5
5
|
export class ConfigService {
|
|
@@ -12,6 +12,65 @@ export class ConfigService {
|
|
|
12
12
|
throw new Error('config not available');
|
|
13
13
|
}
|
|
14
14
|
}
|
|
15
|
+
/**
|
|
16
|
+
* Used to load the app config from a remote resource.
|
|
17
|
+
*
|
|
18
|
+
* Promise.all([ ConfigService.Load() ])
|
|
19
|
+
* .then(() => platformBrowserDynamic().bootstrapModule(AppModule))
|
|
20
|
+
* .catch(err => console.error(err))
|
|
21
|
+
*
|
|
22
|
+
*/
|
|
23
|
+
static async Load(options) {
|
|
24
|
+
let config = this.Defaults;
|
|
25
|
+
const urls = options?.url ? coerceArray(config.url) : ConfigService.Urls;
|
|
26
|
+
for (const url of urls) {
|
|
27
|
+
config = await this.loadConfig(url, true, options?.schema);
|
|
28
|
+
}
|
|
29
|
+
config = deepMerge(config, this.Overwrites);
|
|
30
|
+
if (options?.fromLocalStorage !== false) {
|
|
31
|
+
const localConfig = localStorage.getItem(ConfigService.LocalStorageKey);
|
|
32
|
+
if (localConfig) {
|
|
33
|
+
try {
|
|
34
|
+
config = deepMerge(config, JSON.parse(localConfig));
|
|
35
|
+
}
|
|
36
|
+
catch (e) {
|
|
37
|
+
console.error('local config could not be parsed');
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
if (options?.fromUrlParam) {
|
|
42
|
+
const param = typeof options.fromUrlParam === 'string' ? options.fromUrlParam : 'config';
|
|
43
|
+
config = deepMerge(config, this.LoadConfigDefaultFromUrlParam(param));
|
|
44
|
+
}
|
|
45
|
+
console.debug('app config', config);
|
|
46
|
+
this.Config = config;
|
|
47
|
+
}
|
|
48
|
+
static showError(message) {
|
|
49
|
+
const hasUl = document.getElementById('rxap-config-error') !== null;
|
|
50
|
+
const ul = document.getElementById('rxap-config-error') ?? document.createElement('ul');
|
|
51
|
+
ul.id = 'rxap-config-error';
|
|
52
|
+
ul.style.position = 'fixed';
|
|
53
|
+
ul.style.bottom = '16px';
|
|
54
|
+
ul.style.right = '16px';
|
|
55
|
+
ul.style.backgroundColor = 'white';
|
|
56
|
+
ul.style.padding = '32px';
|
|
57
|
+
ul.style.zIndex = '99999999';
|
|
58
|
+
ul.style.color = 'black';
|
|
59
|
+
const li = document.createElement('li');
|
|
60
|
+
li.innerText = message;
|
|
61
|
+
ul.appendChild(li);
|
|
62
|
+
if (!hasUl) {
|
|
63
|
+
document.body.appendChild(ul);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
static async SideLoad(url, propertyPath, required, schema) {
|
|
67
|
+
if (!this.Config) {
|
|
68
|
+
throw new Error('Config side load is only possible after the initial config load.');
|
|
69
|
+
}
|
|
70
|
+
const config = await this.loadConfig(url, required, schema);
|
|
71
|
+
SetObjectValue(this.Config, propertyPath, config);
|
|
72
|
+
console.debug(`Side loaded config for '${propertyPath}' successful`, this.Config);
|
|
73
|
+
}
|
|
15
74
|
static async loadConfig(url, required, schema) {
|
|
16
75
|
let config;
|
|
17
76
|
let response;
|
|
@@ -61,64 +120,6 @@ export class ConfigService {
|
|
|
61
120
|
}
|
|
62
121
|
return config;
|
|
63
122
|
}
|
|
64
|
-
static showError(message) {
|
|
65
|
-
const hasUl = document.getElementById('rxap-config-error') !== null;
|
|
66
|
-
const ul = document.getElementById('rxap-config-error') ?? document.createElement('ul');
|
|
67
|
-
ul.id = 'rxap-config-error';
|
|
68
|
-
ul.style.position = 'fixed';
|
|
69
|
-
ul.style.bottom = '16px';
|
|
70
|
-
ul.style.right = '16px';
|
|
71
|
-
ul.style.backgroundColor = 'white';
|
|
72
|
-
ul.style.padding = '32px';
|
|
73
|
-
ul.style.zIndex = '99999999';
|
|
74
|
-
ul.style.color = 'black';
|
|
75
|
-
const li = document.createElement('li');
|
|
76
|
-
li.innerText = message;
|
|
77
|
-
ul.appendChild(li);
|
|
78
|
-
if (!hasUl) {
|
|
79
|
-
document.body.appendChild(ul);
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
static async SideLoad(url, propertyPath, required, schema) {
|
|
83
|
-
if (!this.Config) {
|
|
84
|
-
throw new Error('Config side load is only possible after the initial config load.');
|
|
85
|
-
}
|
|
86
|
-
const config = await this.loadConfig(url, required, schema);
|
|
87
|
-
SetObjectValue(this.Config, propertyPath, config);
|
|
88
|
-
console.debug(`Side loaded config for '${propertyPath}' successful`, this.Config);
|
|
89
|
-
}
|
|
90
|
-
/**
|
|
91
|
-
* Used to load the app config from a remote resource.
|
|
92
|
-
*
|
|
93
|
-
* Promise.all([ ConfigService.Load() ])
|
|
94
|
-
* .then(() => platformBrowserDynamic().bootstrapModule(AppModule))
|
|
95
|
-
* .catch(err => console.error(err))
|
|
96
|
-
*
|
|
97
|
-
*/
|
|
98
|
-
static async Load(options) {
|
|
99
|
-
let config = this.Defaults;
|
|
100
|
-
for (const url of ConfigService.Urls) {
|
|
101
|
-
config = await this.loadConfig(url, true, options?.schema);
|
|
102
|
-
}
|
|
103
|
-
config = deepMerge(config, this.Overwrites);
|
|
104
|
-
if (options?.fromLocalStorage !== false) {
|
|
105
|
-
const localConfig = localStorage.getItem(ConfigService.LocalStorageKey);
|
|
106
|
-
if (localConfig) {
|
|
107
|
-
try {
|
|
108
|
-
config = deepMerge(config, JSON.parse(localConfig));
|
|
109
|
-
}
|
|
110
|
-
catch (e) {
|
|
111
|
-
console.error('local config could not be parsed');
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
if (options?.fromUrlParam) {
|
|
116
|
-
const param = typeof options.fromUrlParam === 'string' ? options.fromUrlParam : 'config';
|
|
117
|
-
config = deepMerge(config, this.LoadConfigDefaultFromUrlParam(param));
|
|
118
|
-
}
|
|
119
|
-
console.debug('app config', config);
|
|
120
|
-
this.Config = config;
|
|
121
|
-
}
|
|
122
123
|
static LoadConfigDefaultFromUrlParam(param = 'config') {
|
|
123
124
|
const queryString = window.location.search;
|
|
124
125
|
const urlParams = new URLSearchParams(queryString);
|
|
@@ -190,6 +191,9 @@ ConfigService.Defaults = {};
|
|
|
190
191
|
*/
|
|
191
192
|
ConfigService.Overwrites = {};
|
|
192
193
|
ConfigService.LocalStorageKey = 'rxap/config/local-config';
|
|
194
|
+
/**
|
|
195
|
+
* @deprecated instead use the url property of the ConfigLoadOptions
|
|
196
|
+
*/
|
|
193
197
|
ConfigService.Urls = ['config.json'];
|
|
194
198
|
ConfigService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: ConfigService, deps: [{ token: RXAP_CONFIG, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
195
199
|
ConfigService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: ConfigService, providedIn: 'root' });
|
|
@@ -204,4 +208,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.3", ngImpor
|
|
|
204
208
|
type: Inject,
|
|
205
209
|
args: [RXAP_CONFIG]
|
|
206
210
|
}] }]; } });
|
|
207
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2NvbmZpZy9zcmMvbGliL2NvbmZpZy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxVQUFVLEVBQ1YsUUFBUSxFQUNSLE1BQU0sRUFDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsU0FBUyxFQUNULGNBQWMsRUFDZixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxVQUFVLENBQUM7O0FBYXZDLE1BQU0sT0FBTyxhQUFhO0lBdU14QixZQUE2QyxTQUFxQixJQUFJO1FBQ3BFLElBQUksQ0FBQyxNQUFNLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQztRQUNuQyxJQUFJLE1BQU0sRUFBRTtZQUNWLElBQUksQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1NBQ3BEO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDaEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1NBQ3pDO0lBQ0gsQ0FBQztJQTFMTyxNQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBVSxHQUFXLEVBQUUsUUFBa0IsRUFBRSxNQUFrQjtRQUUxRixJQUFJLE1BQVcsQ0FBQztRQUNoQixJQUFJLFFBQWEsQ0FBQztRQUVsQixJQUFJO1lBQ0YsUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1NBQzVCO1FBQUMsT0FBTyxLQUFVLEVBQUU7WUFDbkIsTUFBTSxPQUFPLEdBQUcsZ0NBQWdDLEdBQUcsTUFBTSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDekUsSUFBSSxRQUFRLEVBQUU7Z0JBQ1osSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMs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VUFBVSxDQUFVLFlBQW9CLEVBQUUsWUFBZ0I7UUFDL0QsTUFBTSxLQUFLLEdBQUcsYUFBYSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsWUFBWSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN6RSxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUU7WUFDdkIsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQ0FBa0MsWUFBWSxHQUFHLENBQUMsQ0FBQztTQUNwRTtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQzs7QUFyT2Esb0JBQU0sR0FBUSxJQUFLLENBQUE7QUFFakM7Ozs7R0FJRztBQUNXLHNCQUFRLEdBQVEsRUFBRyxDQUFBO0FBRWpDOzs7R0FHRztBQUNXLHdCQUFVLEdBQVEsRUFBRyxDQUFBO0FBRXJCLDZCQUFlLEdBQUcsMEJBQTJCLENBQUE7QUFFN0Msa0JBQUksR0FBRyxDQUFFLGFBQWEsQ0FBRyxDQUFBOzBHQW5CNUIsYUFBYSxrQkF1TVEsV0FBVzs4R0F2TWhDLGFBQWEsY0FGWixNQUFNOzJGQUVQLGFBQWE7a0JBSHpCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25COzswQkF3TWMsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgSW5qZWN0YWJsZSxcbiAgT3B0aW9uYWwsXG4gIEluamVjdFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIGRlZXBNZXJnZSxcbiAgU2V0T2JqZWN0VmFsdWVcbn0gZnJvbSAnQHJ4YXAvdXRpbGl0aWVzJztcbmltcG9ydCB7IFJYQVBfQ09ORklHIH0gZnJvbSAnLi90b2tlbnMnO1xuaW1wb3J0IHsgTm9JbmZlclR5cGUgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IEFueVNjaGVtYSB9IGZyb20gJ2pvaSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29uZmlnTG9hZE9wdGlvbnMge1xuICBmcm9tVXJsUGFyYW0/OiBzdHJpbmcgfCBib29sZWFuO1xuICBmcm9tTG9jYWxTdG9yYWdlPzogYm9vbGVhbjtcbiAgc2NoZW1hPzogQW55U2NoZW1hO1xufVxuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBDb25maWdTZXJ2aWNlPENvbmZpZyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG5cbiAgcHVibGljIHN0YXRpYyBDb25maWc6IGFueSA9IG51bGw7XG5cbiAgLyoqXG4gICAqIFN0YXRpYyBkZWZhdWx0IHZhbHVlcyBmb3IgdGhlIGNvbmZpZyBvYmplY3QuXG4gICAqIFdpbGwgYmUgb3ZlcndyaXR0ZW4gYnkgYW4gZHluYW1pYyBjb25maWcgZmlsZSBzcGVjaWZpZWQgaW5cbiAgICogdGhlIFVybHMgYXJyYXkuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIERlZmF1bHRzOiBhbnkgPSB7fTtcblxuICAvKipcbiAgICogQW55IHZhbHVlIGRlZmluaXRpb24gaW4gdGhlIE92ZXJ3cml0ZXMgb2JqZWN0IHdpbGwgb3ZlcndyaXRlIGFueVxuICAgKiB2YWx1ZSBmb3JtIHRoZSBEZWZhdWx0cyB2YWx1ZXMgb3IgZHluYW1pYyBjb25maWcgZmlsZXNcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgT3ZlcndyaXRlczogYW55ID0ge307XG5cbiAgcHVibGljIHN0YXRpYyBMb2NhbFN0b3JhZ2VLZXkgPSAncnhhcC9jb25maWcvbG9jYWwtY29uZmlnJztcblxuICBwdWJsaWMgc3RhdGljIFVybHMgPSBbICdjb25maWcuanNvbicgXTtcblxuICBwcml2YXRlIHN0YXRpYyBhc3luYyBsb2FkQ29uZmlnPFQgPSBhbnk+KHVybDogc3RyaW5nLCByZXF1aXJlZD86IGJvb2xlYW4sIHNjaGVtYT86IEFueVNjaGVtYSk6IFByb21pc2U8VCB8IG51bGw+IHtcblxuICAgIGxldCBjb25maWc6IGFueTtcbiAgICBsZXQgcmVzcG9uc2U6IGFueTtcblxuICAgIHRyeSB7XG4gICAgICByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybClcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gYENvdWxkIG5vdCBmZXRjaCBjb25maWcgZnJvbSAnJHt1cmx9JzogJHtlcnJvci5tZXNzYWdlfWA7XG4gICAgICBpZiAocmVxdWlyZWQpIHtcbiAgICAgICAgdGhpcy5zaG93RXJyb3IobWVzc2FnZSk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybihtZXNzYWdlKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbmZpZyA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKVxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBgQ291bGQgbm90IHBhcnNlIGNvbmZpZyBmcm9tICcke3VybH0nIHRvIGEganNvbiBvYmplY3Q6ICR7ZXJyb3IubWVzc2FnZX1gO1xuICAgICAgaWYgKHJlcXVpcmVkKSB7XG4gICAgICAgIHRoaXMuc2hvd0Vycm9yKG1lc3NhZ2UpO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4obWVzc2FnZSk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzY2hlbWEpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbmZpZyA9IGF3YWl0IHNjaGVtYS52YWxpZGF0ZUFzeW5jKGNvbmZpZyk7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBgQ29uZmlnIGZyb20gJyR7dXJsfScgaXMgbm90IHZhbGlkOiAke2Vycm9yLm1lc3NhZ2V9YDtcbiAgICAgICAgaWYgKHJlcXVpcmVkKSB7XG4gICAgICAgICAgdGhpcy5zaG93RXJyb3IobWVzc2FnZSk7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUud2FybihtZXNzYWdlKTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjb25maWc7XG5cbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHNob3dFcnJvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBjb25zdCBoYXNVbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyeGFwLWNvbmZpZy1lcnJvcicpICE9PSBudWxsO1xuICAgIGNvbnN0IHVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3J4YXAtY29uZmlnLWVycm9yJykgPz8gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndWwnKTtcbiAgICB1bC5pZCA9ICdyeGFwLWNvbmZpZy1lcnJvcic7XG4gICAgdWwuc3R5bGUucG9zaXRpb24gPSAnZml4ZWQnO1xuICAgIHVsLnN0eWxlLmJvdHRvbSA9ICcxNnB4JztcbiAgICB1bC5zdHlsZS5yaWdodCA9ICcxNnB4JztcbiAgICB1bC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAnd2hpdGUnO1xuICAgIHVsLnN0eWxlLnBhZGRpbmcgPSAnMzJweCc7XG4gICAgdWwuc3R5bGUuekluZGV4ID0gJzk5OTk5OTk5JztcbiAgICB1bC5zdHlsZS5jb2xvciA9ICdibGFjayc7XG4gICAgY29uc3QgbGkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaScpO1xuICAgIGxpLmlubmVyVGV4dCA9IG1lc3NhZ2U7XG4gICAgdWwuYXBwZW5kQ2hpbGQobGkpO1xuICAgIGlmICghaGFzVWwpIHtcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodWwpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgYXN5bmMgU2lkZUxvYWQodXJsOiBzdHJpbmcsIHByb3BlcnR5UGF0aDogc3RyaW5nLCByZXF1aXJlZD86IGJvb2xlYW4sIHNjaGVtYT86IEFueVNjaGVtYSk6IFByb21pc2U8dm9pZD4ge1xuXG4gICAgaWYgKCF0aGlzLkNvbmZpZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb25maWcgc2lkZSBsb2FkIGlzIG9ubHkgcG9zc2libGUgYWZ0ZXIgdGhlIGluaXRpYWwgY29uZmlnIGxvYWQuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgY29uZmlnID0gYXdhaXQgdGhpcy5sb2FkQ29uZmlnKHVybCwgcmVxdWlyZWQsIHNjaGVtYSk7XG5cbiAgICBTZXRPYmplY3RWYWx1ZSh0aGlzLkNvbmZpZywgcHJvcGVydHlQYXRoLCBjb25maWcpO1xuXG4gICAgY29uc29sZS5kZWJ1ZyhgU2lkZSBsb2FkZWQgY29uZmlnIGZvciAnJHtwcm9wZXJ0eVBhdGh9JyBzdWNjZXNzZnVsYCwgdGhpcy5Db25maWcpO1xuXG4gIH1cblxuICAvKipcbiAgICogVXNlZCB0byBsb2FkIHRoZSBhcHAgY29uZmlnIGZyb20gYSByZW1vdGUgcmVzb3VyY2UuXG4gICAqXG4gICAqIFByb21pc2UuYWxsKFsgQ29uZmlnU2VydmljZS5Mb2FkKCkgXSlcbiAgICogLnRoZW4oKCkgPT4gcGxhdGZvcm1Ccm93c2VyRHluYW1pYygpLmJvb3RzdHJhcE1vZHVsZShBcHBNb2R1bGUpKVxuICAgKiAuY2F0Y2goZXJyID0+IGNvbnNvbGUuZXJyb3IoZXJyKSlcbiAgICpcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgYXN5bmMgTG9hZChvcHRpb25zPzogQ29uZmlnTG9hZE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgY29uZmlnID0gdGhpcy5EZWZhdWx0cztcbiAgICBmb3IgKGNvbnN0IHVybCBvZiBDb25maWdTZXJ2aWNlLlVybHMpIHtcbiAgICAgIGNvbmZpZyA9IGF3YWl0IHRoaXMubG9hZENvbmZpZyh1cmwsIHRydWUsIG9wdGlvbnM/LnNjaGVtYSk7XG4gICAgfVxuXG4gICAgY29uZmlnID0gZGVlcE1lcmdlKGNvbmZpZywgdGhpcy5PdmVyd3JpdGVzKTtcblxuICAgIGlmIChvcHRpb25zPy5mcm9tTG9jYWxTdG9yYWdlICE9PSBmYWxzZSkge1xuXG4gICAgICBjb25zdCBsb2NhbENvbmZpZyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKENvbmZpZ1NlcnZpY2UuTG9jYWxTdG9yYWdlS2V5KTtcblxuICAgICAgaWYgKGxvY2FsQ29uZmlnKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uZmlnID0gZGVlcE1lcmdlKGNvbmZpZywgSlNPTi5wYXJzZShsb2NhbENvbmZpZykpO1xuICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdsb2NhbCBjb25maWcgY291bGQgbm90IGJlIHBhcnNlZCcpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucz8uZnJvbVVybFBhcmFtKSB7XG4gICAgICBjb25zdCBwYXJhbSA9IHR5cGVvZiBvcHRpb25zLmZyb21VcmxQYXJhbSA9PT0gJ3N0cmluZycgPyBvcHRpb25zLmZyb21VcmxQYXJhbSA6ICdjb25maWcnO1xuICAgICAgY29uZmlnICAgICAgPSBkZWVwTWVyZ2UoY29uZmlnLCB0aGlzLkxvYWRDb25maWdEZWZhdWx0RnJvbVVybFBhcmFtKHBhcmFtKSk7XG4gICAgfVxuXG4gICAgY29uc29sZS5kZWJ1ZygnYXBwIGNvbmZpZycsIGNvbmZpZyk7XG5cbiAgICB0aGlzLkNvbmZpZyA9IGNvbmZpZztcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIExvYWRDb25maWdEZWZhdWx0RnJvbVVybFBhcmFtKHBhcmFtOiBzdHJpbmcgPSAnY29uZmlnJykge1xuXG4gICAgY29uc3QgcXVlcnlTdHJpbmcgPSB3aW5kb3cubG9jYXRpb24uc2VhcmNoO1xuICAgIGNvbnN0IHVybFBhcmFtcyAgID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhxdWVyeVN0cmluZyk7XG5cbiAgICBjb25zdCBjb25maWdGcm9tUGFyYW1zID0ge307XG5cbiAgICBmb3IgKGNvbnN0IGNvbmZpZ1BhcmFtIG9mIHVybFBhcmFtcy5nZXRBbGwoJ2NvbmZpZycpKSB7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHNwbGl0ID0gY29uZmlnUGFyYW0uc3BsaXQoJzsnKTtcbiAgICAgICAgaWYgKHNwbGl0Lmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgIGNvbnN0IGtleVBhdGggPSBzcGxpdFsgMCBdO1xuICAgICAgICAgIGNvbnN0IHZhbHVlICAgPSBzcGxpdFsgMSBdO1xuICAgICAgICAgIFNldE9iamVjdFZhbHVlKGNvbmZpZ0Zyb21QYXJhbXMsIGtleVBhdGgsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgUGFyc2luZyBvZiB1cmwgY29uZmlnIHBhcmFtIGZhaWxlZCBmb3IgJyR7Y29uZmlnUGFyYW19JzogJHtlLm1lc3NhZ2V9YCk7XG4gICAgICB9XG5cbiAgICB9XG5cbiAgICByZXR1cm4gY29uZmlnRnJvbVBhcmFtcztcblxuICB9XG5cbiAgcHVibGljIHN0YXRpYyBHZXQ8VCA9IGFueSwgSyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBSZWNvcmQ8c3RyaW5nLCBhbnk+PihwYXRoOiBzdHJpbmcsIGRlZmF1bHRWYWx1ZTogVCB8IHVuZGVmaW5lZCwgY29uZmlnOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogVFxuICBwdWJsaWMgc3RhdGljIEdldDxUID0gYW55LCBLIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IFJlY29yZDxzdHJpbmcsIGFueT4+KFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBkZWZhdWx0VmFsdWU6IE5vSW5mZXJUeXBlPFQ+LFxuICAgIGNvbmZpZzogUmVjb3JkPHN0cmluZywgYW55PiA9IHRoaXMuQ29uZmlnXG4gICk6IFQge1xuICAgIGlmICghY29uZmlnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvbmZpZyBub3QgbG9hZGVkJyk7XG4gICAgfVxuICAgIGxldCBjb25maWdWYWx1ZTogYW55ID0gY29uZmlnO1xuICAgIGlmICh0eXBlb2YgcGF0aCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIGNvbmZpZyBwcm9wZXJ0eSBwYXRoIGlzIG5vdCBhIHN0cmluZycpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGZyYWdtZW50IG9mIChwYXRoIGFzIGFueSkuc3BsaXQoJy4nKSkge1xuICAgICAgaWYgKGNvbmZpZ1ZhbHVlLmhhc093blByb3BlcnR5KGZyYWdtZW50KSkge1xuICAgICAgICBjb25maWdWYWx1ZSA9IGNvbmZpZ1ZhbHVlWyBmcmFnbWVudCBdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLndhcm4oYENvbmZpZyB3aXRoIHBhdGggJyR7cGF0aH0nIG5vdCBmb3VuZGApO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkIGFzIGFueTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNvbmZpZ1ZhbHVlO1xuICB9XG5cbiAgcHVibGljIHJlYWRvbmx5IGNvbmZpZyE6IENvbmZpZztcblxuICBjb25zdHJ1Y3RvcihAT3B0aW9uYWwoKSBASW5qZWN0KFJYQVBfQ09ORklHKSBjb25maWc6IGFueSB8IG51bGwgPSBudWxsKSB7XG4gICAgdGhpcy5jb25maWcgPSBDb25maWdTZXJ2aWNlLkNvbmZpZztcbiAgICBpZiAoY29uZmlnKSB7XG4gICAgICB0aGlzLmNvbmZpZyA9IGRlZXBNZXJnZSh0aGlzLmNvbmZpZyA/PyB7fSwgY29uZmlnKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmNvbmZpZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb25maWcgbm90IGF2YWlsYWJsZScpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZXRMb2NhbENvbmZpZyhjb25maWc6IENvbmZpZyk6IHZvaWQge1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKENvbmZpZ1NlcnZpY2UuTG9jYWxTdG9yYWdlS2V5LCBKU09OLnN0cmluZ2lmeShjb25maWcpKTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhckxvY2FsQ29uZmlnKCk6IHZvaWQge1xuICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKENvbmZpZ1NlcnZpY2UuTG9jYWxTdG9yYWdlS2V5KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQ8VCA9IGFueT4ocHJvcGVydHlQYXRoOiBzdHJpbmcpOiBUIHwgdW5kZWZpbmVkO1xuICBwdWJsaWMgZ2V0PFQgPSBhbnk+KHByb3BlcnR5UGF0aDogc3RyaW5nLCBkZWZhdWx0VmFsdWU6IE5vSW5mZXJUeXBlPFQ+KTogVDtcbiAgcHVibGljIGdldDxUID0gYW55Pihwcm9wZXJ0eVBhdGg6IHN0cmluZywgZGVmYXVsdFZhbHVlPzogVCk6IFQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBDb25maWdTZXJ2aWNlLkdldChwcm9wZXJ0eVBhdGgsIGRlZmF1bHRWYWx1ZSwgdGhpcy5jb25maWcpO1xuICB9XG5cbiAgcHVibGljIGdldE9yVGhyb3c8VCA9IGFueT4ocHJvcGVydHlQYXRoOiBzdHJpbmcpOiBUO1xuICBwdWJsaWMgZ2V0T3JUaHJvdzxUID0gYW55Pihwcm9wZXJ0eVBhdGg6IHN0cmluZywgZGVmYXVsdFZhbHVlOiBOb0luZmVyVHlwZTxUPik6IFQ7XG4gIHB1YmxpYyBnZXRPclRocm93PFQgPSBhbnk+KHByb3BlcnR5UGF0aDogc3RyaW5nLCBkZWZhdWx0VmFsdWU/OiBUKTogVCB7XG4gICAgY29uc3QgdmFsdWUgPSBDb25maWdTZXJ2aWNlLkdldChwcm9wZXJ0eVBhdGgsIGRlZmF1bHRWYWx1ZSwgdGhpcy5jb25maWcpO1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kIGNvbmZpZyBpbiBwYXRoICcke3Byb3BlcnR5UGF0aH0nYCk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG59XG4iXX0=
|
|
211
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2NvbmZpZy9zcmMvbGliL2NvbmZpZy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxVQUFVLEVBQ1YsUUFBUSxFQUNSLE1BQU0sRUFDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsU0FBUyxFQUNULGNBQWMsRUFDZCxXQUFXLEVBQ1osTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sVUFBVSxDQUFDOztBQWN2QyxNQUFNLE9BQU8sYUFBYTtJQTJNeEIsWUFBNkMsU0FBcUIsSUFBSTtRQUNwRSxJQUFJLENBQUMsTUFBTSxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUM7UUFDbkMsSUFBSSxNQUFNLEVBQUU7WUFDVixJQUFJLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztTQUNwRDtRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ2hCLE1BQU0sSUFBSSxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQztTQUN6QztJQUNILENBQUM7SUEzTEQ7Ozs7Ozs7T0FPRztJQUNJLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQTJCO1FBQ2xELElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDM0IsTUFBTSxJQUFJLEdBQUcsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQztRQUN6RSxLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksRUFBRTtZQUN0QixNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcs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RyxDQUFVLFlBQW9CLEVBQUUsWUFBZ0I7UUFDeEQsT0FBTyxhQUFhLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFJTSxVQUFVLENBQVUsWUFBb0IsRUFBRSxZQUFnQjtRQUMvRCxNQUFNLEtBQUssR0FBRyxhQUFhLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3pFLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRTtZQUN2QixNQUFNLElBQUksS0FBSyxDQUFDLGtDQUFrQyxZQUFZLEdBQUcsQ0FBQyxDQUFDO1NBQ3BFO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDOztBQXpPYSxvQkFBTSxHQUFRLElBQUssQ0FBQTtBQUVqQzs7OztHQUlHO0FBQ1csc0JBQVEsR0FBUSxFQUFHLENBQUE7QUFFakM7OztHQUdHO0FBQ1csd0JBQVUsR0FBUSxFQUFHLENBQUE7QUFFckIsNkJBQWUsR0FBRywwQkFBMkIsQ0FBQTtBQUUzRDs7R0FFRztBQUNXLGtCQUFJLEdBQUcsQ0FBRSxhQUFhLENBQUcsQ0FBQTswR0F0QjVCLGFBQWEsa0JBMk1RLFdBQVc7OEdBM01oQyxhQUFhLGNBRlosTUFBTTsyRkFFUCxhQUFhO2tCQUh6QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjs7MEJBNE1jLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsV0FBVyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEluamVjdGFibGUsXG4gIE9wdGlvbmFsLFxuICBJbmplY3Rcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBkZWVwTWVyZ2UsXG4gIFNldE9iamVjdFZhbHVlLFxuICBjb2VyY2VBcnJheVxufSBmcm9tICdAcnhhcC91dGlsaXRpZXMnO1xuaW1wb3J0IHsgUlhBUF9DT05GSUcgfSBmcm9tICcuL3Rva2Vucyc7XG5pbXBvcnQgeyBOb0luZmVyVHlwZSB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgQW55U2NoZW1hIH0gZnJvbSAnam9pJztcblxuZXhwb3J0IGludGVyZmFjZSBDb25maWdMb2FkT3B0aW9ucyB7XG4gIGZyb21VcmxQYXJhbT86IHN0cmluZyB8IGJvb2xlYW47XG4gIGZyb21Mb2NhbFN0b3JhZ2U/OiBib29sZWFuO1xuICBzY2hlbWE/OiBBbnlTY2hlbWE7XG4gIHVybD86IHN0cmluZyB8IHN0cmluZ1tdO1xufVxuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBDb25maWdTZXJ2aWNlPENvbmZpZyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG5cbiAgcHVibGljIHN0YXRpYyBDb25maWc6IGFueSA9IG51bGw7XG5cbiAgLyoqXG4gICAqIFN0YXRpYyBkZWZhdWx0IHZhbHVlcyBmb3IgdGhlIGNvbmZpZyBvYmplY3QuXG4gICAqIFdpbGwgYmUgb3ZlcndyaXR0ZW4gYnkgYW4gZHluYW1pYyBjb25maWcgZmlsZSBzcGVjaWZpZWQgaW5cbiAgICogdGhlIFVybHMgYXJyYXkuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIERlZmF1bHRzOiBhbnkgPSB7fTtcblxuICAvKipcbiAgICogQW55IHZhbHVlIGRlZmluaXRpb24gaW4gdGhlIE92ZXJ3cml0ZXMgb2JqZWN0IHdpbGwgb3ZlcndyaXRlIGFueVxuICAgKiB2YWx1ZSBmb3JtIHRoZSBEZWZhdWx0cyB2YWx1ZXMgb3IgZHluYW1pYyBjb25maWcgZmlsZXNcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgT3ZlcndyaXRlczogYW55ID0ge307XG5cbiAgcHVibGljIHN0YXRpYyBMb2NhbFN0b3JhZ2VLZXkgPSAncnhhcC9jb25maWcvbG9jYWwtY29uZmlnJztcblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgaW5zdGVhZCB1c2UgdGhlIHVybCBwcm9wZXJ0eSBvZiB0aGUgQ29uZmlnTG9hZE9wdGlvbnNcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgVXJscyA9IFsgJ2NvbmZpZy5qc29uJyBdO1xuXG4gIC8qKlxuICAgKiBVc2VkIHRvIGxvYWQgdGhlIGFwcCBjb25maWcgZnJvbSBhIHJlbW90ZSByZXNvdXJjZS5cbiAgICpcbiAgICogUHJvbWlzZS5hbGwoWyBDb25maWdTZXJ2aWNlLkxvYWQoKSBdKVxuICAgKiAudGhlbigoKSA9PiBwbGF0Zm9ybUJyb3dzZXJEeW5hbWljKCkuYm9vdHN0cmFwTW9kdWxlKEFwcE1vZHVsZSkpXG4gICAqIC5jYXRjaChlcnIgPT4gY29uc29sZS5lcnJvcihlcnIpKVxuICAgKlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBhc3luYyBMb2FkKG9wdGlvbnM/OiBDb25maWdMb2FkT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBjb25maWcgPSB0aGlzLkRlZmF1bHRzO1xuICAgIGNvbnN0IHVybHMgPSBvcHRpb25zPy51cmwgPyBjb2VyY2VBcnJheShjb25maWcudXJsKSA6IENvbmZpZ1NlcnZpY2UuVXJscztcbiAgICBmb3IgKGNvbnN0IHVybCBvZiB1cmxzKSB7XG4gICAgICBjb25maWcgPSBhd2FpdCB0aGlzLmxvYWRDb25maWcodXJsLCB0cnVlLCBvcHRpb25zPy5zY2hlbWEpO1xuICAgIH1cblxuICAgIGNvbmZpZyA9IGRlZXBNZXJnZShjb25maWcsIHRoaXMuT3ZlcndyaXRlcyk7XG5cbiAgICBpZiAob3B0aW9ucz8uZnJvbUxvY2FsU3RvcmFnZSAhPT0gZmFsc2UpIHtcblxuICAgICAgY29uc3QgbG9jYWxDb25maWcgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShDb25maWdTZXJ2aWNlLkxvY2FsU3RvcmFnZUtleSk7XG5cbiAgICAgIGlmIChsb2NhbENvbmZpZykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbmZpZyA9IGRlZXBNZXJnZShjb25maWcsIEpTT04ucGFyc2UobG9jYWxDb25maWcpKTtcbiAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignbG9jYWwgY29uZmlnIGNvdWxkIG5vdCBiZSBwYXJzZWQnKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnM/LmZyb21VcmxQYXJhbSkge1xuICAgICAgY29uc3QgcGFyYW0gPSB0eXBlb2Ygb3B0aW9ucy5mcm9tVXJsUGFyYW0gPT09ICdzdHJpbmcnID8gb3B0aW9ucy5mcm9tVXJsUGFyYW0gOiAnY29uZmlnJztcbiAgICAgIGNvbmZpZyAgICAgID0gZGVlcE1lcmdlKGNvbmZpZywgdGhpcy5Mb2FkQ29uZmlnRGVmYXVsdEZyb21VcmxQYXJhbShwYXJhbSkpO1xuICAgIH1cblxuICAgIGNvbnNvbGUuZGVidWcoJ2FwcCBjb25maWcnLCBjb25maWcpO1xuXG4gICAgdGhpcy5Db25maWcgPSBjb25maWc7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBzaG93RXJyb3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgY29uc3QgaGFzVWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncnhhcC1jb25maWctZXJyb3InKSAhPT0gbnVsbDtcbiAgICBjb25zdCB1bCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyeGFwLWNvbmZpZy1lcnJvcicpID8/IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3VsJyk7XG4gICAgdWwuaWQgPSAncnhhcC1jb25maWctZXJyb3InO1xuICAgIHVsLnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJztcbiAgICB1bC5zdHlsZS5ib3R0b20gPSAnMTZweCc7XG4gICAgdWwuc3R5bGUucmlnaHQgPSAnMTZweCc7XG4gICAgdWwuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gJ3doaXRlJztcbiAgICB1bC5zdHlsZS5wYWRkaW5nID0gJzMycHgnO1xuICAgIHVsLnN0eWxlLnpJbmRleCA9ICc5OTk5OTk5OSc7XG4gICAgdWwuc3R5bGUuY29sb3IgPSAnYmxhY2snO1xuICAgIGNvbnN0IGxpID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGknKTtcbiAgICBsaS5pbm5lclRleHQgPSBtZXNzYWdlO1xuICAgIHVsLmFwcGVuZENoaWxkKGxpKTtcbiAgICBpZiAoIWhhc1VsKSB7XG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHVsKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGFzeW5jIFNpZGVMb2FkKHVybDogc3RyaW5nLCBwcm9wZXJ0eVBhdGg6IHN0cmluZywgcmVxdWlyZWQ/OiBib29sZWFuLCBzY2hlbWE/OiBBbnlTY2hlbWEpOiBQcm9taXNlPHZvaWQ+IHtcblxuICAgIGlmICghdGhpcy5Db25maWcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ29uZmlnIHNpZGUgbG9hZCBpcyBvbmx5IHBvc3NpYmxlIGFmdGVyIHRoZSBpbml0aWFsIGNvbmZpZyBsb2FkLicpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbmZpZyA9IGF3YWl0IHRoaXMubG9hZENvbmZpZyh1cmwsIHJlcXVpcmVkLCBzY2hlbWEpO1xuXG4gICAgU2V0T2JqZWN0VmFsdWUodGhpcy5Db25maWcsIHByb3BlcnR5UGF0aCwgY29uZmlnKTtcblxuICAgIGNvbnNvbGUuZGVidWcoYFNpZGUgbG9hZGVkIGNvbmZpZyBmb3IgJyR7cHJvcGVydHlQYXRofScgc3VjY2Vzc2Z1bGAsIHRoaXMuQ29uZmlnKTtcblxuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgbG9hZENvbmZpZzxUID0gYW55Pih1cmw6IHN0cmluZywgcmVxdWlyZWQ/OiBib29sZWFuLCBzY2hlbWE/OiBBbnlTY2hlbWEpOiBQcm9taXNlPFQgfCBudWxsPiB7XG5cbiAgICBsZXQgY29uZmlnOiBhbnk7XG4gICAgbGV0IHJlc3BvbnNlOiBhbnk7XG5cbiAgICB0cnkge1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwpO1xuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBgQ291bGQgbm90IGZldGNoIGNvbmZpZyBmcm9tICcke3VybH0nOiAke2Vycm9yLm1lc3NhZ2V9YDtcbiAgICAgIGlmIChyZXF1aXJlZCkge1xuICAgICAgICB0aGlzLnNob3dFcnJvcihtZXNzYWdlKTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKG1lc3NhZ2UpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uZmlnID0gYXdhaXQgcmVzcG9uc2UuanNvbigpXG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGBDb3VsZCBub3QgcGFyc2UgY29uZmlnIGZyb20gJyR7dXJsfScgdG8gYSBqc29uIG9iamVjdDogJHtlcnJvci5tZXNzYWdlfWA7XG4gICAgICBpZiAocmVxdWlyZWQpIHtcbiAgICAgICAgdGhpcy5zaG93RXJyb3IobWVzc2FnZSk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybihtZXNzYWdlKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNjaGVtYSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uZmlnID0gYXdhaXQgc2NoZW1hLnZhbGlkYXRlQXN5bmMoY29uZmlnKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGBDb25maWcgZnJvbSAnJHt1cmx9JyBpcyBub3QgdmFsaWQ6ICR7ZXJyb3IubWVzc2FnZX1gO1xuICAgICAgICBpZiAocmVxdWlyZWQpIHtcbiAgICAgICAgICB0aGlzLnNob3dFcnJvcihtZXNzYWdlKTtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKG1lc3NhZ2UpO1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbmZpZztcblxuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgTG9hZENvbmZpZ0RlZmF1bHRGcm9tVXJsUGFyYW0ocGFyYW06IHN0cmluZyA9ICdjb25maWcnKSB7XG5cbiAgICBjb25zdCBxdWVyeVN0cmluZyA9IHdpbmRvdy5sb2NhdGlvbi5zZWFyY2g7XG4gICAgY29uc3QgdXJsUGFyYW1zICAgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHF1ZXJ5U3RyaW5nKTtcblxuICAgIGNvbnN0IGNvbmZpZ0Zyb21QYXJhbXMgPSB7fTtcblxuICAgIGZvciAoY29uc3QgY29uZmlnUGFyYW0gb2YgdXJsUGFyYW1zLmdldEFsbCgnY29uZmlnJykpIHtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc3BsaXQgPSBjb25maWdQYXJhbS5zcGxpdCgnOycpO1xuICAgICAgICBpZiAoc3BsaXQubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgY29uc3Qga2V5UGF0aCA9IHNwbGl0WyAwIF07XG4gICAgICAgICAgY29uc3QgdmFsdWUgICA9IHNwbGl0WyAxIF07XG4gICAgICAgICAgU2V0T2JqZWN0VmFsdWUoY29uZmlnRnJvbVBhcmFtcywga2V5UGF0aCwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBQYXJzaW5nIG9mIHVybCBjb25maWcgcGFyYW0gZmFpbGVkIGZvciAnJHtjb25maWdQYXJhbX0nOiAke2UubWVzc2FnZX1gKTtcbiAgICAgIH1cblxuICAgIH1cblxuICAgIHJldHVybiBjb25maWdGcm9tUGFyYW1zO1xuXG4gIH1cblxuICBwdWJsaWMgc3RhdGljIEdldDxUID0gYW55LCBLIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IFJlY29yZDxzdHJpbmcsIGFueT4+KHBhdGg6IHN0cmluZywgZGVmYXVsdFZhbHVlOiBUIHwgdW5kZWZpbmVkLCBjb25maWc6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBUXG4gIHB1YmxpYyBzdGF0aWMgR2V0PFQgPSBhbnksIEsgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gUmVjb3JkPHN0cmluZywgYW55Pj4oXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIGRlZmF1bHRWYWx1ZTogTm9JbmZlclR5cGU8VD4sXG4gICAgY29uZmlnOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gdGhpcy5Db25maWdcbiAgKTogVCB7XG4gICAgaWYgKCFjb25maWcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY29uZmlnIG5vdCBsb2FkZWQnKTtcbiAgICB9XG4gICAgbGV0IGNvbmZpZ1ZhbHVlOiBhbnkgPSBjb25maWc7XG4gICAgaWYgKHR5cGVvZiBwYXRoICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgY29uZmlnIHByb3BlcnR5IHBhdGggaXMgbm90IGEgc3RyaW5nJyk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgZnJhZ21lbnQgb2YgKHBhdGggYXMgYW55KS5zcGxpdCgnLicpKSB7XG4gICAgICBpZiAoY29uZmlnVmFsdWUuaGFzT3duUHJvcGVydHkoZnJhZ21lbnQpKSB7XG4gICAgICAgIGNvbmZpZ1ZhbHVlID0gY29uZmlnVmFsdWVbIGZyYWdtZW50IF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUud2FybihgQ29uZmlnIHdpdGggcGF0aCAnJHtwYXRofScgbm90IGZvdW5kYCk7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQgYXMgYW55O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY29uZmlnVmFsdWU7XG4gIH1cblxuICBwdWJsaWMgcmVhZG9ubHkgY29uZmlnITogQ29uZmlnO1xuXG4gIGNvbnN0cnVjdG9yKEBPcHRpb25hbCgpIEBJbmplY3QoUlhBUF9DT05GSUcpIGNvbmZpZzogYW55IHwgbnVsbCA9IG51bGwpIHtcbiAgICB0aGlzLmNvbmZpZyA9IENvbmZpZ1NlcnZpY2UuQ29uZmlnO1xuICAgIGlmIChjb25maWcpIHtcbiAgICAgIHRoaXMuY29uZmlnID0gZGVlcE1lcmdlKHRoaXMuY29uZmlnID8/IHt9LCBjb25maWcpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuY29uZmlnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvbmZpZyBub3QgYXZhaWxhYmxlJyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNldExvY2FsQ29uZmlnKGNvbmZpZzogQ29uZmlnKTogdm9pZCB7XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oQ29uZmlnU2VydmljZS5Mb2NhbFN0b3JhZ2VLZXksIEpTT04uc3RyaW5naWZ5KGNvbmZpZykpO1xuICB9XG5cbiAgcHVibGljIGNsZWFyTG9jYWxDb25maWcoKTogdm9pZCB7XG4gICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oQ29uZmlnU2VydmljZS5Mb2NhbFN0b3JhZ2VLZXkpO1xuICB9XG5cbiAgcHVibGljIGdldDxUID0gYW55Pihwcm9wZXJ0eVBhdGg6IHN0cmluZyk6IFQgfCB1bmRlZmluZWQ7XG4gIHB1YmxpYyBnZXQ8VCA9IGFueT4ocHJvcGVydHlQYXRoOiBzdHJpbmcsIGRlZmF1bHRWYWx1ZTogTm9JbmZlclR5cGU8VD4pOiBUO1xuICBwdWJsaWMgZ2V0PFQgPSBhbnk+KHByb3BlcnR5UGF0aDogc3RyaW5nLCBkZWZhdWx0VmFsdWU/OiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIENvbmZpZ1NlcnZpY2UuR2V0KHByb3BlcnR5UGF0aCwgZGVmYXVsdFZhbHVlLCB0aGlzLmNvbmZpZyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0T3JUaHJvdzxUID0gYW55Pihwcm9wZXJ0eVBhdGg6IHN0cmluZyk6IFQ7XG4gIHB1YmxpYyBnZXRPclRocm93PFQgPSBhbnk+KHByb3BlcnR5UGF0aDogc3RyaW5nLCBkZWZhdWx0VmFsdWU6IE5vSW5mZXJUeXBlPFQ+KTogVDtcbiAgcHVibGljIGdldE9yVGhyb3c8VCA9IGFueT4ocHJvcGVydHlQYXRoOiBzdHJpbmcsIGRlZmF1bHRWYWx1ZT86IFQpOiBUIHtcbiAgICBjb25zdCB2YWx1ZSA9IENvbmZpZ1NlcnZpY2UuR2V0KHByb3BlcnR5UGF0aCwgZGVmYXVsdFZhbHVlLCB0aGlzLmNvbmZpZyk7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZpbmQgY29uZmlnIGluIHBhdGggJyR7cHJvcGVydHlQYXRofSdgKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbn1cbiJdfQ==
|
package/fesm2015/rxap-config.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { __awaiter } from 'tslib';
|
|
2
2
|
import * as i0 from '@angular/core';
|
|
3
3
|
import { InjectionToken, Injectable, Optional, Inject } from '@angular/core';
|
|
4
|
-
import { deepMerge, SetObjectValue } from '@rxap/utilities';
|
|
4
|
+
import { deepMerge, coerceArray, SetObjectValue } from '@rxap/utilities';
|
|
5
5
|
import * as i1 from '@angular/common/http';
|
|
6
6
|
import { HttpClient } from '@angular/common/http';
|
|
7
7
|
import { finalize, share } from 'rxjs/operators';
|
|
@@ -19,6 +19,70 @@ class ConfigService {
|
|
|
19
19
|
throw new Error('config not available');
|
|
20
20
|
}
|
|
21
21
|
}
|
|
22
|
+
/**
|
|
23
|
+
* Used to load the app config from a remote resource.
|
|
24
|
+
*
|
|
25
|
+
* Promise.all([ ConfigService.Load() ])
|
|
26
|
+
* .then(() => platformBrowserDynamic().bootstrapModule(AppModule))
|
|
27
|
+
* .catch(err => console.error(err))
|
|
28
|
+
*
|
|
29
|
+
*/
|
|
30
|
+
static Load(options) {
|
|
31
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
32
|
+
let config = this.Defaults;
|
|
33
|
+
const urls = (options === null || options === void 0 ? void 0 : options.url) ? coerceArray(config.url) : ConfigService.Urls;
|
|
34
|
+
for (const url of urls) {
|
|
35
|
+
config = yield this.loadConfig(url, true, options === null || options === void 0 ? void 0 : options.schema);
|
|
36
|
+
}
|
|
37
|
+
config = deepMerge(config, this.Overwrites);
|
|
38
|
+
if ((options === null || options === void 0 ? void 0 : options.fromLocalStorage) !== false) {
|
|
39
|
+
const localConfig = localStorage.getItem(ConfigService.LocalStorageKey);
|
|
40
|
+
if (localConfig) {
|
|
41
|
+
try {
|
|
42
|
+
config = deepMerge(config, JSON.parse(localConfig));
|
|
43
|
+
}
|
|
44
|
+
catch (e) {
|
|
45
|
+
console.error('local config could not be parsed');
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
if (options === null || options === void 0 ? void 0 : options.fromUrlParam) {
|
|
50
|
+
const param = typeof options.fromUrlParam === 'string' ? options.fromUrlParam : 'config';
|
|
51
|
+
config = deepMerge(config, this.LoadConfigDefaultFromUrlParam(param));
|
|
52
|
+
}
|
|
53
|
+
console.debug('app config', config);
|
|
54
|
+
this.Config = config;
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
static showError(message) {
|
|
58
|
+
var _a;
|
|
59
|
+
const hasUl = document.getElementById('rxap-config-error') !== null;
|
|
60
|
+
const ul = (_a = document.getElementById('rxap-config-error')) !== null && _a !== void 0 ? _a : document.createElement('ul');
|
|
61
|
+
ul.id = 'rxap-config-error';
|
|
62
|
+
ul.style.position = 'fixed';
|
|
63
|
+
ul.style.bottom = '16px';
|
|
64
|
+
ul.style.right = '16px';
|
|
65
|
+
ul.style.backgroundColor = 'white';
|
|
66
|
+
ul.style.padding = '32px';
|
|
67
|
+
ul.style.zIndex = '99999999';
|
|
68
|
+
ul.style.color = 'black';
|
|
69
|
+
const li = document.createElement('li');
|
|
70
|
+
li.innerText = message;
|
|
71
|
+
ul.appendChild(li);
|
|
72
|
+
if (!hasUl) {
|
|
73
|
+
document.body.appendChild(ul);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
static SideLoad(url, propertyPath, required, schema) {
|
|
77
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
78
|
+
if (!this.Config) {
|
|
79
|
+
throw new Error('Config side load is only possible after the initial config load.');
|
|
80
|
+
}
|
|
81
|
+
const config = yield this.loadConfig(url, required, schema);
|
|
82
|
+
SetObjectValue(this.Config, propertyPath, config);
|
|
83
|
+
console.debug(`Side loaded config for '${propertyPath}' successful`, this.Config);
|
|
84
|
+
});
|
|
85
|
+
}
|
|
22
86
|
static loadConfig(url, required, schema) {
|
|
23
87
|
return __awaiter(this, void 0, void 0, function* () {
|
|
24
88
|
let config;
|
|
@@ -70,69 +134,6 @@ class ConfigService {
|
|
|
70
134
|
return config;
|
|
71
135
|
});
|
|
72
136
|
}
|
|
73
|
-
static showError(message) {
|
|
74
|
-
var _a;
|
|
75
|
-
const hasUl = document.getElementById('rxap-config-error') !== null;
|
|
76
|
-
const ul = (_a = document.getElementById('rxap-config-error')) !== null && _a !== void 0 ? _a : document.createElement('ul');
|
|
77
|
-
ul.id = 'rxap-config-error';
|
|
78
|
-
ul.style.position = 'fixed';
|
|
79
|
-
ul.style.bottom = '16px';
|
|
80
|
-
ul.style.right = '16px';
|
|
81
|
-
ul.style.backgroundColor = 'white';
|
|
82
|
-
ul.style.padding = '32px';
|
|
83
|
-
ul.style.zIndex = '99999999';
|
|
84
|
-
ul.style.color = 'black';
|
|
85
|
-
const li = document.createElement('li');
|
|
86
|
-
li.innerText = message;
|
|
87
|
-
ul.appendChild(li);
|
|
88
|
-
if (!hasUl) {
|
|
89
|
-
document.body.appendChild(ul);
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
static SideLoad(url, propertyPath, required, schema) {
|
|
93
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
94
|
-
if (!this.Config) {
|
|
95
|
-
throw new Error('Config side load is only possible after the initial config load.');
|
|
96
|
-
}
|
|
97
|
-
const config = yield this.loadConfig(url, required, schema);
|
|
98
|
-
SetObjectValue(this.Config, propertyPath, config);
|
|
99
|
-
console.debug(`Side loaded config for '${propertyPath}' successful`, this.Config);
|
|
100
|
-
});
|
|
101
|
-
}
|
|
102
|
-
/**
|
|
103
|
-
* Used to load the app config from a remote resource.
|
|
104
|
-
*
|
|
105
|
-
* Promise.all([ ConfigService.Load() ])
|
|
106
|
-
* .then(() => platformBrowserDynamic().bootstrapModule(AppModule))
|
|
107
|
-
* .catch(err => console.error(err))
|
|
108
|
-
*
|
|
109
|
-
*/
|
|
110
|
-
static Load(options) {
|
|
111
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
112
|
-
let config = this.Defaults;
|
|
113
|
-
for (const url of ConfigService.Urls) {
|
|
114
|
-
config = yield this.loadConfig(url, true, options === null || options === void 0 ? void 0 : options.schema);
|
|
115
|
-
}
|
|
116
|
-
config = deepMerge(config, this.Overwrites);
|
|
117
|
-
if ((options === null || options === void 0 ? void 0 : options.fromLocalStorage) !== false) {
|
|
118
|
-
const localConfig = localStorage.getItem(ConfigService.LocalStorageKey);
|
|
119
|
-
if (localConfig) {
|
|
120
|
-
try {
|
|
121
|
-
config = deepMerge(config, JSON.parse(localConfig));
|
|
122
|
-
}
|
|
123
|
-
catch (e) {
|
|
124
|
-
console.error('local config could not be parsed');
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
if (options === null || options === void 0 ? void 0 : options.fromUrlParam) {
|
|
129
|
-
const param = typeof options.fromUrlParam === 'string' ? options.fromUrlParam : 'config';
|
|
130
|
-
config = deepMerge(config, this.LoadConfigDefaultFromUrlParam(param));
|
|
131
|
-
}
|
|
132
|
-
console.debug('app config', config);
|
|
133
|
-
this.Config = config;
|
|
134
|
-
});
|
|
135
|
-
}
|
|
136
137
|
static LoadConfigDefaultFromUrlParam(param = 'config') {
|
|
137
138
|
const queryString = window.location.search;
|
|
138
139
|
const urlParams = new URLSearchParams(queryString);
|
|
@@ -204,6 +205,9 @@ ConfigService.Defaults = {};
|
|
|
204
205
|
*/
|
|
205
206
|
ConfigService.Overwrites = {};
|
|
206
207
|
ConfigService.LocalStorageKey = 'rxap/config/local-config';
|
|
208
|
+
/**
|
|
209
|
+
* @deprecated instead use the url property of the ConfigLoadOptions
|
|
210
|
+
*/
|
|
207
211
|
ConfigService.Urls = ['config.json'];
|
|
208
212
|
ConfigService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: ConfigService, deps: [{ token: RXAP_CONFIG, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
209
213
|
ConfigService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: ConfigService, providedIn: 'root' });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rxap-config.mjs","sources":["../../../../libs/config/src/lib/tokens.ts","../../../../libs/config/src/lib/config.service.ts","../../../../libs/config/src/lib/config-loader.service.ts","../../../../libs/config/src/rxap-config.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\nexport const RXAP_CONFIG = new InjectionToken('rxap/config');\n","import {\n Injectable,\n Optional,\n Inject\n} from '@angular/core';\nimport {\n deepMerge,\n SetObjectValue\n} from '@rxap/utilities';\nimport { RXAP_CONFIG } from './tokens';\nimport { NoInferType } from './types';\nimport { AnySchema } from 'joi';\n\nexport interface ConfigLoadOptions {\n fromUrlParam?: string | boolean;\n fromLocalStorage?: boolean;\n schema?: AnySchema;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ConfigService<Config extends Record<string, any> = Record<string, any>> {\n\n public static Config: any = null;\n\n /**\n * Static default values for the config object.\n * Will be overwritten by an dynamic config file specified in\n * the Urls array.\n */\n public static Defaults: any = {};\n\n /**\n * Any value definition in the Overwrites object will overwrite any\n * value form the Defaults values or dynamic config files\n */\n public static Overwrites: any = {};\n\n public static LocalStorageKey = 'rxap/config/local-config';\n\n public static Urls = [ 'config.json' ];\n\n private static async loadConfig<T = any>(url: string, required?: boolean, schema?: AnySchema): Promise<T | null> {\n\n let config: any;\n let response: any;\n\n try {\n response = await fetch(url)\n } catch (error: any) {\n const message = `Could not fetch config from '${url}': ${error.message}`;\n if (required) {\n this.showError(message);\n throw new Error(message);\n } else {\n console.warn(message);\n return null;\n }\n }\n\n try {\n config = await response.json()\n } catch (error: any) {\n const message = `Could not parse config from '${url}' to a json object: ${error.message}`;\n if (required) {\n this.showError(message);\n throw new Error(message);\n } else {\n console.warn(message);\n return null;\n }\n }\n\n if (schema) {\n try {\n config = await schema.validateAsync(config);\n } catch (error: any) {\n const message = `Config from '${url}' is not valid: ${error.message}`;\n if (required) {\n this.showError(message);\n throw new Error(message);\n } else {\n console.warn(message);\n return null;\n }\n }\n }\n\n return config;\n\n }\n\n private static showError(message: string) {\n const hasUl = document.getElementById('rxap-config-error') !== null;\n const ul = document.getElementById('rxap-config-error') ?? document.createElement('ul');\n ul.id = 'rxap-config-error';\n ul.style.position = 'fixed';\n ul.style.bottom = '16px';\n ul.style.right = '16px';\n ul.style.backgroundColor = 'white';\n ul.style.padding = '32px';\n ul.style.zIndex = '99999999';\n ul.style.color = 'black';\n const li = document.createElement('li');\n li.innerText = message;\n ul.appendChild(li);\n if (!hasUl) {\n document.body.appendChild(ul);\n }\n }\n\n public static async SideLoad(url: string, propertyPath: string, required?: boolean, schema?: AnySchema): Promise<void> {\n\n if (!this.Config) {\n throw new Error('Config side load is only possible after the initial config load.');\n }\n\n const config = await this.loadConfig(url, required, schema);\n\n SetObjectValue(this.Config, propertyPath, config);\n\n console.debug(`Side loaded config for '${propertyPath}' successful`, this.Config);\n\n }\n\n /**\n * Used to load the app config from a remote resource.\n *\n * Promise.all([ ConfigService.Load() ])\n * .then(() => platformBrowserDynamic().bootstrapModule(AppModule))\n * .catch(err => console.error(err))\n *\n */\n public static async Load(options?: ConfigLoadOptions): Promise<void> {\n let config = this.Defaults;\n for (const url of ConfigService.Urls) {\n config = await this.loadConfig(url, true, options?.schema);\n }\n\n config = deepMerge(config, this.Overwrites);\n\n if (options?.fromLocalStorage !== false) {\n\n const localConfig = localStorage.getItem(ConfigService.LocalStorageKey);\n\n if (localConfig) {\n try {\n config = deepMerge(config, JSON.parse(localConfig));\n } catch (e: any) {\n console.error('local config could not be parsed');\n }\n }\n\n }\n\n if (options?.fromUrlParam) {\n const param = typeof options.fromUrlParam === 'string' ? options.fromUrlParam : 'config';\n config = deepMerge(config, this.LoadConfigDefaultFromUrlParam(param));\n }\n\n console.debug('app config', config);\n\n this.Config = config;\n }\n\n private static LoadConfigDefaultFromUrlParam(param: string = 'config') {\n\n const queryString = window.location.search;\n const urlParams = new URLSearchParams(queryString);\n\n const configFromParams = {};\n\n for (const configParam of urlParams.getAll('config')) {\n\n try {\n const split = configParam.split(';');\n if (split.length === 2) {\n const keyPath = split[ 0 ];\n const value = split[ 1 ];\n SetObjectValue(configFromParams, keyPath, value);\n }\n } catch (e: any) {\n console.warn(`Parsing of url config param failed for '${configParam}': ${e.message}`);\n }\n\n }\n\n return configFromParams;\n\n }\n\n public static Get<T = any, K extends Record<string, any> = Record<string, any>>(path: string, defaultValue: T | undefined, config: Record<string, any>): T\n public static Get<T = any, K extends Record<string, any> = Record<string, any>>(\n path: string,\n defaultValue: NoInferType<T>,\n config: Record<string, any> = this.Config\n ): T {\n if (!config) {\n throw new Error('config not loaded');\n }\n let configValue: any = config;\n if (typeof path !== 'string') {\n throw new Error('The config property path is not a string');\n }\n for (const fragment of (path as any).split('.')) {\n if (configValue.hasOwnProperty(fragment)) {\n configValue = configValue[ fragment ];\n } else {\n if (defaultValue !== undefined) {\n return defaultValue;\n }\n console.warn(`Config with path '${path}' not found`);\n return undefined as any;\n }\n }\n return configValue;\n }\n\n public readonly config!: Config;\n\n constructor(@Optional() @Inject(RXAP_CONFIG) config: any | null = null) {\n this.config = ConfigService.Config;\n if (config) {\n this.config = deepMerge(this.config ?? {}, config);\n }\n if (!this.config) {\n throw new Error('config not available');\n }\n }\n\n public setLocalConfig(config: Config): void {\n localStorage.setItem(ConfigService.LocalStorageKey, JSON.stringify(config));\n }\n\n public clearLocalConfig(): void {\n localStorage.removeItem(ConfigService.LocalStorageKey);\n }\n\n public get<T = any>(propertyPath: string): T | undefined;\n public get<T = any>(propertyPath: string, defaultValue: NoInferType<T>): T;\n public get<T = any>(propertyPath: string, defaultValue?: T): T | undefined {\n return ConfigService.Get(propertyPath, defaultValue, this.config);\n }\n\n public getOrThrow<T = any>(propertyPath: string): T;\n public getOrThrow<T = any>(propertyPath: string, defaultValue: NoInferType<T>): T;\n public getOrThrow<T = any>(propertyPath: string, defaultValue?: T): T {\n const value = ConfigService.Get(propertyPath, defaultValue, this.config);\n if (value === undefined) {\n throw new Error(`Could not find config in path '${propertyPath}'`);\n }\n return value;\n }\n\n}\n","import { Injectable, Inject } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { HttpClient } from '@angular/common/http';\nimport { finalize, share } from 'rxjs/operators';\n\n@Injectable({ providedIn: 'root' })\nexport class ConfigLoaderService {\n public readonly configs = new Map<string, any>();\n\n public readonly configLoading = new Map<string, Observable<any>>();\n\n constructor(\n @Inject(HttpClient)\n public readonly http: HttpClient\n ) {}\n\n public async load$<T = any>(url: string): Promise<T> {\n if (this.configs.has(url)) {\n return this.configs.get(url);\n }\n\n if (this.configLoading.has(url)) {\n return this.configLoading.get(url)!.toPromise();\n }\n\n const loading$ = this.http.get<T>(url).pipe(\n finalize(() => this.configLoading.delete(url)),\n share()\n );\n\n this.configLoading.set(url, loading$);\n\n return loading$.toPromise();\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"rxap-config.mjs","sources":["../../../../libs/config/src/lib/tokens.ts","../../../../libs/config/src/lib/config.service.ts","../../../../libs/config/src/lib/config-loader.service.ts","../../../../libs/config/src/rxap-config.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\nexport const RXAP_CONFIG = new InjectionToken('rxap/config');\n","import {\n Injectable,\n Optional,\n Inject\n} from '@angular/core';\nimport {\n deepMerge,\n SetObjectValue,\n coerceArray\n} from '@rxap/utilities';\nimport { RXAP_CONFIG } from './tokens';\nimport { NoInferType } from './types';\nimport { AnySchema } from 'joi';\n\nexport interface ConfigLoadOptions {\n fromUrlParam?: string | boolean;\n fromLocalStorage?: boolean;\n schema?: AnySchema;\n url?: string | string[];\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ConfigService<Config extends Record<string, any> = Record<string, any>> {\n\n public static Config: any = null;\n\n /**\n * Static default values for the config object.\n * Will be overwritten by an dynamic config file specified in\n * the Urls array.\n */\n public static Defaults: any = {};\n\n /**\n * Any value definition in the Overwrites object will overwrite any\n * value form the Defaults values or dynamic config files\n */\n public static Overwrites: any = {};\n\n public static LocalStorageKey = 'rxap/config/local-config';\n\n /**\n * @deprecated instead use the url property of the ConfigLoadOptions\n */\n public static Urls = [ 'config.json' ];\n\n /**\n * Used to load the app config from a remote resource.\n *\n * Promise.all([ ConfigService.Load() ])\n * .then(() => platformBrowserDynamic().bootstrapModule(AppModule))\n * .catch(err => console.error(err))\n *\n */\n public static async Load(options?: ConfigLoadOptions): Promise<void> {\n let config = this.Defaults;\n const urls = options?.url ? coerceArray(config.url) : ConfigService.Urls;\n for (const url of urls) {\n config = await this.loadConfig(url, true, options?.schema);\n }\n\n config = deepMerge(config, this.Overwrites);\n\n if (options?.fromLocalStorage !== false) {\n\n const localConfig = localStorage.getItem(ConfigService.LocalStorageKey);\n\n if (localConfig) {\n try {\n config = deepMerge(config, JSON.parse(localConfig));\n } catch (e: any) {\n console.error('local config could not be parsed');\n }\n }\n\n }\n\n if (options?.fromUrlParam) {\n const param = typeof options.fromUrlParam === 'string' ? options.fromUrlParam : 'config';\n config = deepMerge(config, this.LoadConfigDefaultFromUrlParam(param));\n }\n\n console.debug('app config', config);\n\n this.Config = config;\n }\n\n private static showError(message: string) {\n const hasUl = document.getElementById('rxap-config-error') !== null;\n const ul = document.getElementById('rxap-config-error') ?? document.createElement('ul');\n ul.id = 'rxap-config-error';\n ul.style.position = 'fixed';\n ul.style.bottom = '16px';\n ul.style.right = '16px';\n ul.style.backgroundColor = 'white';\n ul.style.padding = '32px';\n ul.style.zIndex = '99999999';\n ul.style.color = 'black';\n const li = document.createElement('li');\n li.innerText = message;\n ul.appendChild(li);\n if (!hasUl) {\n document.body.appendChild(ul);\n }\n }\n\n public static async SideLoad(url: string, propertyPath: string, required?: boolean, schema?: AnySchema): Promise<void> {\n\n if (!this.Config) {\n throw new Error('Config side load is only possible after the initial config load.');\n }\n\n const config = await this.loadConfig(url, required, schema);\n\n SetObjectValue(this.Config, propertyPath, config);\n\n console.debug(`Side loaded config for '${propertyPath}' successful`, this.Config);\n\n }\n\n private static async loadConfig<T = any>(url: string, required?: boolean, schema?: AnySchema): Promise<T | null> {\n\n let config: any;\n let response: any;\n\n try {\n response = await fetch(url);\n } catch (error: any) {\n const message = `Could not fetch config from '${url}': ${error.message}`;\n if (required) {\n this.showError(message);\n throw new Error(message);\n } else {\n console.warn(message);\n return null;\n }\n }\n\n try {\n config = await response.json()\n } catch (error: any) {\n const message = `Could not parse config from '${url}' to a json object: ${error.message}`;\n if (required) {\n this.showError(message);\n throw new Error(message);\n } else {\n console.warn(message);\n return null;\n }\n }\n\n if (schema) {\n try {\n config = await schema.validateAsync(config);\n } catch (error: any) {\n const message = `Config from '${url}' is not valid: ${error.message}`;\n if (required) {\n this.showError(message);\n throw new Error(message);\n } else {\n console.warn(message);\n return null;\n }\n }\n }\n\n return config;\n\n }\n\n private static LoadConfigDefaultFromUrlParam(param: string = 'config') {\n\n const queryString = window.location.search;\n const urlParams = new URLSearchParams(queryString);\n\n const configFromParams = {};\n\n for (const configParam of urlParams.getAll('config')) {\n\n try {\n const split = configParam.split(';');\n if (split.length === 2) {\n const keyPath = split[ 0 ];\n const value = split[ 1 ];\n SetObjectValue(configFromParams, keyPath, value);\n }\n } catch (e: any) {\n console.warn(`Parsing of url config param failed for '${configParam}': ${e.message}`);\n }\n\n }\n\n return configFromParams;\n\n }\n\n public static Get<T = any, K extends Record<string, any> = Record<string, any>>(path: string, defaultValue: T | undefined, config: Record<string, any>): T\n public static Get<T = any, K extends Record<string, any> = Record<string, any>>(\n path: string,\n defaultValue: NoInferType<T>,\n config: Record<string, any> = this.Config\n ): T {\n if (!config) {\n throw new Error('config not loaded');\n }\n let configValue: any = config;\n if (typeof path !== 'string') {\n throw new Error('The config property path is not a string');\n }\n for (const fragment of (path as any).split('.')) {\n if (configValue.hasOwnProperty(fragment)) {\n configValue = configValue[ fragment ];\n } else {\n if (defaultValue !== undefined) {\n return defaultValue;\n }\n console.warn(`Config with path '${path}' not found`);\n return undefined as any;\n }\n }\n return configValue;\n }\n\n public readonly config!: Config;\n\n constructor(@Optional() @Inject(RXAP_CONFIG) config: any | null = null) {\n this.config = ConfigService.Config;\n if (config) {\n this.config = deepMerge(this.config ?? {}, config);\n }\n if (!this.config) {\n throw new Error('config not available');\n }\n }\n\n public setLocalConfig(config: Config): void {\n localStorage.setItem(ConfigService.LocalStorageKey, JSON.stringify(config));\n }\n\n public clearLocalConfig(): void {\n localStorage.removeItem(ConfigService.LocalStorageKey);\n }\n\n public get<T = any>(propertyPath: string): T | undefined;\n public get<T = any>(propertyPath: string, defaultValue: NoInferType<T>): T;\n public get<T = any>(propertyPath: string, defaultValue?: T): T | undefined {\n return ConfigService.Get(propertyPath, defaultValue, this.config);\n }\n\n public getOrThrow<T = any>(propertyPath: string): T;\n public getOrThrow<T = any>(propertyPath: string, defaultValue: NoInferType<T>): T;\n public getOrThrow<T = any>(propertyPath: string, defaultValue?: T): T {\n const value = ConfigService.Get(propertyPath, defaultValue, this.config);\n if (value === undefined) {\n throw new Error(`Could not find config in path '${propertyPath}'`);\n }\n return value;\n }\n\n}\n","import { Injectable, Inject } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { HttpClient } from '@angular/common/http';\nimport { finalize, share } from 'rxjs/operators';\n\n@Injectable({ providedIn: 'root' })\nexport class ConfigLoaderService {\n public readonly configs = new Map<string, any>();\n\n public readonly configLoading = new Map<string, Observable<any>>();\n\n constructor(\n @Inject(HttpClient)\n public readonly http: HttpClient\n ) {}\n\n public async load$<T = any>(url: string): Promise<T> {\n if (this.configs.has(url)) {\n return this.configs.get(url);\n }\n\n if (this.configLoading.has(url)) {\n return this.configLoading.get(url)!.toPromise();\n }\n\n const loading$ = this.http.get<T>(url).pipe(\n finalize(() => this.configLoading.delete(url)),\n share()\n );\n\n this.configLoading.set(url, loading$);\n\n return loading$.toPromise();\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
package/fesm2020/rxap-config.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
2
|
import { InjectionToken, Injectable, Optional, Inject } from '@angular/core';
|
|
3
|
-
import { deepMerge, SetObjectValue } from '@rxap/utilities';
|
|
3
|
+
import { deepMerge, coerceArray, SetObjectValue } from '@rxap/utilities';
|
|
4
4
|
import * as i1 from '@angular/common/http';
|
|
5
5
|
import { HttpClient } from '@angular/common/http';
|
|
6
6
|
import { finalize, share } from 'rxjs/operators';
|
|
@@ -17,6 +17,65 @@ class ConfigService {
|
|
|
17
17
|
throw new Error('config not available');
|
|
18
18
|
}
|
|
19
19
|
}
|
|
20
|
+
/**
|
|
21
|
+
* Used to load the app config from a remote resource.
|
|
22
|
+
*
|
|
23
|
+
* Promise.all([ ConfigService.Load() ])
|
|
24
|
+
* .then(() => platformBrowserDynamic().bootstrapModule(AppModule))
|
|
25
|
+
* .catch(err => console.error(err))
|
|
26
|
+
*
|
|
27
|
+
*/
|
|
28
|
+
static async Load(options) {
|
|
29
|
+
let config = this.Defaults;
|
|
30
|
+
const urls = options?.url ? coerceArray(config.url) : ConfigService.Urls;
|
|
31
|
+
for (const url of urls) {
|
|
32
|
+
config = await this.loadConfig(url, true, options?.schema);
|
|
33
|
+
}
|
|
34
|
+
config = deepMerge(config, this.Overwrites);
|
|
35
|
+
if (options?.fromLocalStorage !== false) {
|
|
36
|
+
const localConfig = localStorage.getItem(ConfigService.LocalStorageKey);
|
|
37
|
+
if (localConfig) {
|
|
38
|
+
try {
|
|
39
|
+
config = deepMerge(config, JSON.parse(localConfig));
|
|
40
|
+
}
|
|
41
|
+
catch (e) {
|
|
42
|
+
console.error('local config could not be parsed');
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
if (options?.fromUrlParam) {
|
|
47
|
+
const param = typeof options.fromUrlParam === 'string' ? options.fromUrlParam : 'config';
|
|
48
|
+
config = deepMerge(config, this.LoadConfigDefaultFromUrlParam(param));
|
|
49
|
+
}
|
|
50
|
+
console.debug('app config', config);
|
|
51
|
+
this.Config = config;
|
|
52
|
+
}
|
|
53
|
+
static showError(message) {
|
|
54
|
+
const hasUl = document.getElementById('rxap-config-error') !== null;
|
|
55
|
+
const ul = document.getElementById('rxap-config-error') ?? document.createElement('ul');
|
|
56
|
+
ul.id = 'rxap-config-error';
|
|
57
|
+
ul.style.position = 'fixed';
|
|
58
|
+
ul.style.bottom = '16px';
|
|
59
|
+
ul.style.right = '16px';
|
|
60
|
+
ul.style.backgroundColor = 'white';
|
|
61
|
+
ul.style.padding = '32px';
|
|
62
|
+
ul.style.zIndex = '99999999';
|
|
63
|
+
ul.style.color = 'black';
|
|
64
|
+
const li = document.createElement('li');
|
|
65
|
+
li.innerText = message;
|
|
66
|
+
ul.appendChild(li);
|
|
67
|
+
if (!hasUl) {
|
|
68
|
+
document.body.appendChild(ul);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
static async SideLoad(url, propertyPath, required, schema) {
|
|
72
|
+
if (!this.Config) {
|
|
73
|
+
throw new Error('Config side load is only possible after the initial config load.');
|
|
74
|
+
}
|
|
75
|
+
const config = await this.loadConfig(url, required, schema);
|
|
76
|
+
SetObjectValue(this.Config, propertyPath, config);
|
|
77
|
+
console.debug(`Side loaded config for '${propertyPath}' successful`, this.Config);
|
|
78
|
+
}
|
|
20
79
|
static async loadConfig(url, required, schema) {
|
|
21
80
|
let config;
|
|
22
81
|
let response;
|
|
@@ -66,64 +125,6 @@ class ConfigService {
|
|
|
66
125
|
}
|
|
67
126
|
return config;
|
|
68
127
|
}
|
|
69
|
-
static showError(message) {
|
|
70
|
-
const hasUl = document.getElementById('rxap-config-error') !== null;
|
|
71
|
-
const ul = document.getElementById('rxap-config-error') ?? document.createElement('ul');
|
|
72
|
-
ul.id = 'rxap-config-error';
|
|
73
|
-
ul.style.position = 'fixed';
|
|
74
|
-
ul.style.bottom = '16px';
|
|
75
|
-
ul.style.right = '16px';
|
|
76
|
-
ul.style.backgroundColor = 'white';
|
|
77
|
-
ul.style.padding = '32px';
|
|
78
|
-
ul.style.zIndex = '99999999';
|
|
79
|
-
ul.style.color = 'black';
|
|
80
|
-
const li = document.createElement('li');
|
|
81
|
-
li.innerText = message;
|
|
82
|
-
ul.appendChild(li);
|
|
83
|
-
if (!hasUl) {
|
|
84
|
-
document.body.appendChild(ul);
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
static async SideLoad(url, propertyPath, required, schema) {
|
|
88
|
-
if (!this.Config) {
|
|
89
|
-
throw new Error('Config side load is only possible after the initial config load.');
|
|
90
|
-
}
|
|
91
|
-
const config = await this.loadConfig(url, required, schema);
|
|
92
|
-
SetObjectValue(this.Config, propertyPath, config);
|
|
93
|
-
console.debug(`Side loaded config for '${propertyPath}' successful`, this.Config);
|
|
94
|
-
}
|
|
95
|
-
/**
|
|
96
|
-
* Used to load the app config from a remote resource.
|
|
97
|
-
*
|
|
98
|
-
* Promise.all([ ConfigService.Load() ])
|
|
99
|
-
* .then(() => platformBrowserDynamic().bootstrapModule(AppModule))
|
|
100
|
-
* .catch(err => console.error(err))
|
|
101
|
-
*
|
|
102
|
-
*/
|
|
103
|
-
static async Load(options) {
|
|
104
|
-
let config = this.Defaults;
|
|
105
|
-
for (const url of ConfigService.Urls) {
|
|
106
|
-
config = await this.loadConfig(url, true, options?.schema);
|
|
107
|
-
}
|
|
108
|
-
config = deepMerge(config, this.Overwrites);
|
|
109
|
-
if (options?.fromLocalStorage !== false) {
|
|
110
|
-
const localConfig = localStorage.getItem(ConfigService.LocalStorageKey);
|
|
111
|
-
if (localConfig) {
|
|
112
|
-
try {
|
|
113
|
-
config = deepMerge(config, JSON.parse(localConfig));
|
|
114
|
-
}
|
|
115
|
-
catch (e) {
|
|
116
|
-
console.error('local config could not be parsed');
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
if (options?.fromUrlParam) {
|
|
121
|
-
const param = typeof options.fromUrlParam === 'string' ? options.fromUrlParam : 'config';
|
|
122
|
-
config = deepMerge(config, this.LoadConfigDefaultFromUrlParam(param));
|
|
123
|
-
}
|
|
124
|
-
console.debug('app config', config);
|
|
125
|
-
this.Config = config;
|
|
126
|
-
}
|
|
127
128
|
static LoadConfigDefaultFromUrlParam(param = 'config') {
|
|
128
129
|
const queryString = window.location.search;
|
|
129
130
|
const urlParams = new URLSearchParams(queryString);
|
|
@@ -195,6 +196,9 @@ ConfigService.Defaults = {};
|
|
|
195
196
|
*/
|
|
196
197
|
ConfigService.Overwrites = {};
|
|
197
198
|
ConfigService.LocalStorageKey = 'rxap/config/local-config';
|
|
199
|
+
/**
|
|
200
|
+
* @deprecated instead use the url property of the ConfigLoadOptions
|
|
201
|
+
*/
|
|
198
202
|
ConfigService.Urls = ['config.json'];
|
|
199
203
|
ConfigService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: ConfigService, deps: [{ token: RXAP_CONFIG, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
200
204
|
ConfigService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: ConfigService, providedIn: 'root' });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rxap-config.mjs","sources":["../../../../libs/config/src/lib/tokens.ts","../../../../libs/config/src/lib/config.service.ts","../../../../libs/config/src/lib/config-loader.service.ts","../../../../libs/config/src/rxap-config.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\nexport const RXAP_CONFIG = new InjectionToken('rxap/config');\n","import {\n Injectable,\n Optional,\n Inject\n} from '@angular/core';\nimport {\n deepMerge,\n SetObjectValue\n} from '@rxap/utilities';\nimport { RXAP_CONFIG } from './tokens';\nimport { NoInferType } from './types';\nimport { AnySchema } from 'joi';\n\nexport interface ConfigLoadOptions {\n fromUrlParam?: string | boolean;\n fromLocalStorage?: boolean;\n schema?: AnySchema;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ConfigService<Config extends Record<string, any> = Record<string, any>> {\n\n public static Config: any = null;\n\n /**\n * Static default values for the config object.\n * Will be overwritten by an dynamic config file specified in\n * the Urls array.\n */\n public static Defaults: any = {};\n\n /**\n * Any value definition in the Overwrites object will overwrite any\n * value form the Defaults values or dynamic config files\n */\n public static Overwrites: any = {};\n\n public static LocalStorageKey = 'rxap/config/local-config';\n\n public static Urls = [ 'config.json' ];\n\n private static async loadConfig<T = any>(url: string, required?: boolean, schema?: AnySchema): Promise<T | null> {\n\n let config: any;\n let response: any;\n\n try {\n response = await fetch(url)\n } catch (error: any) {\n const message = `Could not fetch config from '${url}': ${error.message}`;\n if (required) {\n this.showError(message);\n throw new Error(message);\n } else {\n console.warn(message);\n return null;\n }\n }\n\n try {\n config = await response.json()\n } catch (error: any) {\n const message = `Could not parse config from '${url}' to a json object: ${error.message}`;\n if (required) {\n this.showError(message);\n throw new Error(message);\n } else {\n console.warn(message);\n return null;\n }\n }\n\n if (schema) {\n try {\n config = await schema.validateAsync(config);\n } catch (error: any) {\n const message = `Config from '${url}' is not valid: ${error.message}`;\n if (required) {\n this.showError(message);\n throw new Error(message);\n } else {\n console.warn(message);\n return null;\n }\n }\n }\n\n return config;\n\n }\n\n private static showError(message: string) {\n const hasUl = document.getElementById('rxap-config-error') !== null;\n const ul = document.getElementById('rxap-config-error') ?? document.createElement('ul');\n ul.id = 'rxap-config-error';\n ul.style.position = 'fixed';\n ul.style.bottom = '16px';\n ul.style.right = '16px';\n ul.style.backgroundColor = 'white';\n ul.style.padding = '32px';\n ul.style.zIndex = '99999999';\n ul.style.color = 'black';\n const li = document.createElement('li');\n li.innerText = message;\n ul.appendChild(li);\n if (!hasUl) {\n document.body.appendChild(ul);\n }\n }\n\n public static async SideLoad(url: string, propertyPath: string, required?: boolean, schema?: AnySchema): Promise<void> {\n\n if (!this.Config) {\n throw new Error('Config side load is only possible after the initial config load.');\n }\n\n const config = await this.loadConfig(url, required, schema);\n\n SetObjectValue(this.Config, propertyPath, config);\n\n console.debug(`Side loaded config for '${propertyPath}' successful`, this.Config);\n\n }\n\n /**\n * Used to load the app config from a remote resource.\n *\n * Promise.all([ ConfigService.Load() ])\n * .then(() => platformBrowserDynamic().bootstrapModule(AppModule))\n * .catch(err => console.error(err))\n *\n */\n public static async Load(options?: ConfigLoadOptions): Promise<void> {\n let config = this.Defaults;\n for (const url of ConfigService.Urls) {\n config = await this.loadConfig(url, true, options?.schema);\n }\n\n config = deepMerge(config, this.Overwrites);\n\n if (options?.fromLocalStorage !== false) {\n\n const localConfig = localStorage.getItem(ConfigService.LocalStorageKey);\n\n if (localConfig) {\n try {\n config = deepMerge(config, JSON.parse(localConfig));\n } catch (e: any) {\n console.error('local config could not be parsed');\n }\n }\n\n }\n\n if (options?.fromUrlParam) {\n const param = typeof options.fromUrlParam === 'string' ? options.fromUrlParam : 'config';\n config = deepMerge(config, this.LoadConfigDefaultFromUrlParam(param));\n }\n\n console.debug('app config', config);\n\n this.Config = config;\n }\n\n private static LoadConfigDefaultFromUrlParam(param: string = 'config') {\n\n const queryString = window.location.search;\n const urlParams = new URLSearchParams(queryString);\n\n const configFromParams = {};\n\n for (const configParam of urlParams.getAll('config')) {\n\n try {\n const split = configParam.split(';');\n if (split.length === 2) {\n const keyPath = split[ 0 ];\n const value = split[ 1 ];\n SetObjectValue(configFromParams, keyPath, value);\n }\n } catch (e: any) {\n console.warn(`Parsing of url config param failed for '${configParam}': ${e.message}`);\n }\n\n }\n\n return configFromParams;\n\n }\n\n public static Get<T = any, K extends Record<string, any> = Record<string, any>>(path: string, defaultValue: T | undefined, config: Record<string, any>): T\n public static Get<T = any, K extends Record<string, any> = Record<string, any>>(\n path: string,\n defaultValue: NoInferType<T>,\n config: Record<string, any> = this.Config\n ): T {\n if (!config) {\n throw new Error('config not loaded');\n }\n let configValue: any = config;\n if (typeof path !== 'string') {\n throw new Error('The config property path is not a string');\n }\n for (const fragment of (path as any).split('.')) {\n if (configValue.hasOwnProperty(fragment)) {\n configValue = configValue[ fragment ];\n } else {\n if (defaultValue !== undefined) {\n return defaultValue;\n }\n console.warn(`Config with path '${path}' not found`);\n return undefined as any;\n }\n }\n return configValue;\n }\n\n public readonly config!: Config;\n\n constructor(@Optional() @Inject(RXAP_CONFIG) config: any | null = null) {\n this.config = ConfigService.Config;\n if (config) {\n this.config = deepMerge(this.config ?? {}, config);\n }\n if (!this.config) {\n throw new Error('config not available');\n }\n }\n\n public setLocalConfig(config: Config): void {\n localStorage.setItem(ConfigService.LocalStorageKey, JSON.stringify(config));\n }\n\n public clearLocalConfig(): void {\n localStorage.removeItem(ConfigService.LocalStorageKey);\n }\n\n public get<T = any>(propertyPath: string): T | undefined;\n public get<T = any>(propertyPath: string, defaultValue: NoInferType<T>): T;\n public get<T = any>(propertyPath: string, defaultValue?: T): T | undefined {\n return ConfigService.Get(propertyPath, defaultValue, this.config);\n }\n\n public getOrThrow<T = any>(propertyPath: string): T;\n public getOrThrow<T = any>(propertyPath: string, defaultValue: NoInferType<T>): T;\n public getOrThrow<T = any>(propertyPath: string, defaultValue?: T): T {\n const value = ConfigService.Get(propertyPath, defaultValue, this.config);\n if (value === undefined) {\n throw new Error(`Could not find config in path '${propertyPath}'`);\n }\n return value;\n }\n\n}\n","import { Injectable, Inject } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { HttpClient } from '@angular/common/http';\nimport { finalize, share } from 'rxjs/operators';\n\n@Injectable({ providedIn: 'root' })\nexport class ConfigLoaderService {\n public readonly configs = new Map<string, any>();\n\n public readonly configLoading = new Map<string, Observable<any>>();\n\n constructor(\n @Inject(HttpClient)\n public readonly http: HttpClient\n ) {}\n\n public async load$<T = any>(url: string): Promise<T> {\n if (this.configs.has(url)) {\n return this.configs.get(url);\n }\n\n if (this.configLoading.has(url)) {\n return this.configLoading.get(url)!.toPromise();\n }\n\n const loading$ = this.http.get<T>(url).pipe(\n finalize(() => this.configLoading.delete(url)),\n share()\n );\n\n this.configLoading.set(url, loading$);\n\n return loading$.toPromise();\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"rxap-config.mjs","sources":["../../../../libs/config/src/lib/tokens.ts","../../../../libs/config/src/lib/config.service.ts","../../../../libs/config/src/lib/config-loader.service.ts","../../../../libs/config/src/rxap-config.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\nexport const RXAP_CONFIG = new InjectionToken('rxap/config');\n","import {\n Injectable,\n Optional,\n Inject\n} from '@angular/core';\nimport {\n deepMerge,\n SetObjectValue,\n coerceArray\n} from '@rxap/utilities';\nimport { RXAP_CONFIG } from './tokens';\nimport { NoInferType } from './types';\nimport { AnySchema } from 'joi';\n\nexport interface ConfigLoadOptions {\n fromUrlParam?: string | boolean;\n fromLocalStorage?: boolean;\n schema?: AnySchema;\n url?: string | string[];\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ConfigService<Config extends Record<string, any> = Record<string, any>> {\n\n public static Config: any = null;\n\n /**\n * Static default values for the config object.\n * Will be overwritten by an dynamic config file specified in\n * the Urls array.\n */\n public static Defaults: any = {};\n\n /**\n * Any value definition in the Overwrites object will overwrite any\n * value form the Defaults values or dynamic config files\n */\n public static Overwrites: any = {};\n\n public static LocalStorageKey = 'rxap/config/local-config';\n\n /**\n * @deprecated instead use the url property of the ConfigLoadOptions\n */\n public static Urls = [ 'config.json' ];\n\n /**\n * Used to load the app config from a remote resource.\n *\n * Promise.all([ ConfigService.Load() ])\n * .then(() => platformBrowserDynamic().bootstrapModule(AppModule))\n * .catch(err => console.error(err))\n *\n */\n public static async Load(options?: ConfigLoadOptions): Promise<void> {\n let config = this.Defaults;\n const urls = options?.url ? coerceArray(config.url) : ConfigService.Urls;\n for (const url of urls) {\n config = await this.loadConfig(url, true, options?.schema);\n }\n\n config = deepMerge(config, this.Overwrites);\n\n if (options?.fromLocalStorage !== false) {\n\n const localConfig = localStorage.getItem(ConfigService.LocalStorageKey);\n\n if (localConfig) {\n try {\n config = deepMerge(config, JSON.parse(localConfig));\n } catch (e: any) {\n console.error('local config could not be parsed');\n }\n }\n\n }\n\n if (options?.fromUrlParam) {\n const param = typeof options.fromUrlParam === 'string' ? options.fromUrlParam : 'config';\n config = deepMerge(config, this.LoadConfigDefaultFromUrlParam(param));\n }\n\n console.debug('app config', config);\n\n this.Config = config;\n }\n\n private static showError(message: string) {\n const hasUl = document.getElementById('rxap-config-error') !== null;\n const ul = document.getElementById('rxap-config-error') ?? document.createElement('ul');\n ul.id = 'rxap-config-error';\n ul.style.position = 'fixed';\n ul.style.bottom = '16px';\n ul.style.right = '16px';\n ul.style.backgroundColor = 'white';\n ul.style.padding = '32px';\n ul.style.zIndex = '99999999';\n ul.style.color = 'black';\n const li = document.createElement('li');\n li.innerText = message;\n ul.appendChild(li);\n if (!hasUl) {\n document.body.appendChild(ul);\n }\n }\n\n public static async SideLoad(url: string, propertyPath: string, required?: boolean, schema?: AnySchema): Promise<void> {\n\n if (!this.Config) {\n throw new Error('Config side load is only possible after the initial config load.');\n }\n\n const config = await this.loadConfig(url, required, schema);\n\n SetObjectValue(this.Config, propertyPath, config);\n\n console.debug(`Side loaded config for '${propertyPath}' successful`, this.Config);\n\n }\n\n private static async loadConfig<T = any>(url: string, required?: boolean, schema?: AnySchema): Promise<T | null> {\n\n let config: any;\n let response: any;\n\n try {\n response = await fetch(url);\n } catch (error: any) {\n const message = `Could not fetch config from '${url}': ${error.message}`;\n if (required) {\n this.showError(message);\n throw new Error(message);\n } else {\n console.warn(message);\n return null;\n }\n }\n\n try {\n config = await response.json()\n } catch (error: any) {\n const message = `Could not parse config from '${url}' to a json object: ${error.message}`;\n if (required) {\n this.showError(message);\n throw new Error(message);\n } else {\n console.warn(message);\n return null;\n }\n }\n\n if (schema) {\n try {\n config = await schema.validateAsync(config);\n } catch (error: any) {\n const message = `Config from '${url}' is not valid: ${error.message}`;\n if (required) {\n this.showError(message);\n throw new Error(message);\n } else {\n console.warn(message);\n return null;\n }\n }\n }\n\n return config;\n\n }\n\n private static LoadConfigDefaultFromUrlParam(param: string = 'config') {\n\n const queryString = window.location.search;\n const urlParams = new URLSearchParams(queryString);\n\n const configFromParams = {};\n\n for (const configParam of urlParams.getAll('config')) {\n\n try {\n const split = configParam.split(';');\n if (split.length === 2) {\n const keyPath = split[ 0 ];\n const value = split[ 1 ];\n SetObjectValue(configFromParams, keyPath, value);\n }\n } catch (e: any) {\n console.warn(`Parsing of url config param failed for '${configParam}': ${e.message}`);\n }\n\n }\n\n return configFromParams;\n\n }\n\n public static Get<T = any, K extends Record<string, any> = Record<string, any>>(path: string, defaultValue: T | undefined, config: Record<string, any>): T\n public static Get<T = any, K extends Record<string, any> = Record<string, any>>(\n path: string,\n defaultValue: NoInferType<T>,\n config: Record<string, any> = this.Config\n ): T {\n if (!config) {\n throw new Error('config not loaded');\n }\n let configValue: any = config;\n if (typeof path !== 'string') {\n throw new Error('The config property path is not a string');\n }\n for (const fragment of (path as any).split('.')) {\n if (configValue.hasOwnProperty(fragment)) {\n configValue = configValue[ fragment ];\n } else {\n if (defaultValue !== undefined) {\n return defaultValue;\n }\n console.warn(`Config with path '${path}' not found`);\n return undefined as any;\n }\n }\n return configValue;\n }\n\n public readonly config!: Config;\n\n constructor(@Optional() @Inject(RXAP_CONFIG) config: any | null = null) {\n this.config = ConfigService.Config;\n if (config) {\n this.config = deepMerge(this.config ?? {}, config);\n }\n if (!this.config) {\n throw new Error('config not available');\n }\n }\n\n public setLocalConfig(config: Config): void {\n localStorage.setItem(ConfigService.LocalStorageKey, JSON.stringify(config));\n }\n\n public clearLocalConfig(): void {\n localStorage.removeItem(ConfigService.LocalStorageKey);\n }\n\n public get<T = any>(propertyPath: string): T | undefined;\n public get<T = any>(propertyPath: string, defaultValue: NoInferType<T>): T;\n public get<T = any>(propertyPath: string, defaultValue?: T): T | undefined {\n return ConfigService.Get(propertyPath, defaultValue, this.config);\n }\n\n public getOrThrow<T = any>(propertyPath: string): T;\n public getOrThrow<T = any>(propertyPath: string, defaultValue: NoInferType<T>): T;\n public getOrThrow<T = any>(propertyPath: string, defaultValue?: T): T {\n const value = ConfigService.Get(propertyPath, defaultValue, this.config);\n if (value === undefined) {\n throw new Error(`Could not find config in path '${propertyPath}'`);\n }\n return value;\n }\n\n}\n","import { Injectable, Inject } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { HttpClient } from '@angular/common/http';\nimport { finalize, share } from 'rxjs/operators';\n\n@Injectable({ providedIn: 'root' })\nexport class ConfigLoaderService {\n public readonly configs = new Map<string, any>();\n\n public readonly configLoading = new Map<string, Observable<any>>();\n\n constructor(\n @Inject(HttpClient)\n public readonly http: HttpClient\n ) {}\n\n public async load$<T = any>(url: string): Promise<T> {\n if (this.configs.has(url)) {\n return this.configs.get(url);\n }\n\n if (this.configLoading.has(url)) {\n return this.configLoading.get(url)!.toPromise();\n }\n\n const loading$ = this.http.get<T>(url).pipe(\n finalize(() => this.configLoading.delete(url)),\n share()\n );\n\n this.configLoading.set(url, loading$);\n\n return loading$.toPromise();\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
package/lib/config.service.d.ts
CHANGED
|
@@ -5,6 +5,7 @@ export interface ConfigLoadOptions {
|
|
|
5
5
|
fromUrlParam?: string | boolean;
|
|
6
6
|
fromLocalStorage?: boolean;
|
|
7
7
|
schema?: AnySchema;
|
|
8
|
+
url?: string | string[];
|
|
8
9
|
}
|
|
9
10
|
export declare class ConfigService<Config extends Record<string, any> = Record<string, any>> {
|
|
10
11
|
static Config: any;
|
|
@@ -20,10 +21,10 @@ export declare class ConfigService<Config extends Record<string, any> = Record<s
|
|
|
20
21
|
*/
|
|
21
22
|
static Overwrites: any;
|
|
22
23
|
static LocalStorageKey: string;
|
|
24
|
+
/**
|
|
25
|
+
* @deprecated instead use the url property of the ConfigLoadOptions
|
|
26
|
+
*/
|
|
23
27
|
static Urls: string[];
|
|
24
|
-
private static loadConfig;
|
|
25
|
-
private static showError;
|
|
26
|
-
static SideLoad(url: string, propertyPath: string, required?: boolean, schema?: AnySchema): Promise<void>;
|
|
27
28
|
/**
|
|
28
29
|
* Used to load the app config from a remote resource.
|
|
29
30
|
*
|
|
@@ -33,6 +34,9 @@ export declare class ConfigService<Config extends Record<string, any> = Record<s
|
|
|
33
34
|
*
|
|
34
35
|
*/
|
|
35
36
|
static Load(options?: ConfigLoadOptions): Promise<void>;
|
|
37
|
+
private static showError;
|
|
38
|
+
static SideLoad(url: string, propertyPath: string, required?: boolean, schema?: AnySchema): Promise<void>;
|
|
39
|
+
private static loadConfig;
|
|
36
40
|
private static LoadConfigDefaultFromUrlParam;
|
|
37
41
|
static Get<T = any, K extends Record<string, any> = Record<string, any>>(path: string, defaultValue: T | undefined, config: Record<string, any>): T;
|
|
38
42
|
readonly config: Config;
|