@rxap/config 14.1.4 → 16.0.0-dev.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.
@@ -0,0 +1,34 @@
1
+ import { Injectable, Inject } from '@angular/core';
2
+ import { HttpClient } from '@angular/common/http';
3
+ import { finalize, share } from 'rxjs/operators';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "@angular/common/http";
6
+ class ConfigLoaderService {
7
+ constructor(http) {
8
+ this.http = http;
9
+ this.configs = new Map();
10
+ this.configLoading = new Map();
11
+ }
12
+ async load$(url) {
13
+ if (this.configs.has(url)) {
14
+ return this.configs.get(url);
15
+ }
16
+ if (this.configLoading.has(url)) {
17
+ return this.configLoading.get(url).toPromise();
18
+ }
19
+ const loading$ = this.http.get(url).pipe(finalize(() => this.configLoading.delete(url)), share());
20
+ this.configLoading.set(url, loading$);
21
+ return loading$.toPromise();
22
+ }
23
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.2", ngImport: i0, type: ConfigLoaderService, deps: [{ token: HttpClient }], target: i0.ɵɵFactoryTarget.Injectable }); }
24
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.0.2", ngImport: i0, type: ConfigLoaderService, providedIn: 'root' }); }
25
+ }
26
+ export { ConfigLoaderService };
27
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.2", ngImport: i0, type: ConfigLoaderService, decorators: [{
28
+ type: Injectable,
29
+ args: [{ providedIn: 'root' }]
30
+ }], ctorParameters: function () { return [{ type: i1.HttpClient, decorators: [{
31
+ type: Inject,
32
+ args: [HttpClient]
33
+ }] }]; } });
34
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLWxvYWRlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9jb25maWcvc3JjL2xpYi9jb25maWctbG9hZGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7OztBQUVqRCxNQUNhLG1CQUFtQjtJQUs5QixZQUVrQixJQUFnQjtRQUFoQixTQUFJLEdBQUosSUFBSSxDQUFZO1FBTmxCLFlBQU8sR0FBRyxJQUFJLEdBQUcsRUFBZSxDQUFDO1FBRWpDLGtCQUFhLEdBQUcsSUFBSSxHQUFHLEVBQTJCLENBQUM7SUFLaEUsQ0FBQztJQUVHLEtBQUssQ0FBQyxLQUFLLENBQVUsR0FBVztRQUNyQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ3pCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDOUI7UUFFRCxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQy9CLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFFLENBQUMsU0FBUyxFQUFFLENBQUM7U0FDakQ7UUFFRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQ3pDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUM5QyxLQUFLLEVBQUUsQ0FDUixDQUFDO1FBRUYsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBRXRDLE9BQU8sUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQzlCLENBQUM7OEdBM0JVLG1CQUFtQixrQkFNcEIsVUFBVTtrSEFOVCxtQkFBbUIsY0FETixNQUFNOztTQUNuQixtQkFBbUI7MkZBQW5CLG1CQUFtQjtrQkFEL0IsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUU7OzBCQU83QixNQUFNOzJCQUFDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBmaW5hbGl6ZSwgc2hhcmUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgQ29uZmlnTG9hZGVyU2VydmljZSB7XG4gIHB1YmxpYyByZWFkb25seSBjb25maWdzID0gbmV3IE1hcDxzdHJpbmcsIGFueT4oKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgY29uZmlnTG9hZGluZyA9IG5ldyBNYXA8c3RyaW5nLCBPYnNlcnZhYmxlPGFueT4+KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChIdHRwQ2xpZW50KVxuICAgIHB1YmxpYyByZWFkb25seSBodHRwOiBIdHRwQ2xpZW50XG4gICkge31cblxuICBwdWJsaWMgYXN5bmMgbG9hZCQ8VCA9IGFueT4odXJsOiBzdHJpbmcpOiBQcm9taXNlPFQ+IHtcbiAgICBpZiAodGhpcy5jb25maWdzLmhhcyh1cmwpKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb25maWdzLmdldCh1cmwpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbmZpZ0xvYWRpbmcuaGFzKHVybCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbmZpZ0xvYWRpbmcuZ2V0KHVybCkhLnRvUHJvbWlzZSgpO1xuICAgIH1cblxuICAgIGNvbnN0IGxvYWRpbmckID0gdGhpcy5odHRwLmdldDxUPih1cmwpLnBpcGUoXG4gICAgICBmaW5hbGl6ZSgoKSA9PiB0aGlzLmNvbmZpZ0xvYWRpbmcuZGVsZXRlKHVybCkpLFxuICAgICAgc2hhcmUoKVxuICAgICk7XG5cbiAgICB0aGlzLmNvbmZpZ0xvYWRpbmcuc2V0KHVybCwgbG9hZGluZyQpO1xuXG4gICAgcmV0dXJuIGxvYWRpbmckLnRvUHJvbWlzZSgpO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,208 @@
1
+ import { Injectable, Optional, Inject } from '@angular/core';
2
+ import { deepMerge, SetObjectValue } from '@rxap/utilities';
3
+ import { RXAP_CONFIG } from './tokens';
4
+ import * as i0 from "@angular/core";
5
+ class ConfigService {
6
+ static { this.Config = null; }
7
+ /**
8
+ * Static default values for the config object.
9
+ * Will be overwritten by an dynamic config file specified in
10
+ * the Urls array.
11
+ */
12
+ static { this.Defaults = {}; }
13
+ /**
14
+ * Any value definition in the Overwrites object will overwrite any
15
+ * value form the Defaults values or dynamic config files
16
+ */
17
+ static { this.Overwrites = {}; }
18
+ static { this.LocalStorageKey = 'rxap/config/local-config'; }
19
+ static { this.Urls = ['config.json']; }
20
+ static async loadConfig(url, required, schema) {
21
+ let config;
22
+ let response;
23
+ try {
24
+ response = await fetch(url);
25
+ }
26
+ catch (error) {
27
+ const message = `Could not fetch config from '${url}': ${error.message}`;
28
+ if (required) {
29
+ this.showError(message);
30
+ throw new Error(message);
31
+ }
32
+ else {
33
+ console.warn(message);
34
+ return null;
35
+ }
36
+ }
37
+ try {
38
+ config = await response.json();
39
+ }
40
+ catch (error) {
41
+ const message = `Could not parse config from '${url}' to a json object: ${error.message}`;
42
+ if (required) {
43
+ this.showError(message);
44
+ throw new Error(message);
45
+ }
46
+ else {
47
+ console.warn(message);
48
+ return null;
49
+ }
50
+ }
51
+ if (schema) {
52
+ try {
53
+ config = await schema.validateAsync(config);
54
+ }
55
+ catch (error) {
56
+ const message = `Config from '${url}' is not valid: ${error.message}`;
57
+ if (required) {
58
+ this.showError(message);
59
+ throw new Error(message);
60
+ }
61
+ else {
62
+ console.warn(message);
63
+ return null;
64
+ }
65
+ }
66
+ }
67
+ return config;
68
+ }
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
+ static LoadConfigDefaultFromUrlParam(param = 'config') {
128
+ const queryString = window.location.search;
129
+ const urlParams = new URLSearchParams(queryString);
130
+ const configFromParams = {};
131
+ for (const configParam of urlParams.getAll('config')) {
132
+ try {
133
+ const split = configParam.split(';');
134
+ if (split.length === 2) {
135
+ const keyPath = split[0];
136
+ const value = split[1];
137
+ SetObjectValue(configFromParams, keyPath, value);
138
+ }
139
+ }
140
+ catch (e) {
141
+ console.warn(`Parsing of url config param failed for '${configParam}': ${e.message}`);
142
+ }
143
+ }
144
+ return configFromParams;
145
+ }
146
+ static Get(path, defaultValue, config = this.Config) {
147
+ if (!config) {
148
+ throw new Error('config not loaded');
149
+ }
150
+ let configValue = config;
151
+ if (typeof path !== 'string') {
152
+ throw new Error('The config property path is not a string');
153
+ }
154
+ for (const fragment of path.split('.')) {
155
+ if (configValue?.hasOwnProperty(fragment)) {
156
+ configValue = configValue[fragment];
157
+ }
158
+ else {
159
+ if (defaultValue !== undefined) {
160
+ return defaultValue;
161
+ }
162
+ console.warn(`Config with path '${path}' not found`);
163
+ return undefined;
164
+ }
165
+ }
166
+ return configValue;
167
+ }
168
+ constructor(config = null) {
169
+ this.config = ConfigService.Config;
170
+ if (config) {
171
+ this.config = deepMerge(this.config ?? {}, config);
172
+ }
173
+ if (!this.config) {
174
+ throw new Error('config not available');
175
+ }
176
+ }
177
+ setLocalConfig(config) {
178
+ localStorage.setItem(ConfigService.LocalStorageKey, JSON.stringify(config));
179
+ }
180
+ clearLocalConfig() {
181
+ localStorage.removeItem(ConfigService.LocalStorageKey);
182
+ }
183
+ get(propertyPath, defaultValue) {
184
+ return ConfigService.Get(propertyPath, defaultValue, this.config);
185
+ }
186
+ getOrThrow(propertyPath, defaultValue) {
187
+ const value = ConfigService.Get(propertyPath, defaultValue, this.config);
188
+ if (value === undefined) {
189
+ throw new Error(`Could not find config in path '${propertyPath}'`);
190
+ }
191
+ return value;
192
+ }
193
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.2", ngImport: i0, type: ConfigService, deps: [{ token: RXAP_CONFIG, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
194
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.0.2", ngImport: i0, type: ConfigService, providedIn: 'root' }); }
195
+ }
196
+ export { ConfigService };
197
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.2", ngImport: i0, type: ConfigService, decorators: [{
198
+ type: Injectable,
199
+ args: [{
200
+ providedIn: 'root'
201
+ }]
202
+ }], ctorParameters: function () { return [{ type: undefined, decorators: [{
203
+ type: Optional
204
+ }, {
205
+ type: Inject,
206
+ args: [RXAP_CONFIG]
207
+ }] }]; } });
208
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2NvbmZpZy9zcmMvbGliL2NvbmZpZy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxVQUFVLEVBQ1YsUUFBUSxFQUNSLE1BQU0sRUFDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsU0FBUyxFQUNULGNBQWMsRUFDZixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxVQUFVLENBQUM7O0FBVXZDLE1BR2EsYUFBYTthQUVWLFdBQU0sR0FBUSxJQUFJLEFBQVosQ0FBYTtJQUVqQzs7OztPQUlHO2FBQ1csYUFBUSxHQUFRLEVBQUUsQUFBVixDQUFXO0lBRWpDOzs7T0FHRzthQUNXLGVBQVUsR0FBUSxFQUFFLEFBQVYsQ0FBVzthQUVyQixvQkFBZSxHQUFHLDBCQUEwQixBQUE3QixDQUE4QjthQUU3QyxTQUFJLEdBQUcsQ0FBRSxhQUFhLENBQUUsQUFBcEIsQ0FBcUI7SUFFL0IsTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQVUsR0FBVyxFQUFFLFFBQWtCLEVBQUUsTUFBa0I7UUFFMUYsSUFBSSxNQUFXLENBQUM7UUFDaEIsSUFBSSxRQUFhLENBQUM7UUFFbEIsSUFBSTtZQUNGLFFBQVEsR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQTtTQUM1QjtRQUFDLE9BQU8sS0FBVSxFQUFFO1lBQ25CLE1BQU0sT0FBTyxHQUFHLGdDQUFnQyxHQUFHLE1BQU0sS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3pFLElBQUksUUFBUSxFQUFFO2dCQUNaLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ3hCLE1BQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDMUI7aUJBQU07Z0JBQ0wsT0FBTyxDQUFDLElBQUks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Z0I7UUFDckIsWUFBWSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUlNLEdBQUcsQ0FBVSxZQUFvQixFQUFFLFlBQWdCO1FBQ3hELE9BQU8sYUFBYSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsWUFBWSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBSU0sVUFBVSxDQUFVLFlBQW9CLEVBQUUsWUFBZ0I7UUFDL0QsTUFBTSxLQUFLLEdBQUcsYUFBYSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsWUFBWSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN6RSxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUU7WUFDdkIsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQ0FBa0MsWUFBWSxHQUFHLENBQUMsQ0FBQztTQUNwRTtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQzs4R0F2T1UsYUFBYSxrQkF1TVEsV0FBVztrSEF2TWhDLGFBQWEsY0FGWixNQUFNOztTQUVQLGFBQWE7MkZBQWIsYUFBYTtrQkFIekIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7OzBCQXdNYyxRQUFROzswQkFBSSxNQUFNOzJCQUFDLFdBQVciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBJbmplY3RhYmxlLFxuICBPcHRpb25hbCxcbiAgSW5qZWN0XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgZGVlcE1lcmdlLFxuICBTZXRPYmplY3RWYWx1ZVxufSBmcm9tICdAcnhhcC91dGlsaXRpZXMnO1xuaW1wb3J0IHsgUlhBUF9DT05GSUcgfSBmcm9tICcuL3Rva2Vucyc7XG5pbXBvcnQgeyBOb0luZmVyVHlwZSB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgQW55U2NoZW1hIH0gZnJvbSAnam9pJztcblxuZXhwb3J0IGludGVyZmFjZSBDb25maWdMb2FkT3B0aW9ucyB7XG4gIGZyb21VcmxQYXJhbT86IHN0cmluZyB8IGJvb2xlYW47XG4gIGZyb21Mb2NhbFN0b3JhZ2U/OiBib29sZWFuO1xuICBzY2hlbWE/OiBBbnlTY2hlbWE7XG59XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIENvbmZpZ1NlcnZpY2U8Q29uZmlnIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IFJlY29yZDxzdHJpbmcsIGFueT4+IHtcblxuICBwdWJsaWMgc3RhdGljIENvbmZpZzogYW55ID0gbnVsbDtcblxuICAvKipcbiAgICogU3RhdGljIGRlZmF1bHQgdmFsdWVzIGZvciB0aGUgY29uZmlnIG9iamVjdC5cbiAgICogV2lsbCBiZSBvdmVyd3JpdHRlbiBieSBhbiBkeW5hbWljIGNvbmZpZyBmaWxlIHNwZWNpZmllZCBpblxuICAgKiB0aGUgVXJscyBhcnJheS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgRGVmYXVsdHM6IGFueSA9IHt9O1xuXG4gIC8qKlxuICAgKiBBbnkgdmFsdWUgZGVmaW5pdGlvbiBpbiB0aGUgT3ZlcndyaXRlcyBvYmplY3Qgd2lsbCBvdmVyd3JpdGUgYW55XG4gICAqIHZhbHVlIGZvcm0gdGhlIERlZmF1bHRzIHZhbHVlcyBvciBkeW5hbWljIGNvbmZpZyBmaWxlc1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBPdmVyd3JpdGVzOiBhbnkgPSB7fTtcblxuICBwdWJsaWMgc3RhdGljIExvY2FsU3RvcmFnZUtleSA9ICdyeGFwL2NvbmZpZy9sb2NhbC1jb25maWcnO1xuXG4gIHB1YmxpYyBzdGF0aWMgVXJscyA9IFsgJ2NvbmZpZy5qc29uJyBdO1xuXG4gIHByaXZhdGUgc3RhdGljIGFzeW5jIGxvYWRDb25maWc8VCA9IGFueT4odXJsOiBzdHJpbmcsIHJlcXVpcmVkPzogYm9vbGVhbiwgc2NoZW1hPzogQW55U2NoZW1hKTogUHJvbWlzZTxUIHwgbnVsbD4ge1xuXG4gICAgbGV0IGNvbmZpZzogYW55O1xuICAgIGxldCByZXNwb25zZTogYW55O1xuXG4gICAgdHJ5IHtcbiAgICAgIHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsKVxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBgQ291bGQgbm90IGZldGNoIGNvbmZpZyBmcm9tICcke3VybH0nOiAke2Vycm9yLm1lc3NhZ2V9YDtcbiAgICAgIGlmIChyZXF1aXJlZCkge1xuICAgICAgICB0aGlzLnNob3dFcnJvcihtZXNzYWdlKTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKG1lc3NhZ2UpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uZmlnID0gYXdhaXQgcmVzcG9uc2UuanNvbigpXG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGBDb3VsZCBub3QgcGFyc2UgY29uZmlnIGZyb20gJyR7dXJsfScgdG8gYSBqc29uIG9iamVjdDogJHtlcnJvci5tZXNzYWdlfWA7XG4gICAgICBpZiAocmVxdWlyZWQpIHtcbiAgICAgICAgdGhpcy5zaG93RXJyb3IobWVzc2FnZSk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybihtZXNzYWdlKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNjaGVtYSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uZmlnID0gYXdhaXQgc2NoZW1hLnZhbGlkYXRlQXN5bmMoY29uZmlnKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGBDb25maWcgZnJvbSAnJHt1cmx9JyBpcyBub3QgdmFsaWQ6ICR7ZXJyb3IubWVzc2FnZX1gO1xuICAgICAgICBpZiAocmVxdWlyZWQpIHtcbiAgICAgICAgICB0aGlzLnNob3dFcnJvcihtZXNzYWdlKTtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKG1lc3NhZ2UpO1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbmZpZztcblxuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgc2hvd0Vycm9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIGNvbnN0IGhhc1VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3J4YXAtY29uZmlnLWVycm9yJykgIT09IG51bGw7XG4gICAgY29uc3QgdWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncnhhcC1jb25maWctZXJyb3InKSA/PyBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd1bCcpO1xuICAgIHVsLmlkID0gJ3J4YXAtY29uZmlnLWVycm9yJztcbiAgICB1bC5zdHlsZS5wb3NpdGlvbiA9ICdmaXhlZCc7XG4gICAgdWwuc3R5bGUuYm90dG9tID0gJzE2cHgnO1xuICAgIHVsLnN0eWxlLnJpZ2h0ID0gJzE2cHgnO1xuICAgIHVsLnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICd3aGl0ZSc7XG4gICAgdWwuc3R5bGUucGFkZGluZyA9ICczMnB4JztcbiAgICB1bC5zdHlsZS56SW5kZXggPSAnOTk5OTk5OTknO1xuICAgIHVsLnN0eWxlLmNvbG9yID0gJ2JsYWNrJztcbiAgICBjb25zdCBsaSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7XG4gICAgbGkuaW5uZXJUZXh0ID0gbWVzc2FnZTtcbiAgICB1bC5hcHBlbmRDaGlsZChsaSk7XG4gICAgaWYgKCFoYXNVbCkge1xuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh1bCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHN0YXRpYyBhc3luYyBTaWRlTG9hZCh1cmw6IHN0cmluZywgcHJvcGVydHlQYXRoOiBzdHJpbmcsIHJlcXVpcmVkPzogYm9vbGVhbiwgc2NoZW1hPzogQW55U2NoZW1hKTogUHJvbWlzZTx2b2lkPiB7XG5cbiAgICBpZiAoIXRoaXMuQ29uZmlnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbmZpZyBzaWRlIGxvYWQgaXMgb25seSBwb3NzaWJsZSBhZnRlciB0aGUgaW5pdGlhbCBjb25maWcgbG9hZC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb25maWcgPSBhd2FpdCB0aGlzLmxvYWRDb25maWcodXJsLCByZXF1aXJlZCwgc2NoZW1hKTtcblxuICAgIFNldE9iamVjdFZhbHVlKHRoaXMuQ29uZmlnLCBwcm9wZXJ0eVBhdGgsIGNvbmZpZyk7XG5cbiAgICBjb25zb2xlLmRlYnVnKGBTaWRlIGxvYWRlZCBjb25maWcgZm9yICcke3Byb3BlcnR5UGF0aH0nIHN1Y2Nlc3NmdWxgLCB0aGlzLkNvbmZpZyk7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBVc2VkIHRvIGxvYWQgdGhlIGFwcCBjb25maWcgZnJvbSBhIHJlbW90ZSByZXNvdXJjZS5cbiAgICpcbiAgICogUHJvbWlzZS5hbGwoWyBDb25maWdTZXJ2aWNlLkxvYWQoKSBdKVxuICAgKiAudGhlbigoKSA9PiBwbGF0Zm9ybUJyb3dzZXJEeW5hbWljKCkuYm9vdHN0cmFwTW9kdWxlKEFwcE1vZHVsZSkpXG4gICAqIC5jYXRjaChlcnIgPT4gY29uc29sZS5lcnJvcihlcnIpKVxuICAgKlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBhc3luYyBMb2FkKG9wdGlvbnM/OiBDb25maWdMb2FkT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBjb25maWcgPSB0aGlzLkRlZmF1bHRzO1xuICAgIGZvciAoY29uc3QgdXJsIG9mIENvbmZpZ1NlcnZpY2UuVXJscykge1xuICAgICAgY29uZmlnID0gYXdhaXQgdGhpcy5sb2FkQ29uZmlnKHVybCwgdHJ1ZSwgb3B0aW9ucz8uc2NoZW1hKTtcbiAgICB9XG5cbiAgICBjb25maWcgPSBkZWVwTWVyZ2UoY29uZmlnLCB0aGlzLk92ZXJ3cml0ZXMpO1xuXG4gICAgaWYgKG9wdGlvbnM/LmZyb21Mb2NhbFN0b3JhZ2UgIT09IGZhbHNlKSB7XG5cbiAgICAgIGNvbnN0IGxvY2FsQ29uZmlnID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oQ29uZmlnU2VydmljZS5Mb2NhbFN0b3JhZ2VLZXkpO1xuXG4gICAgICBpZiAobG9jYWxDb25maWcpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25maWcgPSBkZWVwTWVyZ2UoY29uZmlnLCBKU09OLnBhcnNlKGxvY2FsQ29uZmlnKSk7XG4gICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ2xvY2FsIGNvbmZpZyBjb3VsZCBub3QgYmUgcGFyc2VkJyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgIH1cblxuICAgIGlmIChvcHRpb25zPy5mcm9tVXJsUGFyYW0pIHtcbiAgICAgIGNvbnN0IHBhcmFtID0gdHlwZW9mIG9wdGlvbnMuZnJvbVVybFBhcmFtID09PSAnc3RyaW5nJyA/IG9wdGlvbnMuZnJvbVVybFBhcmFtIDogJ2NvbmZpZyc7XG4gICAgICBjb25maWcgICAgICA9IGRlZXBNZXJnZShjb25maWcsIHRoaXMuTG9hZENvbmZpZ0RlZmF1bHRGcm9tVXJsUGFyYW0ocGFyYW0pKTtcbiAgICB9XG5cbiAgICBjb25zb2xlLmRlYnVnKCdhcHAgY29uZmlnJywgY29uZmlnKTtcblxuICAgIHRoaXMuQ29uZmlnID0gY29uZmlnO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgTG9hZENvbmZpZ0RlZmF1bHRGcm9tVXJsUGFyYW0ocGFyYW06IHN0cmluZyA9ICdjb25maWcnKSB7XG5cbiAgICBjb25zdCBxdWVyeVN0cmluZyA9IHdpbmRvdy5sb2NhdGlvbi5zZWFyY2g7XG4gICAgY29uc3QgdXJsUGFyYW1zICAgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHF1ZXJ5U3RyaW5nKTtcblxuICAgIGNvbnN0IGNvbmZpZ0Zyb21QYXJhbXMgPSB7fTtcblxuICAgIGZvciAoY29uc3QgY29uZmlnUGFyYW0gb2YgdXJsUGFyYW1zLmdldEFsbCgnY29uZmlnJykpIHtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc3BsaXQgPSBjb25maWdQYXJhbS5zcGxpdCgnOycpO1xuICAgICAgICBpZiAoc3BsaXQubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgY29uc3Qga2V5UGF0aCA9IHNwbGl0WyAwIF07XG4gICAgICAgICAgY29uc3QgdmFsdWUgICA9IHNwbGl0WyAxIF07XG4gICAgICAgICAgU2V0T2JqZWN0VmFsdWUoY29uZmlnRnJvbVBhcmFtcywga2V5UGF0aCwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBQYXJzaW5nIG9mIHVybCBjb25maWcgcGFyYW0gZmFpbGVkIGZvciAnJHtjb25maWdQYXJhbX0nOiAke2UubWVzc2FnZX1gKTtcbiAgICAgIH1cblxuICAgIH1cblxuICAgIHJldHVybiBjb25maWdGcm9tUGFyYW1zO1xuXG4gIH1cblxuICBwdWJsaWMgc3RhdGljIEdldDxUID0gYW55LCBLIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IFJlY29yZDxzdHJpbmcsIGFueT4+KHBhdGg6IHN0cmluZywgZGVmYXVsdFZhbHVlOiBUIHwgdW5kZWZpbmVkLCBjb25maWc6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBUXG4gIHB1YmxpYyBzdGF0aWMgR2V0PFQgPSBhbnksIEsgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gUmVjb3JkPHN0cmluZywgYW55Pj4oXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIGRlZmF1bHRWYWx1ZTogTm9JbmZlclR5cGU8VD4sXG4gICAgY29uZmlnOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gdGhpcy5Db25maWdcbiAgKTogVCB7XG4gICAgaWYgKCFjb25maWcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY29uZmlnIG5vdCBsb2FkZWQnKTtcbiAgICB9XG4gICAgbGV0IGNvbmZpZ1ZhbHVlOiBhbnkgPSBjb25maWc7XG4gICAgaWYgKHR5cGVvZiBwYXRoICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgY29uZmlnIHByb3BlcnR5IHBhdGggaXMgbm90IGEgc3RyaW5nJyk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgZnJhZ21lbnQgb2YgKHBhdGggYXMgYW55KS5zcGxpdCgnLicpKSB7XG4gICAgICBpZiAoY29uZmlnVmFsdWU/Lmhhc093blByb3BlcnR5KGZyYWdtZW50KSkge1xuICAgICAgICBjb25maWdWYWx1ZSA9IGNvbmZpZ1ZhbHVlWyBmcmFnbWVudCBdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLndhcm4oYENvbmZpZyB3aXRoIHBhdGggJyR7cGF0aH0nIG5vdCBmb3VuZGApO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkIGFzIGFueTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNvbmZpZ1ZhbHVlO1xuICB9XG5cbiAgcHVibGljIHJlYWRvbmx5IGNvbmZpZyE6IENvbmZpZztcblxuICBjb25zdHJ1Y3RvcihAT3B0aW9uYWwoKSBASW5qZWN0KFJYQVBfQ09ORklHKSBjb25maWc6IGFueSB8IG51bGwgPSBudWxsKSB7XG4gICAgdGhpcy5jb25maWcgPSBDb25maWdTZXJ2aWNlLkNvbmZpZztcbiAgICBpZiAoY29uZmlnKSB7XG4gICAgICB0aGlzLmNvbmZpZyA9IGRlZXBNZXJnZSh0aGlzLmNvbmZpZyA/PyB7fSwgY29uZmlnKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmNvbmZpZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb25maWcgbm90IGF2YWlsYWJsZScpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZXRMb2NhbENvbmZpZyhjb25maWc6IENvbmZpZyk6IHZvaWQge1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKENvbmZpZ1NlcnZpY2UuTG9jYWxTdG9yYWdlS2V5LCBKU09OLnN0cmluZ2lmeShjb25maWcpKTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhckxvY2FsQ29uZmlnKCk6IHZvaWQge1xuICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKENvbmZpZ1NlcnZpY2UuTG9jYWxTdG9yYWdlS2V5KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQ8VCA9IGFueT4ocHJvcGVydHlQYXRoOiBzdHJpbmcpOiBUIHwgdW5kZWZpbmVkO1xuICBwdWJsaWMgZ2V0PFQgPSBhbnk+KHByb3BlcnR5UGF0aDogc3RyaW5nLCBkZWZhdWx0VmFsdWU6IE5vSW5mZXJUeXBlPFQ+KTogVDtcbiAgcHVibGljIGdldDxUID0gYW55Pihwcm9wZXJ0eVBhdGg6IHN0cmluZywgZGVmYXVsdFZhbHVlPzogVCk6IFQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBDb25maWdTZXJ2aWNlLkdldChwcm9wZXJ0eVBhdGgsIGRlZmF1bHRWYWx1ZSwgdGhpcy5jb25maWcpO1xuICB9XG5cbiAgcHVibGljIGdldE9yVGhyb3c8VCA9IGFueT4ocHJvcGVydHlQYXRoOiBzdHJpbmcpOiBUO1xuICBwdWJsaWMgZ2V0T3JUaHJvdzxUID0gYW55Pihwcm9wZXJ0eVBhdGg6IHN0cmluZywgZGVmYXVsdFZhbHVlOiBOb0luZmVyVHlwZTxUPik6IFQ7XG4gIHB1YmxpYyBnZXRPclRocm93PFQgPSBhbnk+KHByb3BlcnR5UGF0aDogc3RyaW5nLCBkZWZhdWx0VmFsdWU/OiBUKTogVCB7XG4gICAgY29uc3QgdmFsdWUgPSBDb25maWdTZXJ2aWNlLkdldChwcm9wZXJ0eVBhdGgsIGRlZmF1bHRWYWx1ZSwgdGhpcy5jb25maWcpO1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kIGNvbmZpZyBpbiBwYXRoICcke3Byb3BlcnR5UGF0aH0nYCk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG59XG4iXX0=
@@ -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 { SetObjectValue, deepMerge } 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';
@@ -8,15 +8,20 @@ import { finalize, share } from 'rxjs/operators';
8
8
  const RXAP_CONFIG = new InjectionToken('rxap/config');
9
9
 
10
10
  class ConfigService {
11
- constructor(config = null) {
12
- this.config = ConfigService.Config;
13
- if (config) {
14
- this.config = deepMerge(this.config ?? {}, config);
15
- }
16
- if (!this.config) {
17
- throw new Error('config not available');
18
- }
19
- }
11
+ static { this.Config = null; }
12
+ /**
13
+ * Static default values for the config object.
14
+ * Will be overwritten by an dynamic config file specified in
15
+ * the Urls array.
16
+ */
17
+ static { this.Defaults = {}; }
18
+ /**
19
+ * Any value definition in the Overwrites object will overwrite any
20
+ * value form the Defaults values or dynamic config files
21
+ */
22
+ static { this.Overwrites = {}; }
23
+ static { this.LocalStorageKey = 'rxap/config/local-config'; }
24
+ static { this.Urls = ['config.json']; }
20
25
  static async loadConfig(url, required, schema) {
21
26
  let config;
22
27
  let response;
@@ -165,6 +170,15 @@ class ConfigService {
165
170
  }
166
171
  return configValue;
167
172
  }
173
+ constructor(config = null) {
174
+ this.config = ConfigService.Config;
175
+ if (config) {
176
+ this.config = deepMerge(this.config ?? {}, config);
177
+ }
178
+ if (!this.config) {
179
+ throw new Error('config not available');
180
+ }
181
+ }
168
182
  setLocalConfig(config) {
169
183
  localStorage.setItem(ConfigService.LocalStorageKey, JSON.stringify(config));
170
184
  }
@@ -181,24 +195,10 @@ class ConfigService {
181
195
  }
182
196
  return value;
183
197
  }
198
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.2", ngImport: i0, type: ConfigService, deps: [{ token: RXAP_CONFIG, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
199
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.0.2", ngImport: i0, type: ConfigService, providedIn: 'root' }); }
184
200
  }
185
- ConfigService.Config = null;
186
- /**
187
- * Static default values for the config object.
188
- * Will be overwritten by an dynamic config file specified in
189
- * the Urls array.
190
- */
191
- ConfigService.Defaults = {};
192
- /**
193
- * Any value definition in the Overwrites object will overwrite any
194
- * value form the Defaults values or dynamic config files
195
- */
196
- ConfigService.Overwrites = {};
197
- ConfigService.LocalStorageKey = 'rxap/config/local-config';
198
- ConfigService.Urls = ['config.json'];
199
- ConfigService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.2", ngImport: i0, type: ConfigService, deps: [{ token: RXAP_CONFIG, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
200
- ConfigService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.2.2", ngImport: i0, type: ConfigService, providedIn: 'root' });
201
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.2", ngImport: i0, type: ConfigService, decorators: [{
201
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.2", ngImport: i0, type: ConfigService, decorators: [{
202
202
  type: Injectable,
203
203
  args: [{
204
204
  providedIn: 'root'
@@ -227,10 +227,10 @@ class ConfigLoaderService {
227
227
  this.configLoading.set(url, loading$);
228
228
  return loading$.toPromise();
229
229
  }
230
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.2", ngImport: i0, type: ConfigLoaderService, deps: [{ token: HttpClient }], target: i0.ɵɵFactoryTarget.Injectable }); }
231
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.0.2", ngImport: i0, type: ConfigLoaderService, providedIn: 'root' }); }
230
232
  }
231
- ConfigLoaderService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.2", ngImport: i0, type: ConfigLoaderService, deps: [{ token: HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
232
- ConfigLoaderService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.2.2", ngImport: i0, type: ConfigLoaderService, providedIn: 'root' });
233
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.2", ngImport: i0, type: ConfigLoaderService, decorators: [{
233
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.2", ngImport: i0, type: ConfigLoaderService, decorators: [{
234
234
  type: Injectable,
235
235
  args: [{ providedIn: 'root' }]
236
236
  }], ctorParameters: function () { return [{ type: i1.HttpClient, decorators: [{
@@ -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} 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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"}
package/lib/types.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export declare type NoInferType<T> = [T][T extends any ? 0 : never];
2
- declare type Prev = [
2
+ type Prev = [
3
3
  never,
4
4
  0,
5
5
  1,
@@ -24,11 +24,11 @@ declare type Prev = [
24
24
  20,
25
25
  ...0[]
26
26
  ];
27
- export declare type Join<K, P> = K extends string | number ? P extends string | number ? `${K}${'' extends P ? '' : '.'}${P}` : never : never;
28
- export declare type Paths<T, D extends number = 10> = [D] extends [never] ? never : T extends object ? {
27
+ export type Join<K, P> = K extends string | number ? P extends string | number ? `${K}${'' extends P ? '' : '.'}${P}` : never : never;
28
+ export type Paths<T, D extends number = 10> = [D] extends [never] ? never : T extends object ? {
29
29
  [K in keyof T]-?: K extends string | number ? `${K}` | Join<K, Paths<T[K], Prev[D]>> : never;
30
30
  }[keyof T] : '';
31
- export declare type Leaves<T, D extends number = 10> = [D] extends [never] ? never : T extends object ? {
31
+ export type Leaves<T, D extends number = 10> = [D] extends [never] ? never : T extends object ? {
32
32
  [K in keyof T]-?: Join<K, Leaves<T[K], Prev[D]>>;
33
33
  }[keyof T] : '';
34
34
  export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rxap/config",
3
- "version": "14.1.4",
3
+ "version": "16.0.0-dev.0",
4
4
  "private": false,
5
5
  "author": "Merzough Münker",
6
6
  "homepage": "https://gitlab.com/rxap/packages/libs/config",
@@ -17,11 +17,11 @@
17
17
  },
18
18
  "description": "Simple config file manager for angular applications.",
19
19
  "peerDependencies": {
20
- "@angular-devkit/schematics": "^14.2.3",
21
- "@angular/common": "^14.2.2",
22
- "@angular/core": "^14.2.2",
23
- "@angular/platform-browser-dynamic": "^14.2.2",
24
- "@rxap/utilities": "^14.1.0",
20
+ "@angular-devkit/schematics": "^15.0.3",
21
+ "@angular/common": "^16.0.2",
22
+ "@angular/core": "^16.0.2",
23
+ "@angular/platform-browser-dynamic": "^16.0.2",
24
+ "@rxap/utilities": "^16.0.0-dev.0",
25
25
  "joi": "^17.6.3",
26
26
  "reflect-metadata": "^0.1.13",
27
27
  "rxjs": "^6.6.0"
@@ -42,16 +42,12 @@
42
42
  "save": "dependencies"
43
43
  },
44
44
  "dependencies": {
45
- "@rxap/schematics-ts-morph": "^14.0.0",
46
- "@rxap/schematics-utilities": "^14.0.0",
45
+ "@rxap/schematics-ts-morph": "^16.0.0-dev.0",
46
+ "@rxap/schematics-utilities": "^16.0.0-dev.0",
47
47
  "ts-morph": "^13.0.3",
48
48
  "tslib": "^2.3.1"
49
49
  },
50
- "module": "fesm2015/rxap-config.mjs",
51
- "es2020": "fesm2020/rxap-config.mjs",
52
- "esm2020": "esm2020/rxap-config.mjs",
53
- "fesm2020": "fesm2020/rxap-config.mjs",
54
- "fesm2015": "fesm2015/rxap-config.mjs",
50
+ "module": "fesm2022/rxap-config.mjs",
55
51
  "typings": "index.d.ts",
56
52
  "exports": {
57
53
  "./package.json": {
@@ -59,11 +55,9 @@
59
55
  },
60
56
  ".": {
61
57
  "types": "./index.d.ts",
62
- "esm2020": "./esm2020/rxap-config.mjs",
63
- "es2020": "./fesm2020/rxap-config.mjs",
64
- "es2015": "./fesm2015/rxap-config.mjs",
65
- "node": "./fesm2015/rxap-config.mjs",
66
- "default": "./fesm2020/rxap-config.mjs"
58
+ "esm2022": "./esm2022/rxap-config.mjs",
59
+ "esm": "./esm2022/rxap-config.mjs",
60
+ "default": "./fesm2022/rxap-config.mjs"
67
61
  }
68
62
  },
69
63
  "sideEffects": false
@@ -1,33 +0,0 @@
1
- import { Injectable, Inject } from '@angular/core';
2
- import { HttpClient } from '@angular/common/http';
3
- import { finalize, share } from 'rxjs/operators';
4
- import * as i0 from "@angular/core";
5
- import * as i1 from "@angular/common/http";
6
- export class ConfigLoaderService {
7
- constructor(http) {
8
- this.http = http;
9
- this.configs = new Map();
10
- this.configLoading = new Map();
11
- }
12
- async load$(url) {
13
- if (this.configs.has(url)) {
14
- return this.configs.get(url);
15
- }
16
- if (this.configLoading.has(url)) {
17
- return this.configLoading.get(url).toPromise();
18
- }
19
- const loading$ = this.http.get(url).pipe(finalize(() => this.configLoading.delete(url)), share());
20
- this.configLoading.set(url, loading$);
21
- return loading$.toPromise();
22
- }
23
- }
24
- ConfigLoaderService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.2", ngImport: i0, type: ConfigLoaderService, deps: [{ token: HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
25
- ConfigLoaderService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.2.2", ngImport: i0, type: ConfigLoaderService, providedIn: 'root' });
26
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.2", ngImport: i0, type: ConfigLoaderService, decorators: [{
27
- type: Injectable,
28
- args: [{ providedIn: 'root' }]
29
- }], ctorParameters: function () { return [{ type: i1.HttpClient, decorators: [{
30
- type: Inject,
31
- args: [HttpClient]
32
- }] }]; } });
33
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLWxvYWRlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9jb25maWcvc3JjL2xpYi9jb25maWctbG9hZGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7OztBQUdqRCxNQUFNLE9BQU8sbUJBQW1CO0lBSzlCLFlBRWtCLElBQWdCO1FBQWhCLFNBQUksR0FBSixJQUFJLENBQVk7UUFObEIsWUFBTyxHQUFHLElBQUksR0FBRyxFQUFlLENBQUM7UUFFakMsa0JBQWEsR0FBRyxJQUFJLEdBQUcsRUFBMkIsQ0FBQztJQUtoRSxDQUFDO0lBRUcsS0FBSyxDQUFDLEtBQUssQ0FBVSxHQUFXO1FBQ3JDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDekIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUM5QjtRQUVELElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDL0IsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztTQUNqRDtRQUVELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFJLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FDekMsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQzlDLEtBQUssRUFBRSxDQUNSLENBQUM7UUFFRixJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFFdEMsT0FBTyxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDOUIsQ0FBQzs7Z0hBM0JVLG1CQUFtQixrQkFNcEIsVUFBVTtvSEFOVCxtQkFBbUIsY0FETixNQUFNOzJGQUNuQixtQkFBbUI7a0JBRC9CLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFOzswQkFPN0IsTUFBTTsyQkFBQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgZmluYWxpemUsIHNoYXJlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIENvbmZpZ0xvYWRlclNlcnZpY2Uge1xuICBwdWJsaWMgcmVhZG9ubHkgY29uZmlncyA9IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCk7XG5cbiAgcHVibGljIHJlYWRvbmx5IGNvbmZpZ0xvYWRpbmcgPSBuZXcgTWFwPHN0cmluZywgT2JzZXJ2YWJsZTxhbnk+PigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoSHR0cENsaWVudClcbiAgICBwdWJsaWMgcmVhZG9ubHkgaHR0cDogSHR0cENsaWVudFxuICApIHt9XG5cbiAgcHVibGljIGFzeW5jIGxvYWQkPFQgPSBhbnk+KHVybDogc3RyaW5nKTogUHJvbWlzZTxUPiB7XG4gICAgaWYgKHRoaXMuY29uZmlncy5oYXModXJsKSkge1xuICAgICAgcmV0dXJuIHRoaXMuY29uZmlncy5nZXQodXJsKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb25maWdMb2FkaW5nLmhhcyh1cmwpKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb25maWdMb2FkaW5nLmdldCh1cmwpIS50b1Byb21pc2UoKTtcbiAgICB9XG5cbiAgICBjb25zdCBsb2FkaW5nJCA9IHRoaXMuaHR0cC5nZXQ8VD4odXJsKS5waXBlKFxuICAgICAgZmluYWxpemUoKCkgPT4gdGhpcy5jb25maWdMb2FkaW5nLmRlbGV0ZSh1cmwpKSxcbiAgICAgIHNoYXJlKClcbiAgICApO1xuXG4gICAgdGhpcy5jb25maWdMb2FkaW5nLnNldCh1cmwsIGxvYWRpbmckKTtcblxuICAgIHJldHVybiBsb2FkaW5nJC50b1Byb21pc2UoKTtcbiAgfVxufVxuIl19
@@ -1,207 +0,0 @@
1
- import { Injectable, Optional, Inject } from '@angular/core';
2
- import { deepMerge, SetObjectValue } from '@rxap/utilities';
3
- import { RXAP_CONFIG } from './tokens';
4
- import * as i0 from "@angular/core";
5
- export class ConfigService {
6
- constructor(config = null) {
7
- this.config = ConfigService.Config;
8
- if (config) {
9
- this.config = deepMerge(this.config ?? {}, config);
10
- }
11
- if (!this.config) {
12
- throw new Error('config not available');
13
- }
14
- }
15
- static async loadConfig(url, required, schema) {
16
- let config;
17
- let response;
18
- try {
19
- response = await fetch(url);
20
- }
21
- catch (error) {
22
- const message = `Could not fetch config from '${url}': ${error.message}`;
23
- if (required) {
24
- this.showError(message);
25
- throw new Error(message);
26
- }
27
- else {
28
- console.warn(message);
29
- return null;
30
- }
31
- }
32
- try {
33
- config = await response.json();
34
- }
35
- catch (error) {
36
- const message = `Could not parse config from '${url}' to a json object: ${error.message}`;
37
- if (required) {
38
- this.showError(message);
39
- throw new Error(message);
40
- }
41
- else {
42
- console.warn(message);
43
- return null;
44
- }
45
- }
46
- if (schema) {
47
- try {
48
- config = await schema.validateAsync(config);
49
- }
50
- catch (error) {
51
- const message = `Config from '${url}' is not valid: ${error.message}`;
52
- if (required) {
53
- this.showError(message);
54
- throw new Error(message);
55
- }
56
- else {
57
- console.warn(message);
58
- return null;
59
- }
60
- }
61
- }
62
- return config;
63
- }
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
- static LoadConfigDefaultFromUrlParam(param = 'config') {
123
- const queryString = window.location.search;
124
- const urlParams = new URLSearchParams(queryString);
125
- const configFromParams = {};
126
- for (const configParam of urlParams.getAll('config')) {
127
- try {
128
- const split = configParam.split(';');
129
- if (split.length === 2) {
130
- const keyPath = split[0];
131
- const value = split[1];
132
- SetObjectValue(configFromParams, keyPath, value);
133
- }
134
- }
135
- catch (e) {
136
- console.warn(`Parsing of url config param failed for '${configParam}': ${e.message}`);
137
- }
138
- }
139
- return configFromParams;
140
- }
141
- static Get(path, defaultValue, config = this.Config) {
142
- if (!config) {
143
- throw new Error('config not loaded');
144
- }
145
- let configValue = config;
146
- if (typeof path !== 'string') {
147
- throw new Error('The config property path is not a string');
148
- }
149
- for (const fragment of path.split('.')) {
150
- if (configValue?.hasOwnProperty(fragment)) {
151
- configValue = configValue[fragment];
152
- }
153
- else {
154
- if (defaultValue !== undefined) {
155
- return defaultValue;
156
- }
157
- console.warn(`Config with path '${path}' not found`);
158
- return undefined;
159
- }
160
- }
161
- return configValue;
162
- }
163
- setLocalConfig(config) {
164
- localStorage.setItem(ConfigService.LocalStorageKey, JSON.stringify(config));
165
- }
166
- clearLocalConfig() {
167
- localStorage.removeItem(ConfigService.LocalStorageKey);
168
- }
169
- get(propertyPath, defaultValue) {
170
- return ConfigService.Get(propertyPath, defaultValue, this.config);
171
- }
172
- getOrThrow(propertyPath, defaultValue) {
173
- const value = ConfigService.Get(propertyPath, defaultValue, this.config);
174
- if (value === undefined) {
175
- throw new Error(`Could not find config in path '${propertyPath}'`);
176
- }
177
- return value;
178
- }
179
- }
180
- ConfigService.Config = null;
181
- /**
182
- * Static default values for the config object.
183
- * Will be overwritten by an dynamic config file specified in
184
- * the Urls array.
185
- */
186
- ConfigService.Defaults = {};
187
- /**
188
- * Any value definition in the Overwrites object will overwrite any
189
- * value form the Defaults values or dynamic config files
190
- */
191
- ConfigService.Overwrites = {};
192
- ConfigService.LocalStorageKey = 'rxap/config/local-config';
193
- ConfigService.Urls = ['config.json'];
194
- ConfigService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.2", ngImport: i0, type: ConfigService, deps: [{ token: RXAP_CONFIG, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
195
- ConfigService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.2.2", ngImport: i0, type: ConfigService, providedIn: 'root' });
196
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.2", ngImport: i0, type: ConfigService, decorators: [{
197
- type: Injectable,
198
- args: [{
199
- providedIn: 'root'
200
- }]
201
- }], ctorParameters: function () { return [{ type: undefined, decorators: [{
202
- type: Optional
203
- }, {
204
- type: Inject,
205
- args: [RXAP_CONFIG]
206
- }] }]; } });
207
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2NvbmZpZy9zcmMvbGliL2NvbmZpZy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxVQUFVLEVBQ1YsUUFBUSxFQUNSLE1BQU0sRUFDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsU0FBUyxFQUNULGNBQWMsRUFDZixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxVQUFVLENBQUM7O0FBYXZDLE1BQU0sT0FBTyxhQUFhO0lBdU14QixZQUE2QyxTQUFxQixJQUFJO1FBQ3BFLElBQUksQ0FBQyxNQUFNLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQztRQUNuQyxJQUFJLE1BQU0sRUFBRTtZQUNWLElBQUksQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1NBQ3BEO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDaEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1NBQ3pDO0lBQ0gsQ0FBQztJQTFMTyxNQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBVSxHQUFXLEVBQUUsUUFBa0IsRUFBRSxNQUFrQjtRQUUxRixJQUFJLE1BQVcsQ0FBQztRQUNoQixJQUFJLFFBQWEsQ0FBQztRQUVsQixJQUFJO1lBQ0YsUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1NBQzVCO1FBQUMsT0FBTyxLQUFVLEVBQUU7WUFDbkIsTUFBTSxPQUFPLEdBQUcsZ0NBQWdDLEdBQUcsTUFBTSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDekUsSUFBSSxRQUFRLEVBQUU7Z0JBQ1osSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMs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VUFBVSxDQUFVLFlBQW9CLEVBQUUsWUFBZ0I7UUFDL0QsTUFBTSxLQUFLLEdBQUcsYUFBYSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsWUFBWSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN6RSxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUU7WUFDdkIsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQ0FBa0MsWUFBWSxHQUFHLENBQUMsQ0FBQztTQUNwRTtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQzs7QUFyT2Esb0JBQU0sR0FBUSxJQUFLLENBQUE7QUFFakM7Ozs7R0FJRztBQUNXLHNCQUFRLEdBQVEsRUFBRyxDQUFBO0FBRWpDOzs7R0FHRztBQUNXLHdCQUFVLEdBQVEsRUFBRyxDQUFBO0FBRXJCLDZCQUFlLEdBQUcsMEJBQTJCLENBQUE7QUFFN0Msa0JBQUksR0FBRyxDQUFFLGFBQWEsQ0FBRyxDQUFBOzBHQW5CNUIsYUFBYSxrQkF1TVEsV0FBVzs4R0F2TWhDLGFBQWEsY0FGWixNQUFNOzJGQUVQLGFBQWE7a0JBSHpCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25COzswQkF3TWMsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgSW5qZWN0YWJsZSxcbiAgT3B0aW9uYWwsXG4gIEluamVjdFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIGRlZXBNZXJnZSxcbiAgU2V0T2JqZWN0VmFsdWVcbn0gZnJvbSAnQHJ4YXAvdXRpbGl0aWVzJztcbmltcG9ydCB7IFJYQVBfQ09ORklHIH0gZnJvbSAnLi90b2tlbnMnO1xuaW1wb3J0IHsgTm9JbmZlclR5cGUgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IEFueVNjaGVtYSB9IGZyb20gJ2pvaSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29uZmlnTG9hZE9wdGlvbnMge1xuICBmcm9tVXJsUGFyYW0/OiBzdHJpbmcgfCBib29sZWFuO1xuICBmcm9tTG9jYWxTdG9yYWdlPzogYm9vbGVhbjtcbiAgc2NoZW1hPzogQW55U2NoZW1hO1xufVxuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBDb25maWdTZXJ2aWNlPENvbmZpZyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG5cbiAgcHVibGljIHN0YXRpYyBDb25maWc6IGFueSA9IG51bGw7XG5cbiAgLyoqXG4gICAqIFN0YXRpYyBkZWZhdWx0IHZhbHVlcyBmb3IgdGhlIGNvbmZpZyBvYmplY3QuXG4gICAqIFdpbGwgYmUgb3ZlcndyaXR0ZW4gYnkgYW4gZHluYW1pYyBjb25maWcgZmlsZSBzcGVjaWZpZWQgaW5cbiAgICogdGhlIFVybHMgYXJyYXkuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIERlZmF1bHRzOiBhbnkgPSB7fTtcblxuICAvKipcbiAgICogQW55IHZhbHVlIGRlZmluaXRpb24gaW4gdGhlIE92ZXJ3cml0ZXMgb2JqZWN0IHdpbGwgb3ZlcndyaXRlIGFueVxuICAgKiB2YWx1ZSBmb3JtIHRoZSBEZWZhdWx0cyB2YWx1ZXMgb3IgZHluYW1pYyBjb25maWcgZmlsZXNcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgT3ZlcndyaXRlczogYW55ID0ge307XG5cbiAgcHVibGljIHN0YXRpYyBMb2NhbFN0b3JhZ2VLZXkgPSAncnhhcC9jb25maWcvbG9jYWwtY29uZmlnJztcblxuICBwdWJsaWMgc3RhdGljIFVybHMgPSBbICdjb25maWcuanNvbicgXTtcblxuICBwcml2YXRlIHN0YXRpYyBhc3luYyBsb2FkQ29uZmlnPFQgPSBhbnk+KHVybDogc3RyaW5nLCByZXF1aXJlZD86IGJvb2xlYW4sIHNjaGVtYT86IEFueVNjaGVtYSk6IFByb21pc2U8VCB8IG51bGw+IHtcblxuICAgIGxldCBjb25maWc6IGFueTtcbiAgICBsZXQgcmVzcG9uc2U6IGFueTtcblxuICAgIHRyeSB7XG4gICAgICByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybClcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gYENvdWxkIG5vdCBmZXRjaCBjb25maWcgZnJvbSAnJHt1cmx9JzogJHtlcnJvci5tZXNzYWdlfWA7XG4gICAgICBpZiAocmVxdWlyZWQpIHtcbiAgICAgICAgdGhpcy5zaG93RXJyb3IobWVzc2FnZSk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybihtZXNzYWdlKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbmZpZyA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKVxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBgQ291bGQgbm90IHBhcnNlIGNvbmZpZyBmcm9tICcke3VybH0nIHRvIGEganNvbiBvYmplY3Q6ICR7ZXJyb3IubWVzc2FnZX1gO1xuICAgICAgaWYgKHJlcXVpcmVkKSB7XG4gICAgICAgIHRoaXMuc2hvd0Vycm9yKG1lc3NhZ2UpO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4obWVzc2FnZSk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzY2hlbWEpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbmZpZyA9IGF3YWl0IHNjaGVtYS52YWxpZGF0ZUFzeW5jKGNvbmZpZyk7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBgQ29uZmlnIGZyb20gJyR7dXJsfScgaXMgbm90IHZhbGlkOiAke2Vycm9yLm1lc3NhZ2V9YDtcbiAgICAgICAgaWYgKHJlcXVpcmVkKSB7XG4gICAgICAgICAgdGhpcy5zaG93RXJyb3IobWVzc2FnZSk7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUud2FybihtZXNzYWdlKTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjb25maWc7XG5cbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHNob3dFcnJvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBjb25zdCBoYXNVbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyeGFwLWNvbmZpZy1lcnJvcicpICE9PSBudWxsO1xuICAgIGNvbnN0IHVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3J4YXAtY29uZmlnLWVycm9yJykgPz8gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndWwnKTtcbiAgICB1bC5pZCA9ICdyeGFwLWNvbmZpZy1lcnJvcic7XG4gICAgdWwuc3R5bGUucG9zaXRpb24gPSAnZml4ZWQnO1xuICAgIHVsLnN0eWxlLmJvdHRvbSA9ICcxNnB4JztcbiAgICB1bC5zdHlsZS5yaWdodCA9ICcxNnB4JztcbiAgICB1bC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAnd2hpdGUnO1xuICAgIHVsLnN0eWxlLnBhZGRpbmcgPSAnMzJweCc7XG4gICAgdWwuc3R5bGUuekluZGV4ID0gJzk5OTk5OTk5JztcbiAgICB1bC5zdHlsZS5jb2xvciA9ICdibGFjayc7XG4gICAgY29uc3QgbGkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaScpO1xuICAgIGxpLmlubmVyVGV4dCA9IG1lc3NhZ2U7XG4gICAgdWwuYXBwZW5kQ2hpbGQobGkpO1xuICAgIGlmICghaGFzVWwpIHtcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodWwpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgYXN5bmMgU2lkZUxvYWQodXJsOiBzdHJpbmcsIHByb3BlcnR5UGF0aDogc3RyaW5nLCByZXF1aXJlZD86IGJvb2xlYW4sIHNjaGVtYT86IEFueVNjaGVtYSk6IFByb21pc2U8dm9pZD4ge1xuXG4gICAgaWYgKCF0aGlzLkNvbmZpZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb25maWcgc2lkZSBsb2FkIGlzIG9ubHkgcG9zc2libGUgYWZ0ZXIgdGhlIGluaXRpYWwgY29uZmlnIGxvYWQuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgY29uZmlnID0gYXdhaXQgdGhpcy5sb2FkQ29uZmlnKHVybCwgcmVxdWlyZWQsIHNjaGVtYSk7XG5cbiAgICBTZXRPYmplY3RWYWx1ZSh0aGlzLkNvbmZpZywgcHJvcGVydHlQYXRoLCBjb25maWcpO1xuXG4gICAgY29uc29sZS5kZWJ1ZyhgU2lkZSBsb2FkZWQgY29uZmlnIGZvciAnJHtwcm9wZXJ0eVBhdGh9JyBzdWNjZXNzZnVsYCwgdGhpcy5Db25maWcpO1xuXG4gIH1cblxuICAvKipcbiAgICogVXNlZCB0byBsb2FkIHRoZSBhcHAgY29uZmlnIGZyb20gYSByZW1vdGUgcmVzb3VyY2UuXG4gICAqXG4gICAqIFByb21pc2UuYWxsKFsgQ29uZmlnU2VydmljZS5Mb2FkKCkgXSlcbiAgICogLnRoZW4oKCkgPT4gcGxhdGZvcm1Ccm93c2VyRHluYW1pYygpLmJvb3RzdHJhcE1vZHVsZShBcHBNb2R1bGUpKVxuICAgKiAuY2F0Y2goZXJyID0+IGNvbnNvbGUuZXJyb3IoZXJyKSlcbiAgICpcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgYXN5bmMgTG9hZChvcHRpb25zPzogQ29uZmlnTG9hZE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgY29uZmlnID0gdGhpcy5EZWZhdWx0cztcbiAgICBmb3IgKGNvbnN0IHVybCBvZiBDb25maWdTZXJ2aWNlLlVybHMpIHtcbiAgICAgIGNvbmZpZyA9IGF3YWl0IHRoaXMubG9hZENvbmZpZyh1cmwsIHRydWUsIG9wdGlvbnM/LnNjaGVtYSk7XG4gICAgfVxuXG4gICAgY29uZmlnID0gZGVlcE1lcmdlKGNvbmZpZywgdGhpcy5PdmVyd3JpdGVzKTtcblxuICAgIGlmIChvcHRpb25zPy5mcm9tTG9jYWxTdG9yYWdlICE9PSBmYWxzZSkge1xuXG4gICAgICBjb25zdCBsb2NhbENvbmZpZyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKENvbmZpZ1NlcnZpY2UuTG9jYWxTdG9yYWdlS2V5KTtcblxuICAgICAgaWYgKGxvY2FsQ29uZmlnKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uZmlnID0gZGVlcE1lcmdlKGNvbmZpZywgSlNPTi5wYXJzZShsb2NhbENvbmZpZykpO1xuICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdsb2NhbCBjb25maWcgY291bGQgbm90IGJlIHBhcnNlZCcpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucz8uZnJvbVVybFBhcmFtKSB7XG4gICAgICBjb25zdCBwYXJhbSA9IHR5cGVvZiBvcHRpb25zLmZyb21VcmxQYXJhbSA9PT0gJ3N0cmluZycgPyBvcHRpb25zLmZyb21VcmxQYXJhbSA6ICdjb25maWcnO1xuICAgICAgY29uZmlnICAgICAgPSBkZWVwTWVyZ2UoY29uZmlnLCB0aGlzLkxvYWRDb25maWdEZWZhdWx0RnJvbVVybFBhcmFtKHBhcmFtKSk7XG4gICAgfVxuXG4gICAgY29uc29sZS5kZWJ1ZygnYXBwIGNvbmZpZycsIGNvbmZpZyk7XG5cbiAgICB0aGlzLkNvbmZpZyA9IGNvbmZpZztcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIExvYWRDb25maWdEZWZhdWx0RnJvbVVybFBhcmFtKHBhcmFtOiBzdHJpbmcgPSAnY29uZmlnJykge1xuXG4gICAgY29uc3QgcXVlcnlTdHJpbmcgPSB3aW5kb3cubG9jYXRpb24uc2VhcmNoO1xuICAgIGNvbnN0IHVybFBhcmFtcyAgID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhxdWVyeVN0cmluZyk7XG5cbiAgICBjb25zdCBjb25maWdGcm9tUGFyYW1zID0ge307XG5cbiAgICBmb3IgKGNvbnN0IGNvbmZpZ1BhcmFtIG9mIHVybFBhcmFtcy5nZXRBbGwoJ2NvbmZpZycpKSB7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHNwbGl0ID0gY29uZmlnUGFyYW0uc3BsaXQoJzsnKTtcbiAgICAgICAgaWYgKHNwbGl0Lmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgIGNvbnN0IGtleVBhdGggPSBzcGxpdFsgMCBdO1xuICAgICAgICAgIGNvbnN0IHZhbHVlICAgPSBzcGxpdFsgMSBdO1xuICAgICAgICAgIFNldE9iamVjdFZhbHVlKGNvbmZpZ0Zyb21QYXJhbXMsIGtleVBhdGgsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgUGFyc2luZyBvZiB1cmwgY29uZmlnIHBhcmFtIGZhaWxlZCBmb3IgJyR7Y29uZmlnUGFyYW19JzogJHtlLm1lc3NhZ2V9YCk7XG4gICAgICB9XG5cbiAgICB9XG5cbiAgICByZXR1cm4gY29uZmlnRnJvbVBhcmFtcztcblxuICB9XG5cbiAgcHVibGljIHN0YXRpYyBHZXQ8VCA9IGFueSwgSyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBSZWNvcmQ8c3RyaW5nLCBhbnk+PihwYXRoOiBzdHJpbmcsIGRlZmF1bHRWYWx1ZTogVCB8IHVuZGVmaW5lZCwgY29uZmlnOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogVFxuICBwdWJsaWMgc3RhdGljIEdldDxUID0gYW55LCBLIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IFJlY29yZDxzdHJpbmcsIGFueT4+KFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBkZWZhdWx0VmFsdWU6IE5vSW5mZXJUeXBlPFQ+LFxuICAgIGNvbmZpZzogUmVjb3JkPHN0cmluZywgYW55PiA9IHRoaXMuQ29uZmlnXG4gICk6IFQge1xuICAgIGlmICghY29uZmlnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvbmZpZyBub3QgbG9hZGVkJyk7XG4gICAgfVxuICAgIGxldCBjb25maWdWYWx1ZTogYW55ID0gY29uZmlnO1xuICAgIGlmICh0eXBlb2YgcGF0aCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIGNvbmZpZyBwcm9wZXJ0eSBwYXRoIGlzIG5vdCBhIHN0cmluZycpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGZyYWdtZW50IG9mIChwYXRoIGFzIGFueSkuc3BsaXQoJy4nKSkge1xuICAgICAgaWYgKGNvbmZpZ1ZhbHVlPy5oYXNPd25Qcm9wZXJ0eShmcmFnbWVudCkpIHtcbiAgICAgICAgY29uZmlnVmFsdWUgPSBjb25maWdWYWx1ZVsgZnJhZ21lbnQgXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChkZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS53YXJuKGBDb25maWcgd2l0aCBwYXRoICcke3BhdGh9JyBub3QgZm91bmRgKTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZCBhcyBhbnk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb25maWdWYWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyByZWFkb25seSBjb25maWchOiBDb25maWc7XG5cbiAgY29uc3RydWN0b3IoQE9wdGlvbmFsKCkgQEluamVjdChSWEFQX0NPTkZJRykgY29uZmlnOiBhbnkgfCBudWxsID0gbnVsbCkge1xuICAgIHRoaXMuY29uZmlnID0gQ29uZmlnU2VydmljZS5Db25maWc7XG4gICAgaWYgKGNvbmZpZykge1xuICAgICAgdGhpcy5jb25maWcgPSBkZWVwTWVyZ2UodGhpcy5jb25maWcgPz8ge30sIGNvbmZpZyk7XG4gICAgfVxuICAgIGlmICghdGhpcy5jb25maWcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY29uZmlnIG5vdCBhdmFpbGFibGUnKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2V0TG9jYWxDb25maWcoY29uZmlnOiBDb25maWcpOiB2b2lkIHtcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShDb25maWdTZXJ2aWNlLkxvY2FsU3RvcmFnZUtleSwgSlNPTi5zdHJpbmdpZnkoY29uZmlnKSk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXJMb2NhbENvbmZpZygpOiB2b2lkIHtcbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShDb25maWdTZXJ2aWNlLkxvY2FsU3RvcmFnZUtleSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0PFQgPSBhbnk+KHByb3BlcnR5UGF0aDogc3RyaW5nKTogVCB8IHVuZGVmaW5lZDtcbiAgcHVibGljIGdldDxUID0gYW55Pihwcm9wZXJ0eVBhdGg6IHN0cmluZywgZGVmYXVsdFZhbHVlOiBOb0luZmVyVHlwZTxUPik6IFQ7XG4gIHB1YmxpYyBnZXQ8VCA9IGFueT4ocHJvcGVydHlQYXRoOiBzdHJpbmcsIGRlZmF1bHRWYWx1ZT86IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gQ29uZmlnU2VydmljZS5HZXQocHJvcGVydHlQYXRoLCBkZWZhdWx0VmFsdWUsIHRoaXMuY29uZmlnKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRPclRocm93PFQgPSBhbnk+KHByb3BlcnR5UGF0aDogc3RyaW5nKTogVDtcbiAgcHVibGljIGdldE9yVGhyb3c8VCA9IGFueT4ocHJvcGVydHlQYXRoOiBzdHJpbmcsIGRlZmF1bHRWYWx1ZTogTm9JbmZlclR5cGU8VD4pOiBUO1xuICBwdWJsaWMgZ2V0T3JUaHJvdzxUID0gYW55Pihwcm9wZXJ0eVBhdGg6IHN0cmluZywgZGVmYXVsdFZhbHVlPzogVCk6IFQge1xuICAgIGNvbnN0IHZhbHVlID0gQ29uZmlnU2VydmljZS5HZXQocHJvcGVydHlQYXRoLCBkZWZhdWx0VmFsdWUsIHRoaXMuY29uZmlnKTtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZmluZCBjb25maWcgaW4gcGF0aCAnJHtwcm9wZXJ0eVBhdGh9J2ApO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxufVxuIl19
@@ -1,261 +0,0 @@
1
- import { __awaiter } from 'tslib';
2
- import * as i0 from '@angular/core';
3
- import { InjectionToken, Injectable, Optional, Inject } from '@angular/core';
4
- import { deepMerge, SetObjectValue } from '@rxap/utilities';
5
- import * as i1 from '@angular/common/http';
6
- import { HttpClient } from '@angular/common/http';
7
- import { finalize, share } from 'rxjs/operators';
8
-
9
- const RXAP_CONFIG = new InjectionToken('rxap/config');
10
-
11
- class ConfigService {
12
- constructor(config = null) {
13
- var _a;
14
- this.config = ConfigService.Config;
15
- if (config) {
16
- this.config = deepMerge((_a = this.config) !== null && _a !== void 0 ? _a : {}, config);
17
- }
18
- if (!this.config) {
19
- throw new Error('config not available');
20
- }
21
- }
22
- static loadConfig(url, required, schema) {
23
- return __awaiter(this, void 0, void 0, function* () {
24
- let config;
25
- let response;
26
- try {
27
- response = yield fetch(url);
28
- }
29
- catch (error) {
30
- const message = `Could not fetch config from '${url}': ${error.message}`;
31
- if (required) {
32
- this.showError(message);
33
- throw new Error(message);
34
- }
35
- else {
36
- console.warn(message);
37
- return null;
38
- }
39
- }
40
- try {
41
- config = yield response.json();
42
- }
43
- catch (error) {
44
- const message = `Could not parse config from '${url}' to a json object: ${error.message}`;
45
- if (required) {
46
- this.showError(message);
47
- throw new Error(message);
48
- }
49
- else {
50
- console.warn(message);
51
- return null;
52
- }
53
- }
54
- if (schema) {
55
- try {
56
- config = yield schema.validateAsync(config);
57
- }
58
- catch (error) {
59
- const message = `Config from '${url}' is not valid: ${error.message}`;
60
- if (required) {
61
- this.showError(message);
62
- throw new Error(message);
63
- }
64
- else {
65
- console.warn(message);
66
- return null;
67
- }
68
- }
69
- }
70
- return config;
71
- });
72
- }
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
- static LoadConfigDefaultFromUrlParam(param = 'config') {
137
- const queryString = window.location.search;
138
- const urlParams = new URLSearchParams(queryString);
139
- const configFromParams = {};
140
- for (const configParam of urlParams.getAll('config')) {
141
- try {
142
- const split = configParam.split(';');
143
- if (split.length === 2) {
144
- const keyPath = split[0];
145
- const value = split[1];
146
- SetObjectValue(configFromParams, keyPath, value);
147
- }
148
- }
149
- catch (e) {
150
- console.warn(`Parsing of url config param failed for '${configParam}': ${e.message}`);
151
- }
152
- }
153
- return configFromParams;
154
- }
155
- static Get(path, defaultValue, config = this.Config) {
156
- if (!config) {
157
- throw new Error('config not loaded');
158
- }
159
- let configValue = config;
160
- if (typeof path !== 'string') {
161
- throw new Error('The config property path is not a string');
162
- }
163
- for (const fragment of path.split('.')) {
164
- if (configValue === null || configValue === void 0 ? void 0 : configValue.hasOwnProperty(fragment)) {
165
- configValue = configValue[fragment];
166
- }
167
- else {
168
- if (defaultValue !== undefined) {
169
- return defaultValue;
170
- }
171
- console.warn(`Config with path '${path}' not found`);
172
- return undefined;
173
- }
174
- }
175
- return configValue;
176
- }
177
- setLocalConfig(config) {
178
- localStorage.setItem(ConfigService.LocalStorageKey, JSON.stringify(config));
179
- }
180
- clearLocalConfig() {
181
- localStorage.removeItem(ConfigService.LocalStorageKey);
182
- }
183
- get(propertyPath, defaultValue) {
184
- return ConfigService.Get(propertyPath, defaultValue, this.config);
185
- }
186
- getOrThrow(propertyPath, defaultValue) {
187
- const value = ConfigService.Get(propertyPath, defaultValue, this.config);
188
- if (value === undefined) {
189
- throw new Error(`Could not find config in path '${propertyPath}'`);
190
- }
191
- return value;
192
- }
193
- }
194
- ConfigService.Config = null;
195
- /**
196
- * Static default values for the config object.
197
- * Will be overwritten by an dynamic config file specified in
198
- * the Urls array.
199
- */
200
- ConfigService.Defaults = {};
201
- /**
202
- * Any value definition in the Overwrites object will overwrite any
203
- * value form the Defaults values or dynamic config files
204
- */
205
- ConfigService.Overwrites = {};
206
- ConfigService.LocalStorageKey = 'rxap/config/local-config';
207
- ConfigService.Urls = ['config.json'];
208
- ConfigService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.2", ngImport: i0, type: ConfigService, deps: [{ token: RXAP_CONFIG, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
209
- ConfigService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.2.2", ngImport: i0, type: ConfigService, providedIn: 'root' });
210
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.2", ngImport: i0, type: ConfigService, decorators: [{
211
- type: Injectable,
212
- args: [{
213
- providedIn: 'root'
214
- }]
215
- }], ctorParameters: function () {
216
- return [{ type: undefined, decorators: [{
217
- type: Optional
218
- }, {
219
- type: Inject,
220
- args: [RXAP_CONFIG]
221
- }] }];
222
- } });
223
-
224
- class ConfigLoaderService {
225
- constructor(http) {
226
- this.http = http;
227
- this.configs = new Map();
228
- this.configLoading = new Map();
229
- }
230
- load$(url) {
231
- return __awaiter(this, void 0, void 0, function* () {
232
- if (this.configs.has(url)) {
233
- return this.configs.get(url);
234
- }
235
- if (this.configLoading.has(url)) {
236
- return this.configLoading.get(url).toPromise();
237
- }
238
- const loading$ = this.http.get(url).pipe(finalize(() => this.configLoading.delete(url)), share());
239
- this.configLoading.set(url, loading$);
240
- return loading$.toPromise();
241
- });
242
- }
243
- }
244
- ConfigLoaderService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.2", ngImport: i0, type: ConfigLoaderService, deps: [{ token: HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
245
- ConfigLoaderService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.2.2", ngImport: i0, type: ConfigLoaderService, providedIn: 'root' });
246
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.2", ngImport: i0, type: ConfigLoaderService, decorators: [{
247
- type: Injectable,
248
- args: [{ providedIn: 'root' }]
249
- }], ctorParameters: function () {
250
- return [{ type: i1.HttpClient, decorators: [{
251
- type: Inject,
252
- args: [HttpClient]
253
- }] }];
254
- } });
255
-
256
- /**
257
- * Generated bundle index. Do not edit.
258
- */
259
-
260
- export { ConfigLoaderService, ConfigService, RXAP_CONFIG };
261
- //# sourceMappingURL=rxap-config.mjs.map
@@ -1 +0,0 @@
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":";;;;;;;;MAEa,WAAW,GAAG,IAAI,cAAc,CAAC,aAAa;;MCoB9C,aAAa,CAAA;IAuMxB,WAA6C,CAAA,SAAqB,IAAI,EAAA;;AACpE,QAAA,IAAI,CAAC,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC;AACnC,QAAA,IAAI,MAAM,EAAE;AACV,YAAA,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,CAAA,EAAA,GAAA,IAAI,CAAC,MAAM,MAAI,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAAA,EAAE,EAAE,MAAM,CAAC,CAAC;AACpD,SAAA;AACD,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;AAChB,YAAA,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;AACzC,SAAA;KACF;AA1LO,IAAA,OAAa,UAAU,CAAU,GAAW,EAAE,QAAkB,EAAE,MAAkB,EAAA;;AAE1F,YAAA,IAAI,MAAW,CAAC;AAChB,YAAA,IAAI,QAAa,CAAC;YAElB,IAAI;AACF,gBAAA,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAA;AAC5B,aAAA;AAAC,YAAA,OAAO,KAAU,EAAE;gBACnB,MAAM,OAAO,GAAG,CAAgC,6BAAA,EAAA,GAAG,MAAM,KAAK,CAAC,OAAO,CAAA,CAAE,CAAC;AACzE,gBAAA,IAAI,QAAQ,EAAE;AACZ,oBAAA,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;AACxB,oBAAA,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;AAC1B,iBAAA;AAAM,qBAAA;AACL,oBAAA,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACtB,oBAAA,OAAO,IAAI,CAAC;AACb,iBAAA;AACF,aAAA;YAED,IAAI;AACF,gBAAA,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;AAC/B,aAAA;AAAC,YAAA,OAAO,KAAU,EAAE;gBACnB,MAAM,OAAO,GAAG,CAAgC,6BAAA,EAAA,GAAG,uBAAuB,KAAK,CAAC,OAAO,CAAA,CAAE,CAAC;AAC1F,gBAAA,IAAI,QAAQ,EAAE;AACZ,oBAAA,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;AACxB,oBAAA,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;AAC1B,iBAAA;AAAM,qBAAA;AACL,oBAAA,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACtB,oBAAA,OAAO,IAAI,CAAC;AACb,iBAAA;AACF,aAAA;AAED,YAAA,IAAI,MAAM,EAAE;gBACV,IAAI;oBACF,MAAM,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;AAC7C,iBAAA;AAAC,gBAAA,OAAO,KAAU,EAAE;oBACnB,MAAM,OAAO,GAAG,CAAgB,aAAA,EAAA,GAAG,mBAAmB,KAAK,CAAC,OAAO,CAAA,CAAE,CAAC;AACtE,oBAAA,IAAI,QAAQ,EAAE;AACZ,wBAAA,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;AACxB,wBAAA,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;AAC1B,qBAAA;AAAM,yBAAA;AACL,wBAAA,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACtB,wBAAA,OAAO,IAAI,CAAC;AACb,qBAAA;AACF,iBAAA;AACF,aAAA;AAED,YAAA,OAAO,MAAM,CAAC;SAEf,CAAA,CAAA;AAAA,KAAA;IAEO,OAAO,SAAS,CAAC,OAAe,EAAA;;QACtC,MAAM,KAAK,GAAG,QAAQ,CAAC,cAAc,CAAC,mBAAmB,CAAC,KAAK,IAAI,CAAC;AACpE,QAAA,MAAM,EAAE,GAAG,CAAA,EAAA,GAAA,QAAQ,CAAC,cAAc,CAAC,mBAAmB,CAAC,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAAI,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;AACxF,QAAA,EAAE,CAAC,EAAE,GAAG,mBAAmB,CAAC;AAC5B,QAAA,EAAE,CAAC,KAAK,CAAC,QAAQ,GAAG,OAAO,CAAC;AAC5B,QAAA,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;AACzB,QAAA,EAAE,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC;AACxB,QAAA,EAAE,CAAC,KAAK,CAAC,eAAe,GAAG,OAAO,CAAC;AACnC,QAAA,EAAE,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AAC1B,QAAA,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,UAAU,CAAC;AAC7B,QAAA,EAAE,CAAC,KAAK,CAAC,KAAK,GAAG,OAAO,CAAC;QACzB,MAAM,EAAE,GAAG,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;AACxC,QAAA,EAAE,CAAC,SAAS,GAAG,OAAO,CAAC;AACvB,QAAA,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QACnB,IAAI,CAAC,KAAK,EAAE;AACV,YAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;AAC/B,SAAA;KACF;IAEM,OAAa,QAAQ,CAAC,GAAW,EAAE,YAAoB,EAAE,QAAkB,EAAE,MAAkB,EAAA;;AAEpG,YAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;AAChB,gBAAA,MAAM,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAC;AACrF,aAAA;AAED,YAAA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;YAE5D,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC;YAElD,OAAO,CAAC,KAAK,CAAC,CAA2B,wBAAA,EAAA,YAAY,CAAc,YAAA,CAAA,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;SAEnF,CAAA,CAAA;AAAA,KAAA;AAED;;;;;;;AAOG;IACI,OAAa,IAAI,CAAC,OAA2B,EAAA;;AAClD,YAAA,IAAI,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC;AAC3B,YAAA,KAAK,MAAM,GAAG,IAAI,aAAa,CAAC,IAAI,EAAE;AACpC,gBAAA,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,aAAP,OAAO,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAP,OAAO,CAAE,MAAM,CAAC,CAAC;AAC5D,aAAA;YAED,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YAE5C,IAAI,CAAA,OAAO,KAAA,IAAA,IAAP,OAAO,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAP,OAAO,CAAE,gBAAgB,MAAK,KAAK,EAAE;gBAEvC,MAAM,WAAW,GAAG,YAAY,CAAC,OAAO,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC;AAExE,gBAAA,IAAI,WAAW,EAAE;oBACf,IAAI;AACF,wBAAA,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;AACrD,qBAAA;AAAC,oBAAA,OAAO,CAAM,EAAE;AACf,wBAAA,OAAO,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;AACnD,qBAAA;AACF,iBAAA;AAEF,aAAA;AAED,YAAA,IAAI,OAAO,KAAP,IAAA,IAAA,OAAO,uBAAP,OAAO,CAAE,YAAY,EAAE;AACzB,gBAAA,MAAM,KAAK,GAAG,OAAO,OAAO,CAAC,YAAY,KAAK,QAAQ,GAAG,OAAO,CAAC,YAAY,GAAG,QAAQ,CAAC;AACzF,gBAAA,MAAM,GAAQ,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,6BAA6B,CAAC,KAAK,CAAC,CAAC,CAAC;AAC5E,aAAA;AAED,YAAA,OAAO,CAAC,KAAK,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;AAEpC,YAAA,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;SACtB,CAAA,CAAA;AAAA,KAAA;AAEO,IAAA,OAAO,6BAA6B,CAAC,KAAA,GAAgB,QAAQ,EAAA;AAEnE,QAAA,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;AAC3C,QAAA,MAAM,SAAS,GAAK,IAAI,eAAe,CAAC,WAAW,CAAC,CAAC;QAErD,MAAM,gBAAgB,GAAG,EAAE,CAAC;QAE5B,KAAK,MAAM,WAAW,IAAI,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE;YAEpD,IAAI;gBACF,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AACrC,gBAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;AACtB,oBAAA,MAAM,OAAO,GAAG,KAAK,CAAE,CAAC,CAAE,CAAC;AAC3B,oBAAA,MAAM,KAAK,GAAK,KAAK,CAAE,CAAC,CAAE,CAAC;AAC3B,oBAAA,cAAc,CAAC,gBAAgB,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;AAClD,iBAAA;AACF,aAAA;AAAC,YAAA,OAAO,CAAM,EAAE;gBACf,OAAO,CAAC,IAAI,CAAC,CAA2C,wCAAA,EAAA,WAAW,CAAM,GAAA,EAAA,CAAC,CAAC,OAAO,CAAE,CAAA,CAAC,CAAC;AACvF,aAAA;AAEF,SAAA;AAED,QAAA,OAAO,gBAAgB,CAAC;KAEzB;IAGM,OAAO,GAAG,CACf,IAAY,EACZ,YAA4B,EAC5B,MAAA,GAA8B,IAAI,CAAC,MAAM,EAAA;QAEzC,IAAI,CAAC,MAAM,EAAE;AACX,YAAA,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;AACtC,SAAA;QACD,IAAI,WAAW,GAAQ,MAAM,CAAC;AAC9B,QAAA,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;AAC5B,YAAA,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;AAC7D,SAAA;QACD,KAAK,MAAM,QAAQ,IAAK,IAAY,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;YAC/C,IAAI,WAAW,KAAX,IAAA,IAAA,WAAW,KAAX,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,WAAW,CAAE,cAAc,CAAC,QAAQ,CAAC,EAAE;AACzC,gBAAA,WAAW,GAAG,WAAW,CAAE,QAAQ,CAAE,CAAC;AACvC,aAAA;AAAM,iBAAA;gBACL,IAAI,YAAY,KAAK,SAAS,EAAE;AAC9B,oBAAA,OAAO,YAAY,CAAC;AACrB,iBAAA;AACD,gBAAA,OAAO,CAAC,IAAI,CAAC,qBAAqB,IAAI,CAAA,WAAA,CAAa,CAAC,CAAC;AACrD,gBAAA,OAAO,SAAgB,CAAC;AACzB,aAAA;AACF,SAAA;AACD,QAAA,OAAO,WAAW,CAAC;KACpB;AAcM,IAAA,cAAc,CAAC,MAAc,EAAA;AAClC,QAAA,YAAY,CAAC,OAAO,CAAC,aAAa,CAAC,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;KAC7E;IAEM,gBAAgB,GAAA;AACrB,QAAA,YAAY,CAAC,UAAU,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC;KACxD;IAIM,GAAG,CAAU,YAAoB,EAAE,YAAgB,EAAA;AACxD,QAAA,OAAO,aAAa,CAAC,GAAG,CAAC,YAAY,EAAE,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;KACnE;IAIM,UAAU,CAAU,YAAoB,EAAE,YAAgB,EAAA;AAC/D,QAAA,MAAM,KAAK,GAAG,aAAa,CAAC,GAAG,CAAC,YAAY,EAAE,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACzE,IAAI,KAAK,KAAK,SAAS,EAAE;AACvB,YAAA,MAAM,IAAI,KAAK,CAAC,kCAAkC,YAAY,CAAA,CAAA,CAAG,CAAC,CAAC;AACpE,SAAA;AACD,QAAA,OAAO,KAAK,CAAC;KACd;;AArOa,aAAM,CAAA,MAAA,GAAQ,IAAK,CAAA;AAEjC;;;;AAIG;AACW,aAAQ,CAAA,QAAA,GAAQ,EAAG,CAAA;AAEjC;;;AAGG;AACW,aAAU,CAAA,UAAA,GAAQ,EAAG,CAAA;AAErB,aAAe,CAAA,eAAA,GAAG,0BAA2B,CAAA;AAE7C,aAAA,CAAA,IAAI,GAAG,CAAE,aAAa,CAAG,CAAA;AAnB5B,aAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,aAAa,kBAuMQ,WAAW,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAvMhC,aAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,aAAa,cAFZ,MAAM,EAAA,CAAA,CAAA;2FAEP,aAAa,EAAA,UAAA,EAAA,CAAA;kBAHzB,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;iBACnB,CAAA;;;8BAwMc,QAAQ;;8BAAI,MAAM;+BAAC,WAAW,CAAA;;;;MCvNhC,mBAAmB,CAAA;AAK9B,IAAA,WAAA,CAEkB,IAAgB,EAAA;AAAhB,QAAA,IAAI,CAAA,IAAA,GAAJ,IAAI,CAAY;AANlB,QAAA,IAAA,CAAA,OAAO,GAAG,IAAI,GAAG,EAAe,CAAC;AAEjC,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,GAAG,EAA2B,CAAC;KAK/D;AAES,IAAA,KAAK,CAAU,GAAW,EAAA;;YACrC,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;gBACzB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAC9B,aAAA;YAED,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;gBAC/B,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC,SAAS,EAAE,CAAC;AACjD,aAAA;AAED,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAI,GAAG,CAAC,CAAC,IAAI,CACzC,QAAQ,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAC9C,KAAK,EAAE,CACR,CAAC;YAEF,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;AAEtC,YAAA,OAAO,QAAQ,CAAC,SAAS,EAAE,CAAC;SAC7B,CAAA,CAAA;AAAA,KAAA;;AA3BU,mBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,mBAAmB,kBAMpB,UAAU,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AANT,mBAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,mBAAmB,cADN,MAAM,EAAA,CAAA,CAAA;2FACnB,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAD/B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE,CAAA;;;8BAO7B,MAAM;+BAAC,UAAU,CAAA;;;;ACZtB;;AAEG;;;;"}
File without changes
File without changes
File without changes
File without changes