ng-easycommerce-v18 0.3.20-beta.1 → 0.3.21-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -16
- package/esm2022/lib/classes/filters/attributes-filter.mjs +4 -74
- package/esm2022/lib/classes/filters/category-filter.mjs +26 -105
- package/esm2022/lib/classes/filters/filter-factory.mjs +3 -7
- package/esm2022/lib/classes/filters/price_range-filter.mjs +3 -3
- package/esm2022/lib/constants/api.constants.service.mjs +15 -19
- package/esm2022/lib/constants/core.constants.service.mjs +5 -16
- package/esm2022/lib/ec-components/abstractions-components/menu-ec.component.mjs +1 -17
- package/esm2022/lib/ec-components/auth-ec/login-form-ec/login-form-ec.component.mjs +16 -26
- package/esm2022/lib/ec-components/auth-ec/password-reset-ec/password-reset-ec.component.mjs +21 -25
- package/esm2022/lib/ec-components/blocks-ec/block-products-ec/block-products-ec.component.mjs +16 -4
- package/esm2022/lib/ec-components/collection-ec/collection-ec.component.mjs +17 -41
- package/esm2022/lib/ec-components/filters-ec/filters-ec.component.mjs +14 -72
- package/esm2022/lib/ec-components/header-ec/header-ec.component.mjs +25 -41
- package/esm2022/lib/ec-components/price-range-filter/price-range-filter.component.mjs +2 -13
- package/esm2022/lib/ec-components/product-detail-ec/product-detail-ec.component.mjs +7 -12
- package/esm2022/lib/ec-components/stores-ec/stores-ec.component.mjs +9 -18
- package/esm2022/lib/ec-components/widgets-ec/decidir-ec/decidir-ec.component.mjs +6 -12
- package/esm2022/lib/ec-components/widgets-ec/magnizoom-ec/magnizoom-ec.component.mjs +4 -6
- package/esm2022/lib/ec-components/widgets-ec/redsys-catch-ec/redsys-catch-ec.component.mjs +17 -7
- package/esm2022/lib/ec-services/analytics/google-analytics.service.mjs +4 -4
- package/esm2022/lib/ec-services/analytics/gtm.service.mjs +6 -10
- package/esm2022/lib/ec-services/analytics/metricool-pixel.service.mjs +18 -17
- package/esm2022/lib/ec-services/checkout.service.mjs +2 -4
- package/esm2022/lib/ec-services/filters.service.mjs +18 -124
- package/esm2022/lib/ec-services/index.mjs +1 -3
- package/esm2022/lib/ec-services/pagination.service.mjs +22 -70
- package/esm2022/lib/ec-services/products.service.mjs +3 -5
- package/esm2022/lib/interceptors/index.mjs +1 -2
- package/esm2022/lib/interfaces/environment.mjs +1 -1
- package/esm2022/lib/interfaces/filter.mjs +1 -1
- package/esm2022/lib/interfaces/index.mjs +1 -2
- package/esm2022/lib/interfaces/options.mjs +1 -1
- package/esm2022/lib/providers/index.mjs +1 -2
- package/fesm2022/ng-easycommerce-v18.mjs +316 -1186
- package/fesm2022/ng-easycommerce-v18.mjs.map +1 -1
- package/lib/classes/filters/attributes-filter.d.ts +0 -24
- package/lib/classes/filters/category-filter.d.ts +3 -30
- package/lib/constants/api.constants.service.d.ts +0 -1
- package/lib/constants/core.constants.service.d.ts +0 -7
- package/lib/ec-components/abstractions-components/menu-ec.component.d.ts +0 -12
- package/lib/ec-components/auth-ec/login-form-ec/login-form-ec.component.d.ts +0 -2
- package/lib/ec-components/collection-ec/collection-ec.component.d.ts +4 -5
- package/lib/ec-components/filters-ec/filters-ec.component.d.ts +4 -25
- package/lib/ec-components/price-range-filter/price-range-filter.component.d.ts +0 -2
- package/lib/ec-services/analytics/gtm.service.d.ts +1 -1
- package/lib/ec-services/filters.service.d.ts +1 -18
- package/lib/ec-services/index.d.ts +0 -2
- package/lib/ec-services/pagination.service.d.ts +5 -21
- package/lib/ec-services/products.service.d.ts +1 -1
- package/lib/interceptors/index.d.ts +0 -1
- package/lib/interfaces/environment.d.ts +0 -1
- package/lib/interfaces/filter.d.ts +0 -1
- package/lib/interfaces/index.d.ts +0 -1
- package/lib/interfaces/options.d.ts +0 -2
- package/lib/providers/index.d.ts +0 -1
- package/package.json +1 -1
- package/esm2022/lib/ec-services/base-api.service.mjs +0 -148
- package/esm2022/lib/ec-services/runtime-config.service.mjs +0 -190
- package/esm2022/lib/interceptors/runtime-config.interceptor.mjs +0 -41
- package/esm2022/lib/interfaces/runtime-config.mjs +0 -2
- package/esm2022/lib/providers/provideRuntimeConfig.mjs +0 -42
- package/lib/ec-services/base-api.service.d.ts +0 -64
- package/lib/ec-services/runtime-config.service.d.ts +0 -63
- package/lib/interceptors/runtime-config.interceptor.d.ts +0 -7
- package/lib/interfaces/runtime-config.d.ts +0 -22
- package/lib/providers/provideRuntimeConfig.d.ts +0 -13
|
@@ -1,190 +0,0 @@
|
|
|
1
|
-
import { Injectable, Inject, PLATFORM_ID } from '@angular/core';
|
|
2
|
-
import { isPlatformBrowser } from '@angular/common';
|
|
3
|
-
import { of, BehaviorSubject } from 'rxjs';
|
|
4
|
-
import { catchError, tap, shareReplay } from 'rxjs/operators';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
import * as i1 from "@angular/common/http";
|
|
7
|
-
export class RuntimeConfigService {
|
|
8
|
-
platformId;
|
|
9
|
-
http;
|
|
10
|
-
configSubject = new BehaviorSubject(null);
|
|
11
|
-
config$ = this.configSubject.asObservable();
|
|
12
|
-
_config = null;
|
|
13
|
-
_loadPromise = null;
|
|
14
|
-
_isLoaded = false;
|
|
15
|
-
constructor(platformId, http) {
|
|
16
|
-
this.platformId = platformId;
|
|
17
|
-
this.http = http;
|
|
18
|
-
// En SSR o browser, intentar cargar inmediatamente desde window si está disponible
|
|
19
|
-
if (typeof window !== 'undefined' && window.__RUNTIME_CONFIG__ && !this._isLoaded) {
|
|
20
|
-
this._config = window.__RUNTIME_CONFIG__;
|
|
21
|
-
this._isLoaded = true;
|
|
22
|
-
this.configSubject.next(this._config);
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* Inicialización única - llamada por APP_INITIALIZER
|
|
27
|
-
* Garantiza que la configuración se carga solo una vez al inicio
|
|
28
|
-
*/
|
|
29
|
-
initialize() {
|
|
30
|
-
if (this._isLoaded && this._config) {
|
|
31
|
-
return Promise.resolve(this._config);
|
|
32
|
-
}
|
|
33
|
-
return new Promise((resolve, reject) => {
|
|
34
|
-
this.loadConfig().subscribe({
|
|
35
|
-
next: (config) => {
|
|
36
|
-
this._isLoaded = true;
|
|
37
|
-
resolve(config);
|
|
38
|
-
},
|
|
39
|
-
error: (error) => {
|
|
40
|
-
reject(error);
|
|
41
|
-
}
|
|
42
|
-
});
|
|
43
|
-
});
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* Carga la configuración en runtime (optimizada para una sola carga)
|
|
47
|
-
* - En SSR: Lee desde el objeto window inyectado por el servidor
|
|
48
|
-
* - En Browser: Hace petición HTTP a /runtime-config.json (solo si no está en window)
|
|
49
|
-
*/
|
|
50
|
-
loadConfig() {
|
|
51
|
-
// Si ya tenemos la config cargada, la devolvemos inmediatamente
|
|
52
|
-
if (this._isLoaded && this._config) {
|
|
53
|
-
return of(this._config);
|
|
54
|
-
}
|
|
55
|
-
// Si ya hay una carga en progreso, reutilizamos esa petición
|
|
56
|
-
if (this._loadPromise) {
|
|
57
|
-
return this._loadPromise;
|
|
58
|
-
}
|
|
59
|
-
if (isPlatformBrowser(this.platformId)) {
|
|
60
|
-
// En el navegador, primero intentamos obtener la config desde window
|
|
61
|
-
if (typeof window !== 'undefined' && window.__RUNTIME_CONFIG__ && !this._isLoaded) {
|
|
62
|
-
this._config = window.__RUNTIME_CONFIG__;
|
|
63
|
-
this._isLoaded = true;
|
|
64
|
-
this.configSubject.next(this._config);
|
|
65
|
-
return of(this._config);
|
|
66
|
-
}
|
|
67
|
-
// Si no está en window, hacemos petición HTTP (solo una vez)
|
|
68
|
-
this._loadPromise = this.http.get('/runtime-config.json').pipe(tap(config => {
|
|
69
|
-
this._config = config;
|
|
70
|
-
this._isLoaded = true;
|
|
71
|
-
this.configSubject.next(config);
|
|
72
|
-
// Guardamos en window para siguientes accesos
|
|
73
|
-
if (typeof window !== 'undefined') {
|
|
74
|
-
window.__RUNTIME_CONFIG__ = config;
|
|
75
|
-
}
|
|
76
|
-
}), shareReplay(1), // Cache la respuesta para múltiples suscripciones
|
|
77
|
-
catchError(error => {
|
|
78
|
-
console.error('Error loading runtime config:', error);
|
|
79
|
-
// Fallback config si falla la carga
|
|
80
|
-
const fallbackConfig = {
|
|
81
|
-
apiUrl: 'https://elden-preprod.backend.easycommerce.com.ar/',
|
|
82
|
-
appEnv: 'preprod',
|
|
83
|
-
production: false,
|
|
84
|
-
locale: 'es_AR',
|
|
85
|
-
channel: 'minorista'
|
|
86
|
-
};
|
|
87
|
-
this._config = fallbackConfig;
|
|
88
|
-
this._isLoaded = true;
|
|
89
|
-
this.configSubject.next(fallbackConfig);
|
|
90
|
-
return of(fallbackConfig);
|
|
91
|
-
}));
|
|
92
|
-
return this._loadPromise;
|
|
93
|
-
}
|
|
94
|
-
else {
|
|
95
|
-
// En SSR, leemos desde window que fue inyectado por el servidor
|
|
96
|
-
if (typeof window !== 'undefined' && window.__RUNTIME_CONFIG__ && !this._isLoaded) {
|
|
97
|
-
this._config = window.__RUNTIME_CONFIG__;
|
|
98
|
-
this._isLoaded = true;
|
|
99
|
-
this.configSubject.next(this._config);
|
|
100
|
-
return of(this._config);
|
|
101
|
-
}
|
|
102
|
-
// Fallback para SSR si no hay config inyectada
|
|
103
|
-
// En el servidor, las variables de entorno se configuran desde el server.ts
|
|
104
|
-
const fallbackConfig = {
|
|
105
|
-
apiUrl: 'https://elden-preprod.backend.easycommerce.com.ar/',
|
|
106
|
-
appEnv: 'preprod',
|
|
107
|
-
production: false,
|
|
108
|
-
locale: 'es_AR',
|
|
109
|
-
channel: 'minorista'
|
|
110
|
-
};
|
|
111
|
-
this._config = fallbackConfig;
|
|
112
|
-
this._isLoaded = true;
|
|
113
|
-
this.configSubject.next(fallbackConfig);
|
|
114
|
-
return of(fallbackConfig);
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
/**
|
|
118
|
-
* Obtiene la configuración actual (síncrono)
|
|
119
|
-
*/
|
|
120
|
-
getConfig() {
|
|
121
|
-
return this._config;
|
|
122
|
-
}
|
|
123
|
-
/**
|
|
124
|
-
* Obtiene la API URL actual
|
|
125
|
-
*/
|
|
126
|
-
getApiUrl() {
|
|
127
|
-
return this._config?.apiUrl || 'https://elden-preprod.backend.easycommerce.com.ar/';
|
|
128
|
-
}
|
|
129
|
-
/**
|
|
130
|
-
* Obtiene la Frontend URL actual
|
|
131
|
-
*/
|
|
132
|
-
getFrontendUrl() {
|
|
133
|
-
return this._config?.frontendUrl;
|
|
134
|
-
}
|
|
135
|
-
/**
|
|
136
|
-
* Obtiene el entorno actual
|
|
137
|
-
*/
|
|
138
|
-
getAppEnv() {
|
|
139
|
-
return this._config?.appEnv || 'development';
|
|
140
|
-
}
|
|
141
|
-
/**
|
|
142
|
-
* Verifica si estamos en producción
|
|
143
|
-
*/
|
|
144
|
-
isProduction() {
|
|
145
|
-
return this._config?.production || false;
|
|
146
|
-
}
|
|
147
|
-
/**
|
|
148
|
-
* Obtiene el locale actual
|
|
149
|
-
*/
|
|
150
|
-
getLocale() {
|
|
151
|
-
return this._config?.locale || 'es_AR';
|
|
152
|
-
}
|
|
153
|
-
/**
|
|
154
|
-
* Obtiene el canal actual
|
|
155
|
-
*/
|
|
156
|
-
getChannel() {
|
|
157
|
-
return this._config?.channel || 'minorista';
|
|
158
|
-
}
|
|
159
|
-
/**
|
|
160
|
-
* Método helper para construir URLs de API
|
|
161
|
-
*/
|
|
162
|
-
buildApiUrl(endpoint) {
|
|
163
|
-
const apiUrl = this.getApiUrl();
|
|
164
|
-
const cleanEndpoint = endpoint.startsWith('/') ? endpoint.slice(1) : endpoint;
|
|
165
|
-
return `${apiUrl}${cleanEndpoint}`;
|
|
166
|
-
}
|
|
167
|
-
/**
|
|
168
|
-
* Método helper para construir URLs del frontend
|
|
169
|
-
*/
|
|
170
|
-
buildFrontendUrl(path) {
|
|
171
|
-
const frontendUrl = this.getFrontendUrl();
|
|
172
|
-
if (!frontendUrl) {
|
|
173
|
-
return path;
|
|
174
|
-
}
|
|
175
|
-
const cleanPath = path.startsWith('/') ? path.slice(1) : path;
|
|
176
|
-
return `${frontendUrl}${cleanPath}`;
|
|
177
|
-
}
|
|
178
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RuntimeConfigService, deps: [{ token: PLATFORM_ID }, { token: i1.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
179
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RuntimeConfigService, providedIn: 'root' });
|
|
180
|
-
}
|
|
181
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RuntimeConfigService, decorators: [{
|
|
182
|
-
type: Injectable,
|
|
183
|
-
args: [{
|
|
184
|
-
providedIn: 'root'
|
|
185
|
-
}]
|
|
186
|
-
}], ctorParameters: () => [{ type: Object, decorators: [{
|
|
187
|
-
type: Inject,
|
|
188
|
-
args: [PLATFORM_ID]
|
|
189
|
-
}] }, { type: i1.HttpClient }] });
|
|
190
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS1jb25maWcuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWVhc3ljb21tZXJjZS12MTgvc3JjL2xpYi9lYy1zZXJ2aWNlcy9ydW50aW1lLWNvbmZpZy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUVwRCxPQUFPLEVBQWMsRUFBRSxFQUFFLGVBQWUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN2RCxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7O0FBUTlELE1BQU0sT0FBTyxvQkFBb0I7SUFTQTtJQUNyQjtJQVRGLGFBQWEsR0FBRyxJQUFJLGVBQWUsQ0FBdUIsSUFBSSxDQUFDLENBQUM7SUFDakUsT0FBTyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLENBQUM7SUFFM0MsT0FBTyxHQUF5QixJQUFJLENBQUM7SUFDckMsWUFBWSxHQUFxQyxJQUFJLENBQUM7SUFDdEQsU0FBUyxHQUFHLEtBQUssQ0FBQztJQUUxQixZQUMrQixVQUFrQixFQUN2QyxJQUFnQjtRQURLLGVBQVUsR0FBVixVQUFVLENBQVE7UUFDdkMsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUV4QixtRkFBbUY7UUFDbkYsSUFBSSxPQUFPLE1BQU0sS0FBSyxXQUFXLElBQUksTUFBTSxDQUFDLGtCQUFrQixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2xGLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixDQUFDO1lBQ3pDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1lBQ3RCLElBQUks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Q0FBQztZQUNqQixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFDRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDOUQsT0FBTyxHQUFHLFdBQVcsR0FBRyxTQUFTLEVBQUUsQ0FBQztJQUN0QyxDQUFDO3dHQS9MVSxvQkFBb0Isa0JBU3JCLFdBQVc7NEdBVFYsb0JBQW9CLGNBRm5CLE1BQU07OzRGQUVQLG9CQUFvQjtrQkFIaEMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7OzBCQVVJLE1BQU07MkJBQUMsV0FBVyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIEluamVjdCwgUExBVEZPUk1fSUQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGlzUGxhdGZvcm1Ccm93c2VyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiwgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCB0YXAsIHNoYXJlUmVwbGF5IH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgUnVudGltZUNvbmZpZyB9IGZyb20gJy4uL2ludGVyZmFjZXMvcnVudGltZS1jb25maWcnO1xuXG5kZWNsYXJlIGNvbnN0IHdpbmRvdzogYW55O1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBSdW50aW1lQ29uZmlnU2VydmljZSB7XG4gIHByaXZhdGUgY29uZmlnU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8UnVudGltZUNvbmZpZyB8IG51bGw+KG51bGwpO1xuICBwdWJsaWMgY29uZmlnJCA9IHRoaXMuY29uZmlnU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgXG4gIHByaXZhdGUgX2NvbmZpZzogUnVudGltZUNvbmZpZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIF9sb2FkUHJvbWlzZTogT2JzZXJ2YWJsZTxSdW50aW1lQ29uZmlnPiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIF9pc0xvYWRlZCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoUExBVEZPUk1fSUQpIHByaXZhdGUgcGxhdGZvcm1JZDogT2JqZWN0LFxuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudFxuICApIHtcbiAgICAvLyBFbiBTU1IgbyBicm93c2VyLCBpbnRlbnRhciBjYXJnYXIgaW5tZWRpYXRhbWVudGUgZGVzZGUgd2luZG93IHNpIGVzdMOhIGRpc3BvbmlibGVcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93Ll9fUlVOVElNRV9DT05GSUdfXyAmJiAhdGhpcy5faXNMb2FkZWQpIHtcbiAgICAgIHRoaXMuX2NvbmZpZyA9IHdpbmRvdy5fX1JVTlRJTUVfQ09ORklHX187XG4gICAgICB0aGlzLl9pc0xvYWRlZCA9IHRydWU7XG4gICAgICB0aGlzLmNvbmZpZ1N1YmplY3QubmV4dCh0aGlzLl9jb25maWcpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbmljaWFsaXphY2nDs24gw7puaWNhIC0gbGxhbWFkYSBwb3IgQVBQX0lOSVRJQUxJWkVSXG4gICAqIEdhcmFudGl6YSBxdWUgbGEgY29uZmlndXJhY2nDs24gc2UgY2FyZ2Egc29sbyB1bmEgdmV6IGFsIGluaWNpb1xuICAgKi9cbiAgaW5pdGlhbGl6ZSgpOiBQcm9taXNlPFJ1bnRpbWVDb25maWc+IHtcbiAgICBpZiAodGhpcy5faXNMb2FkZWQgJiYgdGhpcy5fY29uZmlnKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX2NvbmZpZyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMubG9hZENvbmZpZygpLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IChjb25maWc6IFJ1bnRpbWVDb25maWcpID0+IHtcbiAgICAgICAgICB0aGlzLl9pc0xvYWRlZCA9IHRydWU7XG4gICAgICAgICAgcmVzb2x2ZShjb25maWcpO1xuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2FyZ2EgbGEgY29uZmlndXJhY2nDs24gZW4gcnVudGltZSAob3B0aW1pemFkYSBwYXJhIHVuYSBzb2xhIGNhcmdhKVxuICAgKiAtIEVuIFNTUjogTGVlIGRlc2RlIGVsIG9iamV0byB3aW5kb3cgaW55ZWN0YWRvIHBvciBlbCBzZXJ2aWRvclxuICAgKiAtIEVuIEJyb3dzZXI6IEhhY2UgcGV0aWNpw7NuIEhUVFAgYSAvcnVudGltZS1jb25maWcuanNvbiAoc29sbyBzaSBubyBlc3TDoSBlbiB3aW5kb3cpXG4gICAqL1xuICBsb2FkQ29uZmlnKCk6IE9ic2VydmFibGU8UnVudGltZUNvbmZpZz4ge1xuICAgIC8vIFNpIHlhIHRlbmVtb3MgbGEgY29uZmlnIGNhcmdhZGEsIGxhIGRldm9sdmVtb3MgaW5tZWRpYXRhbWVudGVcbiAgICBpZiAodGhpcy5faXNMb2FkZWQgJiYgdGhpcy5fY29uZmlnKSB7XG4gICAgICByZXR1cm4gb2YodGhpcy5fY29uZmlnIGFzIFJ1bnRpbWVDb25maWcpO1xuICAgIH1cblxuICAgIC8vIFNpIHlhIGhheSB1bmEgY2FyZ2EgZW4gcHJvZ3Jlc28sIHJldXRpbGl6YW1vcyBlc2EgcGV0aWNpw7NuXG4gICAgaWYgKHRoaXMuX2xvYWRQcm9taXNlKSB7XG4gICAgICByZXR1cm4gdGhpcy5fbG9hZFByb21pc2U7XG4gICAgfVxuXG4gICAgaWYgKGlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHtcbiAgICAgIC8vIEVuIGVsIG5hdmVnYWRvciwgcHJpbWVybyBpbnRlbnRhbW9zIG9idGVuZXIgbGEgY29uZmlnIGRlc2RlIHdpbmRvd1xuICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5fX1JVTlRJTUVfQ09ORklHX18gJiYgIXRoaXMuX2lzTG9hZGVkKSB7XG4gICAgICAgIHRoaXMuX2NvbmZpZyA9IHdpbmRvdy5fX1JVTlRJTUVfQ09ORklHX187XG4gICAgICAgIHRoaXMuX2lzTG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5jb25maWdTdWJqZWN0Lm5leHQodGhpcy5fY29uZmlnKTtcbiAgICAgICAgcmV0dXJuIG9mKHRoaXMuX2NvbmZpZyBhcyBSdW50aW1lQ29uZmlnKTtcbiAgICAgIH1cblxuICAgICAgLy8gU2kgbm8gZXN0w6EgZW4gd2luZG93LCBoYWNlbW9zIHBldGljacOzbiBIVFRQIChzb2xvIHVuYSB2ZXopXG4gICAgICB0aGlzLl9sb2FkUHJvbWlzZSA9IHRoaXMuaHR0cC5nZXQ8UnVudGltZUNvbmZpZz4oJy9ydW50aW1lLWNvbmZpZy5qc29uJykucGlwZShcbiAgICAgICAgdGFwKGNvbmZpZyA9PiB7XG4gICAgICAgICAgdGhpcy5fY29uZmlnID0gY29uZmlnO1xuICAgICAgICAgIHRoaXMuX2lzTG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLmNvbmZpZ1N1YmplY3QubmV4dChjb25maWcpO1xuICAgICAgICAgIC8vIEd1YXJkYW1vcyBlbiB3aW5kb3cgcGFyYSBzaWd1aWVudGVzIGFjY2Vzb3NcbiAgICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHdpbmRvdy5fX1JVTlRJTUVfQ09ORklHX18gPSBjb25maWc7XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICAgc2hhcmVSZXBsYXkoMSksIC8vIENhY2hlIGxhIHJlc3B1ZXN0YSBwYXJhIG3Dumx0aXBsZXMgc3VzY3JpcGNpb25lc1xuICAgICAgICBjYXRjaEVycm9yKGVycm9yID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBsb2FkaW5nIHJ1bnRpbWUgY29uZmlnOicsIGVycm9yKTtcbiAgICAgICAgICAvLyBGYWxsYmFjayBjb25maWcgc2kgZmFsbGEgbGEgY2FyZ2FcbiAgICAgICAgICBjb25zdCBmYWxsYmFja0NvbmZpZzogUnVudGltZUNvbmZpZyA9IHtcbiAgICAgICAgICAgIGFwaVVybDogJ2h0dHBzOi8vZWxkZW4tcHJlcHJvZC5iYWNrZW5kLmVhc3ljb21tZXJjZS5jb20uYXIvJyxcbiAgICAgICAgICAgIGFwcEVudjogJ3ByZXByb2QnLFxuICAgICAgICAgICAgcHJvZHVjdGlvbjogZmFsc2UsXG4gICAgICAgICAgICBsb2NhbGU6ICdlc19BUicsXG4gICAgICAgICAgICBjaGFubmVsOiAnbWlub3Jpc3RhJ1xuICAgICAgICAgIH07XG4gICAgICAgICAgdGhpcy5fY29uZmlnID0gZmFsbGJhY2tDb25maWc7XG4gICAgICAgICAgdGhpcy5faXNMb2FkZWQgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuY29uZmlnU3ViamVjdC5uZXh0KGZhbGxiYWNrQ29uZmlnKTtcbiAgICAgICAgICByZXR1cm4gb2YoZmFsbGJhY2tDb25maWcpO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICAgIFxuICAgICAgcmV0dXJuIHRoaXMuX2xvYWRQcm9taXNlO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBFbiBTU1IsIGxlZW1vcyBkZXNkZSB3aW5kb3cgcXVlIGZ1ZSBpbnllY3RhZG8gcG9yIGVsIHNlcnZpZG9yXG4gICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93Ll9fUlVOVElNRV9DT05GSUdfXyAmJiAhdGhpcy5faXNMb2FkZWQpIHtcbiAgICAgICAgdGhpcy5fY29uZmlnID0gd2luZG93Ll9fUlVOVElNRV9DT05GSUdfXztcbiAgICAgICAgdGhpcy5faXNMb2FkZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmNvbmZpZ1N1YmplY3QubmV4dCh0aGlzLl9jb25maWcpO1xuICAgICAgICByZXR1cm4gb2YodGhpcy5fY29uZmlnIGFzIFJ1bnRpbWVDb25maWcpO1xuICAgICAgfVxuXG4gICAgICAvLyBGYWxsYmFjayBwYXJhIFNTUiBzaSBubyBoYXkgY29uZmlnIGlueWVjdGFkYVxuICAgICAgLy8gRW4gZWwgc2Vydmlkb3IsIGxhcyB2YXJpYWJsZXMgZGUgZW50b3JubyBzZSBjb25maWd1cmFuIGRlc2RlIGVsIHNlcnZlci50c1xuICAgICAgY29uc3QgZmFsbGJhY2tDb25maWc6IFJ1bnRpbWVDb25maWcgPSB7XG4gICAgICAgIGFwaVVybDogJ2h0dHBzOi8vZWxkZW4tcHJlcHJvZC5iYWNrZW5kLmVhc3ljb21tZXJjZS5jb20uYXIvJyxcbiAgICAgICAgYXBwRW52OiAncHJlcHJvZCcsXG4gICAgICAgIHByb2R1Y3Rpb246IGZhbHNlLFxuICAgICAgICBsb2NhbGU6ICdlc19BUicsXG4gICAgICAgIGNoYW5uZWw6ICdtaW5vcmlzdGEnXG4gICAgICB9O1xuICAgICAgXG4gICAgICB0aGlzLl9jb25maWcgPSBmYWxsYmFja0NvbmZpZztcbiAgICAgIHRoaXMuX2lzTG9hZGVkID0gdHJ1ZTtcbiAgICAgIHRoaXMuY29uZmlnU3ViamVjdC5uZXh0KGZhbGxiYWNrQ29uZmlnKTtcbiAgICAgIHJldHVybiBvZihmYWxsYmFja0NvbmZpZyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE9idGllbmUgbGEgY29uZmlndXJhY2nDs24gYWN0dWFsIChzw61uY3Jvbm8pXG4gICAqL1xuICBnZXRDb25maWcoKTogUnVudGltZUNvbmZpZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9jb25maWc7XG4gIH1cblxuICAvKipcbiAgICogT2J0aWVuZSBsYSBBUEkgVVJMIGFjdHVhbFxuICAgKi9cbiAgZ2V0QXBpVXJsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZz8uYXBpVXJsIHx8ICdodHRwczovL2VsZGVuLXByZXByb2QuYmFja2VuZC5lYXN5Y29tbWVyY2UuY29tLmFyLyc7XG4gIH1cblxuICAvKipcbiAgICogT2J0aWVuZSBsYSBGcm9udGVuZCBVUkwgYWN0dWFsXG4gICAqL1xuICBnZXRGcm9udGVuZFVybCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9jb25maWc/LmZyb250ZW5kVXJsO1xuICB9XG5cbiAgLyoqXG4gICAqIE9idGllbmUgZWwgZW50b3JubyBhY3R1YWxcbiAgICovXG4gIGdldEFwcEVudigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jb25maWc/LmFwcEVudiB8fCAnZGV2ZWxvcG1lbnQnO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWNhIHNpIGVzdGFtb3MgZW4gcHJvZHVjY2nDs25cbiAgICovXG4gIGlzUHJvZHVjdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fY29uZmlnPy5wcm9kdWN0aW9uIHx8IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIE9idGllbmUgZWwgbG9jYWxlIGFjdHVhbFxuICAgKi9cbiAgZ2V0TG9jYWxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZz8ubG9jYWxlIHx8ICdlc19BUic7XG4gIH1cblxuICAvKipcbiAgICogT2J0aWVuZSBlbCBjYW5hbCBhY3R1YWxcbiAgICovXG4gIGdldENoYW5uZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fY29uZmlnPy5jaGFubmVsIHx8ICdtaW5vcmlzdGEnO1xuICB9XG5cbiAgLyoqXG4gICAqIE3DqXRvZG8gaGVscGVyIHBhcmEgY29uc3RydWlyIFVSTHMgZGUgQVBJXG4gICAqL1xuICBidWlsZEFwaVVybChlbmRwb2ludDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBhcGlVcmwgPSB0aGlzLmdldEFwaVVybCgpO1xuICAgIGNvbnN0IGNsZWFuRW5kcG9pbnQgPSBlbmRwb2ludC5zdGFydHNXaXRoKCcvJykgPyBlbmRwb2ludC5zbGljZSgxKSA6IGVuZHBvaW50O1xuICAgIHJldHVybiBgJHthcGlVcmx9JHtjbGVhbkVuZHBvaW50fWA7XG4gIH1cblxuICAvKipcbiAgICogTcOpdG9kbyBoZWxwZXIgcGFyYSBjb25zdHJ1aXIgVVJMcyBkZWwgZnJvbnRlbmRcbiAgICovXG4gIGJ1aWxkRnJvbnRlbmRVcmwocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBmcm9udGVuZFVybCA9IHRoaXMuZ2V0RnJvbnRlbmRVcmwoKTtcbiAgICBpZiAoIWZyb250ZW5kVXJsKSB7XG4gICAgICByZXR1cm4gcGF0aDtcbiAgICB9XG4gICAgY29uc3QgY2xlYW5QYXRoID0gcGF0aC5zdGFydHNXaXRoKCcvJykgPyBwYXRoLnNsaWNlKDEpIDogcGF0aDtcbiAgICByZXR1cm4gYCR7ZnJvbnRlbmRVcmx9JHtjbGVhblBhdGh9YDtcbiAgfVxufSJdfQ==
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import { inject } from '@angular/core';
|
|
2
|
-
import { RuntimeConfigService } from '../ec-services/runtime-config.service';
|
|
3
|
-
import { switchMap, take, filter } from 'rxjs/operators';
|
|
4
|
-
/**
|
|
5
|
-
* Interceptor que garantiza que las peticiones HTTP no se hagan hasta que
|
|
6
|
-
* el runtime config esté completamente cargado
|
|
7
|
-
* Evita que se hagan peticiones con URLs incorrectas
|
|
8
|
-
*/
|
|
9
|
-
export const runtimeConfigInterceptor = (req, next) => {
|
|
10
|
-
const runtimeConfigService = inject(RuntimeConfigService);
|
|
11
|
-
// Si la petición es para obtener el runtime config, la dejamos pasar inmediatamente
|
|
12
|
-
if (req.url.includes('/runtime-config.json')) {
|
|
13
|
-
return next(req);
|
|
14
|
-
}
|
|
15
|
-
// Si la petición es para assets estáticos, la dejamos pasar
|
|
16
|
-
if (req.url.includes('/assets/') || req.url.includes('.json') || req.url.includes('.css') || req.url.includes('.js')) {
|
|
17
|
-
return next(req);
|
|
18
|
-
}
|
|
19
|
-
// Para las demás peticiones, esperamos a que el config esté listo
|
|
20
|
-
return runtimeConfigService.config$.pipe(filter(config => config !== null), // Esperamos hasta que haya config
|
|
21
|
-
take(1), // Solo tomamos el primer valor válido
|
|
22
|
-
switchMap(config => {
|
|
23
|
-
// Si la URL ya es completa (empieza con http), la dejamos como está
|
|
24
|
-
if (req.url.startsWith('http')) {
|
|
25
|
-
return next(req);
|
|
26
|
-
}
|
|
27
|
-
// Si es una URL relativa que debería ir al API, la completamos
|
|
28
|
-
if (req.url.startsWith('/api/') || req.url.startsWith('api/')) {
|
|
29
|
-
const apiUrl = config.apiUrl;
|
|
30
|
-
const cleanUrl = req.url.startsWith('/') ? req.url.substring(1) : req.url;
|
|
31
|
-
const fullUrl = `${apiUrl}${cleanUrl}`;
|
|
32
|
-
const modifiedReq = req.clone({
|
|
33
|
-
url: fullUrl
|
|
34
|
-
});
|
|
35
|
-
return next(modifiedReq);
|
|
36
|
-
}
|
|
37
|
-
// Para otras URLs, las dejamos pasar sin modificar
|
|
38
|
-
return next(req);
|
|
39
|
-
}));
|
|
40
|
-
};
|
|
41
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS1jb25maWcuaW50ZXJjZXB0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1lYXN5Y29tbWVyY2UtdjE4L3NyYy9saWIvaW50ZXJjZXB0b3JzL3J1bnRpbWUtY29uZmlnLmludGVyY2VwdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDN0UsT0FBTyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFekQ7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFzQixDQUFDLEdBQXlCLEVBQUUsSUFBbUIsRUFBRSxFQUFFO0lBQzVHLE1BQU0sb0JBQW9CLEdBQUcsTUFBTSxDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFFMUQsb0ZBQW9GO0lBQ3BGLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsc0JBQXNCLENBQUMsRUFBRSxDQUFDO1FBQzdDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ25CLENBQUM7SUFFRCw0REFBNEQ7SUFDNUQsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3JILE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ25CLENBQUM7SUFFRCxrRUFBa0U7SUFDbEUsT0FBTyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUN0QyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLEVBQUUsa0NBQWtDO0lBQ3JFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxzQ0FBc0M7SUFDL0MsU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1FBQ2pCLG9FQUFvRTtRQUNwRSxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDL0IsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbkIsQ0FBQztRQUVELCtEQUErRDtRQUMvRCxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDOUQsTUFBTSxNQUFNLEdBQUcsTUFBTyxDQUFDLE1BQU0sQ0FBQztZQUM5QixNQUFNLFFBQVEsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7WUFDMUUsTUFBTSxPQUFPLEdBQUcsR0FBRyxNQUFNLEdBQUcsUUFBUSxFQUFFLENBQUM7WUFFdkMsTUFBTSxXQUFXLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQztnQkFDNUIsR0FBRyxFQUFFLE9BQU87YUFDYixDQUFDLENBQUM7WUFFSCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMzQixDQUFDO1FBRUQsbURBQW1EO1FBQ25ELE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ25CLENBQUMsQ0FBQyxDQUNILENBQUM7QUFDSixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwSW50ZXJjZXB0b3JGbiwgSHR0cFJlcXVlc3QsIEh0dHBIYW5kbGVyRm4gfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJ1bnRpbWVDb25maWdTZXJ2aWNlIH0gZnJvbSAnLi4vZWMtc2VydmljZXMvcnVudGltZS1jb25maWcuc2VydmljZSc7XG5pbXBvcnQgeyBzd2l0Y2hNYXAsIHRha2UsIGZpbHRlciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuLyoqXG4gKiBJbnRlcmNlcHRvciBxdWUgZ2FyYW50aXphIHF1ZSBsYXMgcGV0aWNpb25lcyBIVFRQIG5vIHNlIGhhZ2FuIGhhc3RhIHF1ZSBcbiAqIGVsIHJ1bnRpbWUgY29uZmlnIGVzdMOpIGNvbXBsZXRhbWVudGUgY2FyZ2Fkb1xuICogRXZpdGEgcXVlIHNlIGhhZ2FuIHBldGljaW9uZXMgY29uIFVSTHMgaW5jb3JyZWN0YXNcbiAqL1xuZXhwb3J0IGNvbnN0IHJ1bnRpbWVDb25maWdJbnRlcmNlcHRvcjogSHR0cEludGVyY2VwdG9yRm4gPSAocmVxOiBIdHRwUmVxdWVzdDx1bmtub3duPiwgbmV4dDogSHR0cEhhbmRsZXJGbikgPT4ge1xuICBjb25zdCBydW50aW1lQ29uZmlnU2VydmljZSA9IGluamVjdChSdW50aW1lQ29uZmlnU2VydmljZSk7XG4gIFxuICAvLyBTaSBsYSBwZXRpY2nDs24gZXMgcGFyYSBvYnRlbmVyIGVsIHJ1bnRpbWUgY29uZmlnLCBsYSBkZWphbW9zIHBhc2FyIGlubWVkaWF0YW1lbnRlXG4gIGlmIChyZXEudXJsLmluY2x1ZGVzKCcvcnVudGltZS1jb25maWcuanNvbicpKSB7XG4gICAgcmV0dXJuIG5leHQocmVxKTtcbiAgfVxuICBcbiAgLy8gU2kgbGEgcGV0aWNpw7NuIGVzIHBhcmEgYXNzZXRzIGVzdMOhdGljb3MsIGxhIGRlamFtb3MgcGFzYXJcbiAgaWYgKHJlcS51cmwuaW5jbHVkZXMoJy9hc3NldHMvJykgfHwgcmVxLnVybC5pbmNsdWRlcygnLmpzb24nKSB8fCByZXEudXJsLmluY2x1ZGVzKCcuY3NzJykgfHwgcmVxLnVybC5pbmNsdWRlcygnLmpzJykpIHtcbiAgICByZXR1cm4gbmV4dChyZXEpO1xuICB9XG5cbiAgLy8gUGFyYSBsYXMgZGVtw6FzIHBldGljaW9uZXMsIGVzcGVyYW1vcyBhIHF1ZSBlbCBjb25maWcgZXN0w6kgbGlzdG9cbiAgcmV0dXJuIHJ1bnRpbWVDb25maWdTZXJ2aWNlLmNvbmZpZyQucGlwZShcbiAgICBmaWx0ZXIoY29uZmlnID0+IGNvbmZpZyAhPT0gbnVsbCksIC8vIEVzcGVyYW1vcyBoYXN0YSBxdWUgaGF5YSBjb25maWdcbiAgICB0YWtlKDEpLCAvLyBTb2xvIHRvbWFtb3MgZWwgcHJpbWVyIHZhbG9yIHbDoWxpZG9cbiAgICBzd2l0Y2hNYXAoY29uZmlnID0+IHtcbiAgICAgIC8vIFNpIGxhIFVSTCB5YSBlcyBjb21wbGV0YSAoZW1waWV6YSBjb24gaHR0cCksIGxhIGRlamFtb3MgY29tbyBlc3TDoVxuICAgICAgaWYgKHJlcS51cmwuc3RhcnRzV2l0aCgnaHR0cCcpKSB7XG4gICAgICAgIHJldHVybiBuZXh0KHJlcSk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIFNpIGVzIHVuYSBVUkwgcmVsYXRpdmEgcXVlIGRlYmVyw61hIGlyIGFsIEFQSSwgbGEgY29tcGxldGFtb3NcbiAgICAgIGlmIChyZXEudXJsLnN0YXJ0c1dpdGgoJy9hcGkvJykgfHwgcmVxLnVybC5zdGFydHNXaXRoKCdhcGkvJykpIHtcbiAgICAgICAgY29uc3QgYXBpVXJsID0gY29uZmlnIS5hcGlVcmw7XG4gICAgICAgIGNvbnN0IGNsZWFuVXJsID0gcmVxLnVybC5zdGFydHNXaXRoKCcvJykgPyByZXEudXJsLnN1YnN0cmluZygxKSA6IHJlcS51cmw7XG4gICAgICAgIGNvbnN0IGZ1bGxVcmwgPSBgJHthcGlVcmx9JHtjbGVhblVybH1gO1xuICAgICAgICBcbiAgICAgICAgY29uc3QgbW9kaWZpZWRSZXEgPSByZXEuY2xvbmUoe1xuICAgICAgICAgIHVybDogZnVsbFVybFxuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIHJldHVybiBuZXh0KG1vZGlmaWVkUmVxKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gUGFyYSBvdHJhcyBVUkxzLCBsYXMgZGVqYW1vcyBwYXNhciBzaW4gbW9kaWZpY2FyXG4gICAgICByZXR1cm4gbmV4dChyZXEpO1xuICAgIH0pXG4gICk7XG59OyJdfQ==
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
export {};
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS1jb25maWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1lYXN5Y29tbWVyY2UtdjE4L3NyYy9saWIvaW50ZXJmYWNlcy9ydW50aW1lLWNvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBSdW50aW1lQ29uZmlnIHtcbiAgYXBpVXJsOiBzdHJpbmc7XG4gIGZyb250ZW5kVXJsPzogc3RyaW5nO1xuICAvKiogQW1iaWVudGUgZGUgbGEgYXBsaWNhY2nDs24uIFZhbG9yZXMgdsOhbGlkb3M6ICdwcm9kJywgJ3ByZXByb2QnLCAndGVzdCcgKi9cbiAgYXBwRW52OiAncHJvZCcgfCAncHJlcHJvZCcgfCAndGVzdCc7XG4gIHByb2R1Y3Rpb246IGJvb2xlYW47XG4gIGxvY2FsZTogc3RyaW5nO1xuICBjaGFubmVsOiBzdHJpbmc7XG4gIHBvcnQ/OiBudW1iZXI7XG4gIGhvc3Q/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmVyRW52aXJvbm1lbnRWYXJpYWJsZXMge1xuICBBUElfVVJMPzogc3RyaW5nO1xuICBGUk9OVEVORF9VUkw/OiBzdHJpbmc7XG4gIC8qKiBBbWJpZW50ZSBkZSBsYSBhcGxpY2FjacOzbi4gVmFsb3JlcyB2w6FsaWRvczogJ3Byb2QnLCAncHJlcHJvZCcsICd0ZXN0JyAqL1xuICBBUFBfRU5WPzogJ3Byb2QnIHwgJ3ByZXByb2QnIHwgJ3Rlc3QnO1xuICBQT1JUPzogc3RyaW5nO1xuICBIT1NUPzogc3RyaW5nO1xuICBOT0RFX0VOVj86ICdkZXZlbG9wbWVudCcgfCAncHJvZHVjdGlvbic7XG4gIExPQ0FMRT86IHN0cmluZztcbiAgQ0hBTk5FTD86IHN0cmluZztcbn0iXX0=
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import { APP_INITIALIZER, makeEnvironmentProviders } from '@angular/core';
|
|
2
|
-
import { RuntimeConfigService } from '../ec-services/runtime-config.service';
|
|
3
|
-
/**
|
|
4
|
-
* Factory function para APP_INITIALIZER (OPTIMIZADA)
|
|
5
|
-
* Carga la configuración runtime UNA SOLA VEZ antes de que Angular bootstrap la aplicación
|
|
6
|
-
* Evita múltiples cargas y mejora el rendimiento
|
|
7
|
-
*/
|
|
8
|
-
export function initializeRuntimeConfig(runtimeConfigService) {
|
|
9
|
-
return () => {
|
|
10
|
-
console.log('🚀 Inicializando Runtime Config...');
|
|
11
|
-
return runtimeConfigService.initialize()
|
|
12
|
-
.then((config) => {
|
|
13
|
-
console.log('✅ Runtime config inicializado correctamente:', {
|
|
14
|
-
apiUrl: config.apiUrl,
|
|
15
|
-
appEnv: config.appEnv,
|
|
16
|
-
production: config.production
|
|
17
|
-
});
|
|
18
|
-
return config;
|
|
19
|
-
})
|
|
20
|
-
.catch((error) => {
|
|
21
|
-
console.error('❌ Error al inicializar runtime config:', error);
|
|
22
|
-
// Aún en caso de error, continuamos para no bloquear la app
|
|
23
|
-
return null;
|
|
24
|
-
});
|
|
25
|
-
};
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Función que configura el RuntimeConfigService y su inicialización
|
|
29
|
-
* Debe ser usado en app.config.ts junto con provideEnvironment
|
|
30
|
-
*/
|
|
31
|
-
export function provideRuntimeConfig() {
|
|
32
|
-
return makeEnvironmentProviders([
|
|
33
|
-
RuntimeConfigService,
|
|
34
|
-
{
|
|
35
|
-
provide: APP_INITIALIZER,
|
|
36
|
-
useFactory: initializeRuntimeConfig,
|
|
37
|
-
deps: [RuntimeConfigService],
|
|
38
|
-
multi: true
|
|
39
|
-
}
|
|
40
|
-
]);
|
|
41
|
-
}
|
|
42
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZVJ1bnRpbWVDb25maWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1lYXN5Y29tbWVyY2UtdjE4L3NyYy9saWIvcHJvdmlkZXJzL3Byb3ZpZGVSdW50aW1lQ29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxlQUFlLEVBQXdCLHdCQUF3QixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hHLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBRTdFOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsdUJBQXVCLENBQUMsb0JBQTBDO0lBQ2hGLE9BQU8sR0FBaUIsRUFBRTtRQUN4QixPQUFPLENBQUMsR0FBRyxDQUFDLG9DQUFvQyxDQUFDLENBQUM7UUFDbEQsT0FBTyxvQkFBb0IsQ0FBQyxVQUFVLEVBQUU7YUFDckMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDZixPQUFPLENBQUMsR0FBRyxDQUFDLDhDQUE4QyxFQUFFO2dCQUMxRCxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU07Z0JBQ3JCLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTTtnQkFDckIsVUFBVSxFQUFFLE1BQU0sQ0FBQyxVQUFVO2FBQzlCLENBQUMsQ0FBQztZQUNILE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUMsQ0FBQzthQUNELEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ2YsT0FBTyxDQUFDLEtBQUssQ0FBQyx3Q0FBd0MsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUMvRCw0REFBNEQ7WUFDNUQsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsb0JBQW9CO0lBQ2xDLE9BQU8sd0JBQXdCLENBQUM7UUFDOUIsb0JBQW9CO1FBQ3BCO1lBQ0UsT0FBTyxFQUFFLGVBQWU7WUFDeEIsVUFBVSxFQUFFLHVCQUF1QjtZQUNuQyxJQUFJLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQztZQUM1QixLQUFLLEVBQUUsSUFBSTtTQUNaO0tBQ0YsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFQUF9JTklUSUFMSVpFUiwgRW52aXJvbm1lbnRQcm92aWRlcnMsIG1ha2VFbnZpcm9ubWVudFByb3ZpZGVycyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUnVudGltZUNvbmZpZ1NlcnZpY2UgfSBmcm9tICcuLi9lYy1zZXJ2aWNlcy9ydW50aW1lLWNvbmZpZy5zZXJ2aWNlJztcblxuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIHBhcmEgQVBQX0lOSVRJQUxJWkVSIChPUFRJTUlaQURBKVxuICogQ2FyZ2EgbGEgY29uZmlndXJhY2nDs24gcnVudGltZSBVTkEgU09MQSBWRVogYW50ZXMgZGUgcXVlIEFuZ3VsYXIgYm9vdHN0cmFwIGxhIGFwbGljYWNpw7NuXG4gKiBFdml0YSBtw7psdGlwbGVzIGNhcmdhcyB5IG1lam9yYSBlbCByZW5kaW1pZW50b1xuICovXG5leHBvcnQgZnVuY3Rpb24gaW5pdGlhbGl6ZVJ1bnRpbWVDb25maWcocnVudGltZUNvbmZpZ1NlcnZpY2U6IFJ1bnRpbWVDb25maWdTZXJ2aWNlKTogKCkgPT4gUHJvbWlzZTxhbnk+IHtcbiAgcmV0dXJuICgpOiBQcm9taXNlPGFueT4gPT4ge1xuICAgIGNvbnNvbGUubG9nKCfwn5qAIEluaWNpYWxpemFuZG8gUnVudGltZSBDb25maWcuLi4nKTtcbiAgICByZXR1cm4gcnVudGltZUNvbmZpZ1NlcnZpY2UuaW5pdGlhbGl6ZSgpXG4gICAgICAudGhlbigoY29uZmlnKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKCfinIUgUnVudGltZSBjb25maWcgaW5pY2lhbGl6YWRvIGNvcnJlY3RhbWVudGU6Jywge1xuICAgICAgICAgIGFwaVVybDogY29uZmlnLmFwaVVybCxcbiAgICAgICAgICBhcHBFbnY6IGNvbmZpZy5hcHBFbnYsXG4gICAgICAgICAgcHJvZHVjdGlvbjogY29uZmlnLnByb2R1Y3Rpb25cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjb25maWc7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCfinYwgRXJyb3IgYWwgaW5pY2lhbGl6YXIgcnVudGltZSBjb25maWc6JywgZXJyb3IpO1xuICAgICAgICAvLyBBw7puIGVuIGNhc28gZGUgZXJyb3IsIGNvbnRpbnVhbW9zIHBhcmEgbm8gYmxvcXVlYXIgbGEgYXBwXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSk7XG4gIH07XG59XG5cbi8qKlxuICogRnVuY2nDs24gcXVlIGNvbmZpZ3VyYSBlbCBSdW50aW1lQ29uZmlnU2VydmljZSB5IHN1IGluaWNpYWxpemFjacOzblxuICogRGViZSBzZXIgdXNhZG8gZW4gYXBwLmNvbmZpZy50cyBqdW50byBjb24gcHJvdmlkZUVudmlyb25tZW50XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm92aWRlUnVudGltZUNvbmZpZygpOiBFbnZpcm9ubWVudFByb3ZpZGVycyB7XG4gIHJldHVybiBtYWtlRW52aXJvbm1lbnRQcm92aWRlcnMoW1xuICAgIFJ1bnRpbWVDb25maWdTZXJ2aWNlLFxuICAgIHtcbiAgICAgIHByb3ZpZGU6IEFQUF9JTklUSUFMSVpFUixcbiAgICAgIHVzZUZhY3Rvcnk6IGluaXRpYWxpemVSdW50aW1lQ29uZmlnLFxuICAgICAgZGVwczogW1J1bnRpbWVDb25maWdTZXJ2aWNlXSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfVxuICBdKTtcbn0iXX0=
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http';
|
|
2
|
-
import { Observable } from 'rxjs';
|
|
3
|
-
import { RuntimeConfigService } from './runtime-config.service';
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
export interface ApiRequestOptions {
|
|
6
|
-
headers?: HttpHeaders | {
|
|
7
|
-
[header: string]: string | string[];
|
|
8
|
-
};
|
|
9
|
-
params?: HttpParams | {
|
|
10
|
-
[param: string]: string | string[];
|
|
11
|
-
};
|
|
12
|
-
withCredentials?: boolean;
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
* Servicio base para realizar peticiones HTTP usando configuración dinámica
|
|
16
|
-
* Todos los servicios de la aplicación deben extender este servicio o usar sus métodos
|
|
17
|
-
*/
|
|
18
|
-
export declare class BaseApiService {
|
|
19
|
-
protected http: HttpClient;
|
|
20
|
-
protected runtimeConfigService: RuntimeConfigService;
|
|
21
|
-
constructor(http: HttpClient, runtimeConfigService: RuntimeConfigService);
|
|
22
|
-
/**
|
|
23
|
-
* Construye una URL completa usando la API_URL del runtime
|
|
24
|
-
*/
|
|
25
|
-
protected buildApiUrl(endpoint: string): string;
|
|
26
|
-
/**
|
|
27
|
-
* Obtiene headers comunes que incluyen información del runtime
|
|
28
|
-
*/
|
|
29
|
-
protected getCommonHeaders(): HttpHeaders;
|
|
30
|
-
/**
|
|
31
|
-
* Método GET genérico
|
|
32
|
-
*/
|
|
33
|
-
get<T>(endpoint: string, options?: ApiRequestOptions): Observable<T>;
|
|
34
|
-
/**
|
|
35
|
-
* Método POST genérico
|
|
36
|
-
*/
|
|
37
|
-
post<T>(endpoint: string, data: any, options?: ApiRequestOptions): Observable<T>;
|
|
38
|
-
/**
|
|
39
|
-
* Método PUT genérico
|
|
40
|
-
*/
|
|
41
|
-
put<T>(endpoint: string, data: any, options?: ApiRequestOptions): Observable<T>;
|
|
42
|
-
/**
|
|
43
|
-
* Método PATCH genérico
|
|
44
|
-
*/
|
|
45
|
-
patch<T>(endpoint: string, data: any, options?: ApiRequestOptions): Observable<T>;
|
|
46
|
-
/**
|
|
47
|
-
* Método DELETE genérico
|
|
48
|
-
*/
|
|
49
|
-
delete<T>(endpoint: string, options?: ApiRequestOptions): Observable<T>;
|
|
50
|
-
/**
|
|
51
|
-
* Método para peticiones que necesitan esperar a que la config esté cargada
|
|
52
|
-
*/
|
|
53
|
-
getWithConfig<T>(endpoint: string, options?: ApiRequestOptions): Observable<T>;
|
|
54
|
-
/**
|
|
55
|
-
* Método para POST que necesitan esperar a que la config esté cargada
|
|
56
|
-
*/
|
|
57
|
-
postWithConfig<T>(endpoint: string, data: any, options?: ApiRequestOptions): Observable<T>;
|
|
58
|
-
/**
|
|
59
|
-
* Combina headers personalizados con los headers comunes
|
|
60
|
-
*/
|
|
61
|
-
private mergeHeaders;
|
|
62
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<BaseApiService, never>;
|
|
63
|
-
static ɵprov: i0.ɵɵInjectableDeclaration<BaseApiService>;
|
|
64
|
-
}
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
import { HttpClient } from '@angular/common/http';
|
|
2
|
-
import { Observable } from 'rxjs';
|
|
3
|
-
import { RuntimeConfig } from '../interfaces/runtime-config';
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
export declare class RuntimeConfigService {
|
|
6
|
-
private platformId;
|
|
7
|
-
private http;
|
|
8
|
-
private configSubject;
|
|
9
|
-
config$: Observable<RuntimeConfig | null>;
|
|
10
|
-
private _config;
|
|
11
|
-
private _loadPromise;
|
|
12
|
-
private _isLoaded;
|
|
13
|
-
constructor(platformId: Object, http: HttpClient);
|
|
14
|
-
/**
|
|
15
|
-
* Inicialización única - llamada por APP_INITIALIZER
|
|
16
|
-
* Garantiza que la configuración se carga solo una vez al inicio
|
|
17
|
-
*/
|
|
18
|
-
initialize(): Promise<RuntimeConfig>;
|
|
19
|
-
/**
|
|
20
|
-
* Carga la configuración en runtime (optimizada para una sola carga)
|
|
21
|
-
* - En SSR: Lee desde el objeto window inyectado por el servidor
|
|
22
|
-
* - En Browser: Hace petición HTTP a /runtime-config.json (solo si no está en window)
|
|
23
|
-
*/
|
|
24
|
-
loadConfig(): Observable<RuntimeConfig>;
|
|
25
|
-
/**
|
|
26
|
-
* Obtiene la configuración actual (síncrono)
|
|
27
|
-
*/
|
|
28
|
-
getConfig(): RuntimeConfig | null;
|
|
29
|
-
/**
|
|
30
|
-
* Obtiene la API URL actual
|
|
31
|
-
*/
|
|
32
|
-
getApiUrl(): string;
|
|
33
|
-
/**
|
|
34
|
-
* Obtiene la Frontend URL actual
|
|
35
|
-
*/
|
|
36
|
-
getFrontendUrl(): string | undefined;
|
|
37
|
-
/**
|
|
38
|
-
* Obtiene el entorno actual
|
|
39
|
-
*/
|
|
40
|
-
getAppEnv(): string;
|
|
41
|
-
/**
|
|
42
|
-
* Verifica si estamos en producción
|
|
43
|
-
*/
|
|
44
|
-
isProduction(): boolean;
|
|
45
|
-
/**
|
|
46
|
-
* Obtiene el locale actual
|
|
47
|
-
*/
|
|
48
|
-
getLocale(): string;
|
|
49
|
-
/**
|
|
50
|
-
* Obtiene el canal actual
|
|
51
|
-
*/
|
|
52
|
-
getChannel(): string;
|
|
53
|
-
/**
|
|
54
|
-
* Método helper para construir URLs de API
|
|
55
|
-
*/
|
|
56
|
-
buildApiUrl(endpoint: string): string;
|
|
57
|
-
/**
|
|
58
|
-
* Método helper para construir URLs del frontend
|
|
59
|
-
*/
|
|
60
|
-
buildFrontendUrl(path: string): string;
|
|
61
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<RuntimeConfigService, never>;
|
|
62
|
-
static ɵprov: i0.ɵɵInjectableDeclaration<RuntimeConfigService>;
|
|
63
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import { HttpInterceptorFn } from '@angular/common/http';
|
|
2
|
-
/**
|
|
3
|
-
* Interceptor que garantiza que las peticiones HTTP no se hagan hasta que
|
|
4
|
-
* el runtime config esté completamente cargado
|
|
5
|
-
* Evita que se hagan peticiones con URLs incorrectas
|
|
6
|
-
*/
|
|
7
|
-
export declare const runtimeConfigInterceptor: HttpInterceptorFn;
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
export interface RuntimeConfig {
|
|
2
|
-
apiUrl: string;
|
|
3
|
-
frontendUrl?: string;
|
|
4
|
-
/** Ambiente de la aplicación. Valores válidos: 'prod', 'preprod', 'test' */
|
|
5
|
-
appEnv: 'prod' | 'preprod' | 'test';
|
|
6
|
-
production: boolean;
|
|
7
|
-
locale: string;
|
|
8
|
-
channel: string;
|
|
9
|
-
port?: number;
|
|
10
|
-
host?: string;
|
|
11
|
-
}
|
|
12
|
-
export interface ServerEnvironmentVariables {
|
|
13
|
-
API_URL?: string;
|
|
14
|
-
FRONTEND_URL?: string;
|
|
15
|
-
/** Ambiente de la aplicación. Valores válidos: 'prod', 'preprod', 'test' */
|
|
16
|
-
APP_ENV?: 'prod' | 'preprod' | 'test';
|
|
17
|
-
PORT?: string;
|
|
18
|
-
HOST?: string;
|
|
19
|
-
NODE_ENV?: 'development' | 'production';
|
|
20
|
-
LOCALE?: string;
|
|
21
|
-
CHANNEL?: string;
|
|
22
|
-
}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { EnvironmentProviders } from '@angular/core';
|
|
2
|
-
import { RuntimeConfigService } from '../ec-services/runtime-config.service';
|
|
3
|
-
/**
|
|
4
|
-
* Factory function para APP_INITIALIZER (OPTIMIZADA)
|
|
5
|
-
* Carga la configuración runtime UNA SOLA VEZ antes de que Angular bootstrap la aplicación
|
|
6
|
-
* Evita múltiples cargas y mejora el rendimiento
|
|
7
|
-
*/
|
|
8
|
-
export declare function initializeRuntimeConfig(runtimeConfigService: RuntimeConfigService): () => Promise<any>;
|
|
9
|
-
/**
|
|
10
|
-
* Función que configura el RuntimeConfigService y su inicialización
|
|
11
|
-
* Debe ser usado en app.config.ts junto con provideEnvironment
|
|
12
|
-
*/
|
|
13
|
-
export declare function provideRuntimeConfig(): EnvironmentProviders;
|