@rxap/config 12.3.0 → 13.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/index.mjs +4 -0
- package/esm2020/lib/config-loader.service.mjs +33 -0
- package/esm2020/lib/config.service.mjs +156 -0
- package/esm2020/lib/tokens.mjs +3 -0
- package/esm2020/lib/types.mjs +2 -0
- package/esm2020/rxap-config.mjs +5 -0
- package/fesm2015/{rxap-config.js → rxap-config.mjs} +21 -17
- package/fesm2015/rxap-config.mjs.map +1 -0
- package/{esm2015/lib/config.service.js → fesm2020/rxap-config.mjs} +88 -55
- package/fesm2020/rxap-config.mjs.map +1 -0
- package/package.json +28 -13
- package/src/schematics/ng-add/index.js +9 -9
- package/src/schematics/ng-add/index.js.map +1 -1
- package/src/schematics/side-load/index.js +6 -6
- package/src/schematics/side-load/index.js.map +1 -1
- package/bundles/rxap-config.umd.js +0 -632
- package/bundles/rxap-config.umd.js.map +0 -1
- package/esm2015/index.js +0 -4
- package/esm2015/index.js.map +0 -1
- package/esm2015/lib/config-loader.service.js +0 -36
- package/esm2015/lib/config-loader.service.js.map +0 -1
- package/esm2015/lib/config.service.js.map +0 -1
- package/esm2015/lib/tokens.js +0 -3
- package/esm2015/lib/tokens.js.map +0 -1
- package/esm2015/lib/types.js +0 -2
- package/esm2015/lib/types.js.map +0 -1
- package/esm2015/rxap-config.js +0 -5
- package/esm2015/rxap-config.js.map +0 -1
- package/fesm2015/rxap-config.js.map +0 -1
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export * from './lib/config.service';
|
|
2
|
+
export * from './lib/tokens';
|
|
3
|
+
export * from './lib/config-loader.service';
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJzL2NvbmZpZy9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLGNBQWMsQ0FBQztBQUM3QixjQUFjLDZCQUE2QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9saWIvY29uZmlnLnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvdG9rZW5zJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbmZpZy1sb2FkZXIuc2VydmljZSc7XG4iXX0=
|
|
@@ -0,0 +1,33 @@
|
|
|
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: "13.2.3", ngImport: i0, type: ConfigLoaderService, deps: [{ token: HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
25
|
+
ConfigLoaderService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: ConfigLoaderService, providedIn: 'root' });
|
|
26
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.3", 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
|
|
@@ -0,0 +1,156 @@
|
|
|
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 SideLoad(url, propertyPath, required) {
|
|
16
|
+
if (!this.Config) {
|
|
17
|
+
throw new Error('Config side load is only possible after the initial config load.');
|
|
18
|
+
}
|
|
19
|
+
try {
|
|
20
|
+
const response = await fetch(url);
|
|
21
|
+
SetObjectValue(this.Config, propertyPath, await response.json());
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
if (required) {
|
|
25
|
+
throw new Error(`Could not side load config '${url}': ${error.message}`);
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
console.warn(url, error.message);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
console.debug(`app config side load '${propertyPath}'`, this.Config);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Used to load the app config from a remote resource.
|
|
35
|
+
*
|
|
36
|
+
* Promise.all([ ConfigService.Load() ])
|
|
37
|
+
* .then(() => platformBrowserDynamic().bootstrapModule(AppModule))
|
|
38
|
+
* .catch(err => console.error(err))
|
|
39
|
+
*
|
|
40
|
+
*/
|
|
41
|
+
static async Load(options) {
|
|
42
|
+
let config = this.Defaults;
|
|
43
|
+
for (const url of ConfigService.Urls) {
|
|
44
|
+
try {
|
|
45
|
+
const response = await fetch(url);
|
|
46
|
+
config = deepMerge(config, await response.json());
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
console.error(url, error.message);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
config = deepMerge(config, this.Overwrites);
|
|
53
|
+
if (options?.fromLocalStorage !== false) {
|
|
54
|
+
const localConfig = localStorage.getItem(ConfigService.LocalStorageKey);
|
|
55
|
+
if (localConfig) {
|
|
56
|
+
try {
|
|
57
|
+
config = deepMerge(config, JSON.parse(localConfig));
|
|
58
|
+
}
|
|
59
|
+
catch (e) {
|
|
60
|
+
console.error('local config could not be parsed');
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
if (options?.fromUrlParam) {
|
|
65
|
+
const param = typeof options.fromUrlParam === 'string' ? options.fromUrlParam : 'config';
|
|
66
|
+
config = deepMerge(config, this.LoadConfigDefaultFromUrlParam(param));
|
|
67
|
+
}
|
|
68
|
+
console.debug('app config', config);
|
|
69
|
+
ConfigService.Config = config;
|
|
70
|
+
}
|
|
71
|
+
static LoadConfigDefaultFromUrlParam(param = 'config') {
|
|
72
|
+
const queryString = window.location.search;
|
|
73
|
+
const urlParams = new URLSearchParams(queryString);
|
|
74
|
+
const configFromParams = {};
|
|
75
|
+
for (const configParam of urlParams.getAll('config')) {
|
|
76
|
+
try {
|
|
77
|
+
const split = configParam.split(';');
|
|
78
|
+
if (split.length === 2) {
|
|
79
|
+
const keyPath = split[0];
|
|
80
|
+
const value = split[1];
|
|
81
|
+
SetObjectValue(configFromParams, keyPath, value);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
catch (e) {
|
|
85
|
+
console.warn(`Parsing of url config param failed for '${configParam}': ${e.message}`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return configFromParams;
|
|
89
|
+
}
|
|
90
|
+
static Get(path, defaultValue, config = this.Config) {
|
|
91
|
+
if (!config) {
|
|
92
|
+
throw new Error('config not loaded');
|
|
93
|
+
}
|
|
94
|
+
let configValue = config;
|
|
95
|
+
if (typeof path !== 'string') {
|
|
96
|
+
throw new Error('The config property path is not a string');
|
|
97
|
+
}
|
|
98
|
+
for (const fragment of path.split('.')) {
|
|
99
|
+
if (configValue.hasOwnProperty(fragment)) {
|
|
100
|
+
configValue = configValue[fragment];
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
if (defaultValue !== undefined) {
|
|
104
|
+
return defaultValue;
|
|
105
|
+
}
|
|
106
|
+
console.warn(`Config with path '${path}' not found`);
|
|
107
|
+
return undefined;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return configValue;
|
|
111
|
+
}
|
|
112
|
+
setLocalConfig(config) {
|
|
113
|
+
localStorage.setItem(ConfigService.LocalStorageKey, JSON.stringify(config));
|
|
114
|
+
}
|
|
115
|
+
clearLocalConfig() {
|
|
116
|
+
localStorage.removeItem(ConfigService.LocalStorageKey);
|
|
117
|
+
}
|
|
118
|
+
get(propertyPath, defaultValue) {
|
|
119
|
+
return ConfigService.Get(propertyPath, defaultValue, this.config);
|
|
120
|
+
}
|
|
121
|
+
getOrThrow(propertyPath, defaultValue) {
|
|
122
|
+
const value = ConfigService.Get(propertyPath, defaultValue, this.config);
|
|
123
|
+
if (value === undefined) {
|
|
124
|
+
throw new Error(`Could not find config in path '${propertyPath}'`);
|
|
125
|
+
}
|
|
126
|
+
return value;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
ConfigService.Config = null;
|
|
130
|
+
/**
|
|
131
|
+
* Static default values for the config object.
|
|
132
|
+
* Will be overwritten by an dynamic config file specified in
|
|
133
|
+
* the Urls array.
|
|
134
|
+
*/
|
|
135
|
+
ConfigService.Defaults = {};
|
|
136
|
+
/**
|
|
137
|
+
* Any value definition in the Overwrites object will overwrite any
|
|
138
|
+
* value form the Defaults values or dynamic config files
|
|
139
|
+
*/
|
|
140
|
+
ConfigService.Overwrites = {};
|
|
141
|
+
ConfigService.LocalStorageKey = 'rxap/config/local-config';
|
|
142
|
+
ConfigService.Urls = ['config.json'];
|
|
143
|
+
ConfigService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: ConfigService, deps: [{ token: RXAP_CONFIG, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
144
|
+
ConfigService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: ConfigService, providedIn: 'root' });
|
|
145
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: ConfigService, decorators: [{
|
|
146
|
+
type: Injectable,
|
|
147
|
+
args: [{
|
|
148
|
+
providedIn: 'root'
|
|
149
|
+
}]
|
|
150
|
+
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
|
|
151
|
+
type: Optional
|
|
152
|
+
}, {
|
|
153
|
+
type: Inject,
|
|
154
|
+
args: [RXAP_CONFIG]
|
|
155
|
+
}] }]; } });
|
|
156
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2NvbmZpZy9zcmMvbGliL2NvbmZpZy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxVQUFVLEVBQ1YsUUFBUSxFQUNSLE1BQU0sRUFDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsU0FBUyxFQUNULGNBQWMsRUFDZixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxVQUFVLENBQUM7O0FBV3ZDLE1BQU0sT0FBTyxhQUFhO0lBa0p4QixZQUE2QyxTQUFxQixJQUFJO1FBQ3BFLElBQUksQ0FBQyxNQUFNLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQztRQUNuQyxJQUFJLE1BQU0sRUFBRTtZQUNWLElBQUksQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1NBQ3BEO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDaEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1NBQ3pDO0lBQ0gsQ0FBQztJQXJJTSxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFXLEVBQUUsWUFBb0IsRUFBRSxRQUFrQjtRQUVoRixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNoQixNQUFNLElBQUksS0FBSyxDQUFDLGtFQUFrRSxDQUFDLENBQUM7U0FDckY7UUFFRCxJQUFJO1lBRUYsTUFBTSxRQUFRLEdBQUcsTUFBTSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDbEMsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7U0FFbEU7UUFBQyxPQUFPLEtB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QVksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFJTSxHQUFHLENBQVUsWUFBb0IsRUFBRSxZQUFnQjtRQUN4RCxPQUFPLGFBQWEsQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLFlBQVksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUlNLFVBQVUsQ0FBVSxZQUFvQixFQUFFLFlBQWdCO1FBQy9ELE1BQU0sS0FBSyxHQUFHLGFBQWEsQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLFlBQVksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDekUsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFO1lBQ3ZCLE1BQU0sSUFBSSxLQUFLLENBQUMsa0NBQWtDLFlBQVksR0FBRyxDQUFDLENBQUM7U0FDcEU7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7O0FBaExhLG9CQUFNLEdBQVEsSUFBSyxDQUFBO0FBRWpDOzs7O0dBSUc7QUFDVyxzQkFBUSxHQUFRLEVBQUcsQ0FBQTtBQUVqQzs7O0dBR0c7QUFDVyx3QkFBVSxHQUFRLEVBQUcsQ0FBQTtBQUVyQiw2QkFBZSxHQUFHLDBCQUEyQixDQUFBO0FBRTdDLGtCQUFJLEdBQUcsQ0FBRSxhQUFhLENBQUcsQ0FBQTswR0FuQjVCLGFBQWEsa0JBa0pRLFdBQVc7OEdBbEpoQyxhQUFhLGNBRlosTUFBTTsyRkFFUCxhQUFhO2tCQUh6QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjs7MEJBbUpjLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsV0FBVyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEluamVjdGFibGUsXG4gIE9wdGlvbmFsLFxuICBJbmplY3Rcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBkZWVwTWVyZ2UsXG4gIFNldE9iamVjdFZhbHVlXG59IGZyb20gJ0ByeGFwL3V0aWxpdGllcyc7XG5pbXBvcnQgeyBSWEFQX0NPTkZJRyB9IGZyb20gJy4vdG9rZW5zJztcbmltcG9ydCB7IE5vSW5mZXJUeXBlIH0gZnJvbSAnLi90eXBlcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29uZmlnTG9hZE9wdGlvbnMge1xuICBmcm9tVXJsUGFyYW0/OiBzdHJpbmcgfCBib29sZWFuO1xuICBmcm9tTG9jYWxTdG9yYWdlPzogYm9vbGVhbjtcbn1cblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgQ29uZmlnU2VydmljZTxDb25maWcgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gUmVjb3JkPHN0cmluZywgYW55Pj4ge1xuXG4gIHB1YmxpYyBzdGF0aWMgQ29uZmlnOiBhbnkgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBTdGF0aWMgZGVmYXVsdCB2YWx1ZXMgZm9yIHRoZSBjb25maWcgb2JqZWN0LlxuICAgKiBXaWxsIGJlIG92ZXJ3cml0dGVuIGJ5IGFuIGR5bmFtaWMgY29uZmlnIGZpbGUgc3BlY2lmaWVkIGluXG4gICAqIHRoZSBVcmxzIGFycmF5LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBEZWZhdWx0czogYW55ID0ge307XG5cbiAgLyoqXG4gICAqIEFueSB2YWx1ZSBkZWZpbml0aW9uIGluIHRoZSBPdmVyd3JpdGVzIG9iamVjdCB3aWxsIG92ZXJ3cml0ZSBhbnlcbiAgICogdmFsdWUgZm9ybSB0aGUgRGVmYXVsdHMgdmFsdWVzIG9yIGR5bmFtaWMgY29uZmlnIGZpbGVzXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIE92ZXJ3cml0ZXM6IGFueSA9IHt9O1xuXG4gIHB1YmxpYyBzdGF0aWMgTG9jYWxTdG9yYWdlS2V5ID0gJ3J4YXAvY29uZmlnL2xvY2FsLWNvbmZpZyc7XG5cbiAgcHVibGljIHN0YXRpYyBVcmxzID0gWyAnY29uZmlnLmpzb24nIF07XG5cbiAgcHVibGljIHN0YXRpYyBhc3luYyBTaWRlTG9hZCh1cmw6IHN0cmluZywgcHJvcGVydHlQYXRoOiBzdHJpbmcsIHJlcXVpcmVkPzogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuXG4gICAgaWYgKCF0aGlzLkNvbmZpZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb25maWcgc2lkZSBsb2FkIGlzIG9ubHkgcG9zc2libGUgYWZ0ZXIgdGhlIGluaXRpYWwgY29uZmlnIGxvYWQuJyk7XG4gICAgfVxuXG4gICAgdHJ5IHtcblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwpO1xuICAgICAgU2V0T2JqZWN0VmFsdWUodGhpcy5Db25maWcsIHByb3BlcnR5UGF0aCwgYXdhaXQgcmVzcG9uc2UuanNvbigpKTtcblxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIGlmIChyZXF1aXJlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBzaWRlIGxvYWQgY29uZmlnICcke3VybH0nOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4odXJsLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zb2xlLmRlYnVnKGBhcHAgY29uZmlnIHNpZGUgbG9hZCAnJHtwcm9wZXJ0eVBhdGh9J2AsIHRoaXMuQ29uZmlnKTtcblxuICB9XG5cbiAgLyoqXG4gICAqIFVzZWQgdG8gbG9hZCB0aGUgYXBwIGNvbmZpZyBmcm9tIGEgcmVtb3RlIHJlc291cmNlLlxuICAgKlxuICAgKiBQcm9taXNlLmFsbChbIENvbmZpZ1NlcnZpY2UuTG9hZCgpIF0pXG4gICAqIC50aGVuKCgpID0+IHBsYXRmb3JtQnJvd3NlckR5bmFtaWMoKS5ib290c3RyYXBNb2R1bGUoQXBwTW9kdWxlKSlcbiAgICogLmNhdGNoKGVyciA9PiBjb25zb2xlLmVycm9yKGVycikpXG4gICAqXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGFzeW5jIExvYWQob3B0aW9ucz86IENvbmZpZ0xvYWRPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IGNvbmZpZyA9IHRoaXMuRGVmYXVsdHM7XG4gICAgZm9yIChjb25zdCB1cmwgb2YgQ29uZmlnU2VydmljZS5VcmxzKSB7XG4gICAgICB0cnkge1xuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsKTtcbiAgICAgICAgY29uZmlnICAgICAgICAgPSBkZWVwTWVyZ2UoY29uZmlnLCBhd2FpdCByZXNwb25zZS5qc29uKCkpO1xuXG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IodXJsLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25maWcgPSBkZWVwTWVyZ2UoY29uZmlnLCB0aGlzLk92ZXJ3cml0ZXMpO1xuXG4gICAgaWYgKG9wdGlvbnM/LmZyb21Mb2NhbFN0b3JhZ2UgIT09IGZhbHNlKSB7XG5cbiAgICAgIGNvbnN0IGxvY2FsQ29uZmlnID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oQ29uZmlnU2VydmljZS5Mb2NhbFN0b3JhZ2VLZXkpO1xuXG4gICAgICBpZiAobG9jYWxDb25maWcpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25maWcgPSBkZWVwTWVyZ2UoY29uZmlnLCBKU09OLnBhcnNlKGxvY2FsQ29uZmlnKSk7XG4gICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ2xvY2FsIGNvbmZpZyBjb3VsZCBub3QgYmUgcGFyc2VkJyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgIH1cblxuICAgIGlmIChvcHRpb25zPy5mcm9tVXJsUGFyYW0pIHtcbiAgICAgIGNvbnN0IHBhcmFtID0gdHlwZW9mIG9wdGlvbnMuZnJvbVVybFBhcmFtID09PSAnc3RyaW5nJyA/IG9wdGlvbnMuZnJvbVVybFBhcmFtIDogJ2NvbmZpZyc7XG4gICAgICBjb25maWcgICAgICA9IGRlZXBNZXJnZShjb25maWcsIHRoaXMuTG9hZENvbmZpZ0RlZmF1bHRGcm9tVXJsUGFyYW0ocGFyYW0pKTtcbiAgICB9XG5cbiAgICBjb25zb2xlLmRlYnVnKCdhcHAgY29uZmlnJywgY29uZmlnKTtcblxuICAgIENvbmZpZ1NlcnZpY2UuQ29uZmlnID0gY29uZmlnO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgTG9hZENvbmZpZ0RlZmF1bHRGcm9tVXJsUGFyYW0ocGFyYW06IHN0cmluZyA9ICdjb25maWcnKSB7XG5cbiAgICBjb25zdCBxdWVyeVN0cmluZyA9IHdpbmRvdy5sb2NhdGlvbi5zZWFyY2g7XG4gICAgY29uc3QgdXJsUGFyYW1zICAgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHF1ZXJ5U3RyaW5nKTtcblxuICAgIGNvbnN0IGNvbmZpZ0Zyb21QYXJhbXMgPSB7fTtcblxuICAgIGZvciAoY29uc3QgY29uZmlnUGFyYW0gb2YgdXJsUGFyYW1zLmdldEFsbCgnY29uZmlnJykpIHtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc3BsaXQgPSBjb25maWdQYXJhbS5zcGxpdCgnOycpO1xuICAgICAgICBpZiAoc3BsaXQubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgY29uc3Qga2V5UGF0aCA9IHNwbGl0WyAwIF07XG4gICAgICAgICAgY29uc3QgdmFsdWUgICA9IHNwbGl0WyAxIF07XG4gICAgICAgICAgU2V0T2JqZWN0VmFsdWUoY29uZmlnRnJvbVBhcmFtcywga2V5UGF0aCwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBQYXJzaW5nIG9mIHVybCBjb25maWcgcGFyYW0gZmFpbGVkIGZvciAnJHtjb25maWdQYXJhbX0nOiAke2UubWVzc2FnZX1gKTtcbiAgICAgIH1cblxuICAgIH1cblxuICAgIHJldHVybiBjb25maWdGcm9tUGFyYW1zO1xuXG4gIH1cblxuICBwdWJsaWMgc3RhdGljIEdldDxUID0gYW55LCBLIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IFJlY29yZDxzdHJpbmcsIGFueT4+KHBhdGg6IHN0cmluZywgZGVmYXVsdFZhbHVlOiBUIHwgdW5kZWZpbmVkLCBjb25maWc6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBUXG4gIHB1YmxpYyBzdGF0aWMgR2V0PFQgPSBhbnksIEsgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gUmVjb3JkPHN0cmluZywgYW55Pj4oXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIGRlZmF1bHRWYWx1ZTogTm9JbmZlclR5cGU8VD4sXG4gICAgY29uZmlnOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gdGhpcy5Db25maWdcbiAgKTogVCB7XG4gICAgaWYgKCFjb25maWcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY29uZmlnIG5vdCBsb2FkZWQnKTtcbiAgICB9XG4gICAgbGV0IGNvbmZpZ1ZhbHVlOiBhbnkgPSBjb25maWc7XG4gICAgaWYgKHR5cGVvZiBwYXRoICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgY29uZmlnIHByb3BlcnR5IHBhdGggaXMgbm90IGEgc3RyaW5nJyk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgZnJhZ21lbnQgb2YgKHBhdGggYXMgYW55KS5zcGxpdCgnLicpKSB7XG4gICAgICBpZiAoY29uZmlnVmFsdWUuaGFzT3duUHJvcGVydHkoZnJhZ21lbnQpKSB7XG4gICAgICAgIGNvbmZpZ1ZhbHVlID0gY29uZmlnVmFsdWVbIGZyYWdtZW50IF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUud2FybihgQ29uZmlnIHdpdGggcGF0aCAnJHtwYXRofScgbm90IGZvdW5kYCk7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQgYXMgYW55O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY29uZmlnVmFsdWU7XG4gIH1cblxuICBwdWJsaWMgcmVhZG9ubHkgY29uZmlnITogQ29uZmlnO1xuXG4gIGNvbnN0cnVjdG9yKEBPcHRpb25hbCgpIEBJbmplY3QoUlhBUF9DT05GSUcpIGNvbmZpZzogYW55IHwgbnVsbCA9IG51bGwpIHtcbiAgICB0aGlzLmNvbmZpZyA9IENvbmZpZ1NlcnZpY2UuQ29uZmlnO1xuICAgIGlmIChjb25maWcpIHtcbiAgICAgIHRoaXMuY29uZmlnID0gZGVlcE1lcmdlKHRoaXMuY29uZmlnID8/IHt9LCBjb25maWcpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuY29uZmlnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvbmZpZyBub3QgYXZhaWxhYmxlJyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNldExvY2FsQ29uZmlnKGNvbmZpZzogQ29uZmlnKTogdm9pZCB7XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oQ29uZmlnU2VydmljZS5Mb2NhbFN0b3JhZ2VLZXksIEpTT04uc3RyaW5naWZ5KGNvbmZpZykpO1xuICB9XG5cbiAgcHVibGljIGNsZWFyTG9jYWxDb25maWcoKTogdm9pZCB7XG4gICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oQ29uZmlnU2VydmljZS5Mb2NhbFN0b3JhZ2VLZXkpO1xuICB9XG5cbiAgcHVibGljIGdldDxUID0gYW55Pihwcm9wZXJ0eVBhdGg6IHN0cmluZyk6IFQgfCB1bmRlZmluZWQ7XG4gIHB1YmxpYyBnZXQ8VCA9IGFueT4ocHJvcGVydHlQYXRoOiBzdHJpbmcsIGRlZmF1bHRWYWx1ZTogTm9JbmZlclR5cGU8VD4pOiBUO1xuICBwdWJsaWMgZ2V0PFQgPSBhbnk+KHByb3BlcnR5UGF0aDogc3RyaW5nLCBkZWZhdWx0VmFsdWU/OiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIENvbmZpZ1NlcnZpY2UuR2V0KHByb3BlcnR5UGF0aCwgZGVmYXVsdFZhbHVlLCB0aGlzLmNvbmZpZyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0T3JUaHJvdzxUID0gYW55Pihwcm9wZXJ0eVBhdGg6IHN0cmluZyk6IFQ7XG4gIHB1YmxpYyBnZXRPclRocm93PFQgPSBhbnk+KHByb3BlcnR5UGF0aDogc3RyaW5nLCBkZWZhdWx0VmFsdWU6IE5vSW5mZXJUeXBlPFQ+KTogVDtcbiAgcHVibGljIGdldE9yVGhyb3c8VCA9IGFueT4ocHJvcGVydHlQYXRoOiBzdHJpbmcsIGRlZmF1bHRWYWx1ZT86IFQpOiBUIHtcbiAgICBjb25zdCB2YWx1ZSA9IENvbmZpZ1NlcnZpY2UuR2V0KHByb3BlcnR5UGF0aCwgZGVmYXVsdFZhbHVlLCB0aGlzLmNvbmZpZyk7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZpbmQgY29uZmlnIGluIHBhdGggJyR7cHJvcGVydHlQYXRofSdgKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbn1cbiJdfQ==
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { InjectionToken } from '@angular/core';
|
|
2
|
+
export const RXAP_CONFIG = new InjectionToken('rxap/config');
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW5zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9jb25maWcvc3JjL2xpYi90b2tlbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUvQyxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsSUFBSSxjQUFjLENBQUMsYUFBYSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3Rpb25Ub2tlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5leHBvcnQgY29uc3QgUlhBUF9DT05GSUcgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ3J4YXAvY29uZmlnJyk7XG4iXX0=
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2NvbmZpZy9zcmMvbGliL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVjbGFyZSB0eXBlIE5vSW5mZXJUeXBlPFQ+ID0gWyBUIF1bVCBleHRlbmRzIGFueSA/IDAgOiBuZXZlcl07XG5cbnR5cGUgUHJldiA9IFtcbiAgbmV2ZXIsIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLFxuICAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIDE5LCAyMCwgLi4uMFtdXG5dXG5cbmV4cG9ydCB0eXBlIEpvaW48SywgUD4gPSBLIGV4dGVuZHMgc3RyaW5nIHwgbnVtYmVyID9cbiAgICAgICAgICAgICAgICAgICAgICAgICBQIGV4dGVuZHMgc3RyaW5nIHwgbnVtYmVyID9cbiAgICAgICAgICAgICAgICAgICAgICAgICBgJHtLfSR7JycgZXh0ZW5kcyBQID8gJycgOiAnLid9JHtQfWBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbmV2ZXIgOiBuZXZlcjtcblxuZXhwb3J0IHR5cGUgUGF0aHM8VCwgRCBleHRlbmRzIG51bWJlciA9IDEwPiA9IFsgRCBdIGV4dGVuZHMgWyBuZXZlciBdID8gbmV2ZXIgOiBUIGV4dGVuZHMgb2JqZWN0ID9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtLIGluIGtleW9mIFRdLT86IEsgZXh0ZW5kcyBzdHJpbmcgfCBudW1iZXIgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAke0t9YCB8IEpvaW48SywgUGF0aHM8VFtLXSwgUHJldltEXT4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG5ldmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1ba2V5b2YgVF0gOiAnJztcblxuZXhwb3J0IHR5cGUgTGVhdmVzPFQsIEQgZXh0ZW5kcyBudW1iZXIgPSAxMD4gPSBbIEQgXSBleHRlbmRzIFsgbmV2ZXIgXSA/IG5ldmVyIDogVCBleHRlbmRzIG9iamVjdCA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IFtLIGluIGtleW9mIFRdLT86IEpvaW48SywgTGVhdmVzPFRbS10sIFByZXZbRF0+PiB9W2tleW9mIFRdIDogJyc7XG4iXX0=
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generated bundle index. Do not edit.
|
|
3
|
+
*/
|
|
4
|
+
export * from './index';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnhhcC1jb25maWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJzL2NvbmZpZy9zcmMvcnhhcC1jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLFNBQVMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9pbmRleCc7XG4iXX0=
|
|
@@ -151,19 +151,21 @@ ConfigService.Defaults = {};
|
|
|
151
151
|
ConfigService.Overwrites = {};
|
|
152
152
|
ConfigService.LocalStorageKey = 'rxap/config/local-config';
|
|
153
153
|
ConfigService.Urls = ['config.json'];
|
|
154
|
-
ConfigService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
155
|
-
ConfigService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
156
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
154
|
+
ConfigService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: ConfigService, deps: [{ token: RXAP_CONFIG, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
155
|
+
ConfigService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: ConfigService, providedIn: 'root' });
|
|
156
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: ConfigService, decorators: [{
|
|
157
157
|
type: Injectable,
|
|
158
158
|
args: [{
|
|
159
159
|
providedIn: 'root'
|
|
160
160
|
}]
|
|
161
|
-
}], ctorParameters: function () {
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
161
|
+
}], ctorParameters: function () {
|
|
162
|
+
return [{ type: undefined, decorators: [{
|
|
163
|
+
type: Optional
|
|
164
|
+
}, {
|
|
165
|
+
type: Inject,
|
|
166
|
+
args: [RXAP_CONFIG]
|
|
167
|
+
}] }];
|
|
168
|
+
} });
|
|
167
169
|
|
|
168
170
|
class ConfigLoaderService {
|
|
169
171
|
constructor(http) {
|
|
@@ -185,19 +187,21 @@ class ConfigLoaderService {
|
|
|
185
187
|
});
|
|
186
188
|
}
|
|
187
189
|
}
|
|
188
|
-
ConfigLoaderService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
189
|
-
ConfigLoaderService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
190
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
190
|
+
ConfigLoaderService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: ConfigLoaderService, deps: [{ token: HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
191
|
+
ConfigLoaderService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: ConfigLoaderService, providedIn: 'root' });
|
|
192
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: ConfigLoaderService, decorators: [{
|
|
191
193
|
type: Injectable,
|
|
192
194
|
args: [{ providedIn: 'root' }]
|
|
193
|
-
}], ctorParameters: function () {
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
195
|
+
}], ctorParameters: function () {
|
|
196
|
+
return [{ type: i1.HttpClient, decorators: [{
|
|
197
|
+
type: Inject,
|
|
198
|
+
args: [HttpClient]
|
|
199
|
+
}] }];
|
|
200
|
+
} });
|
|
197
201
|
|
|
198
202
|
/**
|
|
199
203
|
* Generated bundle index. Do not edit.
|
|
200
204
|
*/
|
|
201
205
|
|
|
202
206
|
export { ConfigLoaderService, ConfigService, RXAP_CONFIG };
|
|
203
|
-
//# sourceMappingURL=rxap-config.
|
|
207
|
+
//# sourceMappingURL=rxap-config.mjs.map
|
|
@@ -0,0 +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';\n\nexport interface ConfigLoadOptions {\n fromUrlParam?: string | boolean;\n fromLocalStorage?: boolean;\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 public static async SideLoad(url: string, propertyPath: string, required?: boolean): 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 try {\n\n const response = await fetch(url);\n SetObjectValue(this.Config, propertyPath, await response.json());\n\n } catch (error: any) {\n if (required) {\n throw new Error(`Could not side load config '${url}': ${error.message}`);\n } else {\n console.warn(url, error.message);\n }\n }\n\n console.debug(`app config side load '${propertyPath}'`, 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 try {\n\n const response = await fetch(url);\n config = deepMerge(config, await response.json());\n\n } catch (error: any) {\n console.error(url, error.message);\n }\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 ConfigService.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,38 +1,39 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { Injectable, Optional, Inject } from '@angular/core';
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { InjectionToken, Injectable, Optional, Inject } from '@angular/core';
|
|
3
3
|
import { deepMerge, SetObjectValue } from '@rxap/utilities';
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
|
|
4
|
+
import * as i1 from '@angular/common/http';
|
|
5
|
+
import { HttpClient } from '@angular/common/http';
|
|
6
|
+
import { finalize, share } from 'rxjs/operators';
|
|
7
|
+
|
|
8
|
+
const RXAP_CONFIG = new InjectionToken('rxap/config');
|
|
9
|
+
|
|
10
|
+
class ConfigService {
|
|
7
11
|
constructor(config = null) {
|
|
8
|
-
var _a;
|
|
9
12
|
this.config = ConfigService.Config;
|
|
10
13
|
if (config) {
|
|
11
|
-
this.config = deepMerge(
|
|
14
|
+
this.config = deepMerge(this.config ?? {}, config);
|
|
12
15
|
}
|
|
13
16
|
if (!this.config) {
|
|
14
17
|
throw new Error('config not available');
|
|
15
18
|
}
|
|
16
19
|
}
|
|
17
|
-
static SideLoad(url, propertyPath, required) {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
20
|
+
static async SideLoad(url, propertyPath, required) {
|
|
21
|
+
if (!this.Config) {
|
|
22
|
+
throw new Error('Config side load is only possible after the initial config load.');
|
|
23
|
+
}
|
|
24
|
+
try {
|
|
25
|
+
const response = await fetch(url);
|
|
26
|
+
SetObjectValue(this.Config, propertyPath, await response.json());
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
if (required) {
|
|
30
|
+
throw new Error(`Could not side load config '${url}': ${error.message}`);
|
|
25
31
|
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
throw new Error(`Could not side load config '${url}': ${error.message}`);
|
|
29
|
-
}
|
|
30
|
-
else {
|
|
31
|
-
console.warn(url, error.message);
|
|
32
|
-
}
|
|
32
|
+
else {
|
|
33
|
+
console.warn(url, error.message);
|
|
33
34
|
}
|
|
34
|
-
|
|
35
|
-
});
|
|
35
|
+
}
|
|
36
|
+
console.debug(`app config side load '${propertyPath}'`, this.Config);
|
|
36
37
|
}
|
|
37
38
|
/**
|
|
38
39
|
* Used to load the app config from a remote resource.
|
|
@@ -42,37 +43,35 @@ export class ConfigService {
|
|
|
42
43
|
* .catch(err => console.error(err))
|
|
43
44
|
*
|
|
44
45
|
*/
|
|
45
|
-
static Load(options) {
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
46
|
+
static async Load(options) {
|
|
47
|
+
let config = this.Defaults;
|
|
48
|
+
for (const url of ConfigService.Urls) {
|
|
49
|
+
try {
|
|
50
|
+
const response = await fetch(url);
|
|
51
|
+
config = deepMerge(config, await response.json());
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
console.error(url, error.message);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
config = deepMerge(config, this.Overwrites);
|
|
58
|
+
if (options?.fromLocalStorage !== false) {
|
|
59
|
+
const localConfig = localStorage.getItem(ConfigService.LocalStorageKey);
|
|
60
|
+
if (localConfig) {
|
|
49
61
|
try {
|
|
50
|
-
|
|
51
|
-
config = deepMerge(config, yield response.json());
|
|
62
|
+
config = deepMerge(config, JSON.parse(localConfig));
|
|
52
63
|
}
|
|
53
|
-
catch (
|
|
54
|
-
console.error(
|
|
64
|
+
catch (e) {
|
|
65
|
+
console.error('local config could not be parsed');
|
|
55
66
|
}
|
|
56
67
|
}
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
catch (e) {
|
|
65
|
-
console.error('local config could not be parsed');
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
if (options === null || options === void 0 ? void 0 : options.fromUrlParam) {
|
|
70
|
-
const param = typeof options.fromUrlParam === 'string' ? options.fromUrlParam : 'config';
|
|
71
|
-
config = deepMerge(config, this.LoadConfigDefaultFromUrlParam(param));
|
|
72
|
-
}
|
|
73
|
-
console.debug('app config', config);
|
|
74
|
-
ConfigService.Config = config;
|
|
75
|
-
});
|
|
68
|
+
}
|
|
69
|
+
if (options?.fromUrlParam) {
|
|
70
|
+
const param = typeof options.fromUrlParam === 'string' ? options.fromUrlParam : 'config';
|
|
71
|
+
config = deepMerge(config, this.LoadConfigDefaultFromUrlParam(param));
|
|
72
|
+
}
|
|
73
|
+
console.debug('app config', config);
|
|
74
|
+
ConfigService.Config = config;
|
|
76
75
|
}
|
|
77
76
|
static LoadConfigDefaultFromUrlParam(param = 'config') {
|
|
78
77
|
const queryString = window.location.search;
|
|
@@ -146,9 +145,9 @@ ConfigService.Defaults = {};
|
|
|
146
145
|
ConfigService.Overwrites = {};
|
|
147
146
|
ConfigService.LocalStorageKey = 'rxap/config/local-config';
|
|
148
147
|
ConfigService.Urls = ['config.json'];
|
|
149
|
-
ConfigService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
150
|
-
ConfigService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
151
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
148
|
+
ConfigService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: ConfigService, deps: [{ token: RXAP_CONFIG, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
149
|
+
ConfigService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: ConfigService, providedIn: 'root' });
|
|
150
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: ConfigService, decorators: [{
|
|
152
151
|
type: Injectable,
|
|
153
152
|
args: [{
|
|
154
153
|
providedIn: 'root'
|
|
@@ -159,4 +158,38 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.1", ngImpor
|
|
|
159
158
|
type: Inject,
|
|
160
159
|
args: [RXAP_CONFIG]
|
|
161
160
|
}] }]; } });
|
|
162
|
-
|
|
161
|
+
|
|
162
|
+
class ConfigLoaderService {
|
|
163
|
+
constructor(http) {
|
|
164
|
+
this.http = http;
|
|
165
|
+
this.configs = new Map();
|
|
166
|
+
this.configLoading = new Map();
|
|
167
|
+
}
|
|
168
|
+
async load$(url) {
|
|
169
|
+
if (this.configs.has(url)) {
|
|
170
|
+
return this.configs.get(url);
|
|
171
|
+
}
|
|
172
|
+
if (this.configLoading.has(url)) {
|
|
173
|
+
return this.configLoading.get(url).toPromise();
|
|
174
|
+
}
|
|
175
|
+
const loading$ = this.http.get(url).pipe(finalize(() => this.configLoading.delete(url)), share());
|
|
176
|
+
this.configLoading.set(url, loading$);
|
|
177
|
+
return loading$.toPromise();
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
ConfigLoaderService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: ConfigLoaderService, deps: [{ token: HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
181
|
+
ConfigLoaderService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: ConfigLoaderService, providedIn: 'root' });
|
|
182
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: ConfigLoaderService, decorators: [{
|
|
183
|
+
type: Injectable,
|
|
184
|
+
args: [{ providedIn: 'root' }]
|
|
185
|
+
}], ctorParameters: function () { return [{ type: i1.HttpClient, decorators: [{
|
|
186
|
+
type: Inject,
|
|
187
|
+
args: [HttpClient]
|
|
188
|
+
}] }]; } });
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* Generated bundle index. Do not edit.
|
|
192
|
+
*/
|
|
193
|
+
|
|
194
|
+
export { ConfigLoaderService, ConfigService, RXAP_CONFIG };
|
|
195
|
+
//# sourceMappingURL=rxap-config.mjs.map
|
|
@@ -0,0 +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';\n\nexport interface ConfigLoadOptions {\n fromUrlParam?: string | boolean;\n fromLocalStorage?: boolean;\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 public static async SideLoad(url: string, propertyPath: string, required?: boolean): 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 try {\n\n const response = await fetch(url);\n SetObjectValue(this.Config, propertyPath, await response.json());\n\n } catch (error: any) {\n if (required) {\n throw new Error(`Could not side load config '${url}': ${error.message}`);\n } else {\n console.warn(url, error.message);\n }\n }\n\n console.debug(`app config side load '${propertyPath}'`, 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 try {\n\n const response = await fetch(url);\n config = deepMerge(config, await response.json());\n\n } catch (error: any) {\n console.error(url, error.message);\n }\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 ConfigService.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/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rxap/config",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "13.0.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"author": "Merzough Münker",
|
|
6
6
|
"homepage": "https://gitlab.com/rxap/packages/libs/config",
|
|
@@ -17,9 +17,11 @@
|
|
|
17
17
|
},
|
|
18
18
|
"description": "Simple config file manager for angular applications.",
|
|
19
19
|
"peerDependencies": {
|
|
20
|
-
"@angular/
|
|
21
|
-
"@angular/
|
|
22
|
-
"@
|
|
20
|
+
"@angular-devkit/schematics": "^13.2.4",
|
|
21
|
+
"@angular/common": "^13.2.3",
|
|
22
|
+
"@angular/core": "^13.2.3",
|
|
23
|
+
"@angular/platform-browser-dynamic": "^13.2.3",
|
|
24
|
+
"@rxap/utilities": "^13.0.0",
|
|
23
25
|
"reflect-metadata": "^0.1.13",
|
|
24
26
|
"rxjs": "^6.5.5"
|
|
25
27
|
},
|
|
@@ -39,16 +41,29 @@
|
|
|
39
41
|
"save": "dependencies"
|
|
40
42
|
},
|
|
41
43
|
"dependencies": {
|
|
42
|
-
"@rxap/schematics-ts-morph": "^
|
|
43
|
-
"@rxap/schematics-utilities": "^
|
|
44
|
-
"ts-morph": "^
|
|
45
|
-
"tslib": "^2.
|
|
44
|
+
"@rxap/schematics-ts-morph": "^13.0.0-next.1",
|
|
45
|
+
"@rxap/schematics-utilities": "^13.0.0-next.1",
|
|
46
|
+
"ts-morph": "^13.0.3",
|
|
47
|
+
"tslib": "^2.3.1"
|
|
46
48
|
},
|
|
47
|
-
"
|
|
48
|
-
"
|
|
49
|
-
"
|
|
50
|
-
"
|
|
51
|
-
"fesm2015": "fesm2015/rxap-config.
|
|
49
|
+
"module": "fesm2015/rxap-config.mjs",
|
|
50
|
+
"es2020": "fesm2020/rxap-config.mjs",
|
|
51
|
+
"esm2020": "esm2020/rxap-config.mjs",
|
|
52
|
+
"fesm2020": "fesm2020/rxap-config.mjs",
|
|
53
|
+
"fesm2015": "fesm2015/rxap-config.mjs",
|
|
52
54
|
"typings": "rxap-config.d.ts",
|
|
55
|
+
"exports": {
|
|
56
|
+
"./package.json": {
|
|
57
|
+
"default": "./package.json"
|
|
58
|
+
},
|
|
59
|
+
".": {
|
|
60
|
+
"types": "./rxap-config.d.ts",
|
|
61
|
+
"esm2020": "./esm2020/rxap-config.mjs",
|
|
62
|
+
"es2020": "./fesm2020/rxap-config.mjs",
|
|
63
|
+
"es2015": "./fesm2015/rxap-config.mjs",
|
|
64
|
+
"node": "./fesm2015/rxap-config.mjs",
|
|
65
|
+
"default": "./fesm2020/rxap-config.mjs"
|
|
66
|
+
}
|
|
67
|
+
},
|
|
53
68
|
"sideEffects": false
|
|
54
69
|
}
|