ng-easycommerce-v18 0.3.18-beta.1 → 0.3.18-beta.2

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 CHANGED
@@ -1,3 +1,5 @@
1
+ # Version 0.3.18-beta.2
2
+ - Se optimizar y comenta codigo para que el runtime no sea un bucle y se haga antes de la primera carga
1
3
  # Version 0.3.18-beta.1
2
4
  - Se modifican servicios y componentes para que funcione el deploy SSR.
3
5
  - Se elimina uso de DOM ya que en SSR tira error.
@@ -1,7 +1,7 @@
1
1
  import { Injectable, Inject, PLATFORM_ID } from '@angular/core';
2
2
  import { isPlatformBrowser } from '@angular/common';
3
3
  import { of, BehaviorSubject } from 'rxjs';
4
- import { catchError, tap } from 'rxjs/operators';
4
+ import { catchError, tap, shareReplay } from 'rxjs/operators';
5
5
  import * as i0 from "@angular/core";
6
6
  import * as i1 from "@angular/common/http";
7
7
  export class RuntimeConfigService {
@@ -10,34 +10,71 @@ export class RuntimeConfigService {
10
10
  configSubject = new BehaviorSubject(null);
11
11
  config$ = this.configSubject.asObservable();
12
12
  _config = null;
13
+ _loadPromise = null;
14
+ _isLoaded = false;
13
15
  constructor(platformId, http) {
14
16
  this.platformId = platformId;
15
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
+ });
16
44
  }
17
45
  /**
18
- * Carga la configuración en runtime
46
+ * Carga la configuración en runtime (optimizada para una sola carga)
19
47
  * - En SSR: Lee desde el objeto window inyectado por el servidor
20
- * - En Browser: Hace petición HTTP a /runtime-config.json
48
+ * - En Browser: Hace petición HTTP a /runtime-config.json (solo si no está en window)
21
49
  */
22
50
  loadConfig() {
23
- // Si ya tenemos la config cargada, la devolvemos
24
- if (this._config) {
51
+ // Si ya tenemos la config cargada, la devolvemos inmediatamente
52
+ if (this._isLoaded && this._config) {
25
53
  return of(this._config);
26
54
  }
55
+ // Si ya hay una carga en progreso, reutilizamos esa petición
56
+ if (this._loadPromise) {
57
+ return this._loadPromise;
58
+ }
27
59
  if (isPlatformBrowser(this.platformId)) {
28
60
  // En el navegador, primero intentamos obtener la config desde window
29
- if (window.__RUNTIME_CONFIG__) {
61
+ if (typeof window !== 'undefined' && window.__RUNTIME_CONFIG__ && !this._isLoaded) {
30
62
  this._config = window.__RUNTIME_CONFIG__;
63
+ this._isLoaded = true;
31
64
  this.configSubject.next(this._config);
32
65
  return of(this._config);
33
66
  }
34
- // Si no está en window, hacemos petición HTTP
35
- return this.http.get('/runtime-config.json').pipe(tap(config => {
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 => {
36
69
  this._config = config;
70
+ this._isLoaded = true;
37
71
  this.configSubject.next(config);
38
72
  // Guardamos en window para siguientes accesos
39
- window.__RUNTIME_CONFIG__ = config;
40
- }), catchError(error => {
73
+ if (typeof window !== 'undefined') {
74
+ window.__RUNTIME_CONFIG__ = config;
75
+ }
76
+ }), shareReplay(1), // Cache la respuesta para múltiples suscripciones
77
+ catchError(error => {
41
78
  console.error('Error loading runtime config:', error);
42
79
  // Fallback config si falla la carga
43
80
  const fallbackConfig = {
@@ -48,14 +85,17 @@ export class RuntimeConfigService {
48
85
  channel: 'minorista'
49
86
  };
50
87
  this._config = fallbackConfig;
88
+ this._isLoaded = true;
51
89
  this.configSubject.next(fallbackConfig);
52
90
  return of(fallbackConfig);
53
91
  }));
92
+ return this._loadPromise;
54
93
  }
55
94
  else {
56
95
  // En SSR, leemos desde window que fue inyectado por el servidor
57
- if (typeof window !== 'undefined' && window.__RUNTIME_CONFIG__) {
96
+ if (typeof window !== 'undefined' && window.__RUNTIME_CONFIG__ && !this._isLoaded) {
58
97
  this._config = window.__RUNTIME_CONFIG__;
98
+ this._isLoaded = true;
59
99
  this.configSubject.next(this._config);
60
100
  return of(this._config);
61
101
  }
@@ -69,6 +109,7 @@ export class RuntimeConfigService {
69
109
  channel: 'minorista'
70
110
  };
71
111
  this._config = fallbackConfig;
112
+ this._isLoaded = true;
72
113
  this.configSubject.next(fallbackConfig);
73
114
  return of(fallbackConfig);
74
115
  }
@@ -146,4 +187,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
146
187
  type: Inject,
147
188
  args: [PLATFORM_ID]
148
189
  }] }, { type: i1.HttpClient }] });
149
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS1jb25maWcuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWVhc3ljb21tZXJjZS12MTgvc3JjL2xpYi9lYy1zZXJ2aWNlcy9ydW50aW1lLWNvbmZpZy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUVwRCxPQUFPLEVBQWMsRUFBRSxFQUFFLGVBQWUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN2RCxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7QUFRakQsTUFBTSxPQUFPLG9CQUFvQjtJQU9BO0lBQ3JCO0lBUEYsYUFBYSxHQUFHLElBQUksZUFBZSxDQUF1QixJQUFJLENBQUMsQ0FBQztJQUNqRSxPQUFPLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUUzQyxPQUFPLEdBQXlCLElBQUksQ0FBQztJQUU3QyxZQUMrQixVQUFrQixFQUN2QyxJQUFnQjtRQURLLGVBQVUsR0FBVixVQUFVLENBQVE7UUFDdkMsU0FBSSxHQUFKLElBQUksQ0FBWTtJQUN2QixDQUFDO0lBRUo7Ozs7T0FJRztJQUNILFVBQVU7UUFDUixpREFBaUQ7UUFDakQsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakIsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQXdCLENBQUMsQ0FBQztRQUMzQyxDQUFDO1FBRUQsSUFBSSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUN2QyxxRUFBcUU7WUFDckUsSUFBSSxNQUFNLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztnQkFDOUIsSUFBSSxDQUFD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ICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgaXNQbGF0Zm9ybUJyb3dzZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiwgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGNhdGNoRXJyb3IsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgUnVudGltZUNvbmZpZyB9IGZyb20gJy4uL2ludGVyZmFjZXMvcnVudGltZS1jb25maWcnO1xyXG5cclxuZGVjbGFyZSBjb25zdCB3aW5kb3c6IGFueTtcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIFJ1bnRpbWVDb25maWdTZXJ2aWNlIHtcclxuICBwcml2YXRlIGNvbmZpZ1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFJ1bnRpbWVDb25maWcgfCBudWxsPihudWxsKTtcclxuICBwdWJsaWMgY29uZmlnJCA9IHRoaXMuY29uZmlnU3ViamVjdC5hc09ic2VydmFibGUoKTtcclxuICBcclxuICBwcml2YXRlIF9jb25maWc6IFJ1bnRpbWVDb25maWcgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBASW5qZWN0KFBMQVRGT1JNX0lEKSBwcml2YXRlIHBsYXRmb3JtSWQ6IE9iamVjdCxcclxuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudFxyXG4gICkge31cclxuXHJcbiAgLyoqXHJcbiAgICogQ2FyZ2EgbGEgY29uZmlndXJhY2nDs24gZW4gcnVudGltZVxyXG4gICAqIC0gRW4gU1NSOiBMZWUgZGVzZGUgZWwgb2JqZXRvIHdpbmRvdyBpbnllY3RhZG8gcG9yIGVsIHNlcnZpZG9yXHJcbiAgICogLSBFbiBCcm93c2VyOiBIYWNlIHBldGljacOzbiBIVFRQIGEgL3J1bnRpbWUtY29uZmlnLmpzb25cclxuICAgKi9cclxuICBsb2FkQ29uZmlnKCk6IE9ic2VydmFibGU8UnVudGltZUNvbmZpZz4ge1xyXG4gICAgLy8gU2kgeWEgdGVuZW1vcyBsYSBjb25maWcgY2FyZ2FkYSwgbGEgZGV2b2x2ZW1vc1xyXG4gICAgaWYgKHRoaXMuX2NvbmZpZykge1xyXG4gICAgICByZXR1cm4gb2YodGhpcy5fY29uZmlnIGFzIFJ1bnRpbWVDb25maWcpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSB7XHJcbiAgICAgIC8vIEVuIGVsIG5hdmVnYWRvciwgcHJpbWVybyBpbnRlbnRhbW9zIG9idGVuZXIgbGEgY29uZmlnIGRlc2RlIHdpbmRvd1xyXG4gICAgICBpZiAod2luZG93Ll9fUlVOVElNRV9DT05GSUdfXykge1xyXG4gICAgICAgIHRoaXMuX2NvbmZpZyA9IHdpbmRvdy5fX1JVTlRJTUVfQ09ORklHX187XHJcbiAgICAgICAgdGhpcy5jb25maWdTdWJqZWN0Lm5leHQodGhpcy5fY29uZmlnKTtcclxuICAgICAgICByZXR1cm4gb2YodGhpcy5fY29uZmlnIGFzIFJ1bnRpbWVDb25maWcpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBTaSBubyBlc3TDoSBlbiB3aW5kb3csIGhhY2Vtb3MgcGV0aWNpw7NuIEhUVFBcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8UnVudGltZUNvbmZpZz4oJy9ydW50aW1lLWNvbmZpZy5qc29uJykucGlwZShcclxuICAgICAgICB0YXAoY29uZmlnID0+IHtcclxuICAgICAgICAgIHRoaXMuX2NvbmZpZyA9IGNvbmZpZztcclxuICAgICAgICAgIHRoaXMuY29uZmlnU3ViamVjdC5uZXh0KGNvbmZpZyk7XHJcbiAgICAgICAgICAvLyBHdWFyZGFtb3MgZW4gd2luZG93IHBhcmEgc2lndWllbnRlcyBhY2Nlc29zXHJcbiAgICAgICAgICB3aW5kb3cuX19SVU5USU1FX0NPTkZJR19fID0gY29uZmlnO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgbG9hZGluZyBydW50aW1lIGNvbmZpZzonLCBlcnJvcik7XHJcbiAgICAgICAgICAvLyBGYWxsYmFjayBjb25maWcgc2kgZmFsbGEgbGEgY2FyZ2FcclxuICAgICAgICAgIGNvbnN0IGZhbGxiYWNrQ29uZmlnOiBSdW50aW1lQ29uZmlnID0ge1xyXG4gICAgICAgICAgICBhcGlVcmw6ICdodHRwczovL2VsZGVuLXByZXByb2QuYmFja2VuZC5lYXN5Y29tbWVyY2UuY29tLmFyLycsXHJcbiAgICAgICAgICAgIGFwcEVudjogJ3ByZXByb2QnLFxyXG4gICAgICAgICAgICBwcm9kdWN0aW9uOiBmYWxzZSxcclxuICAgICAgICAgICAgbG9jYWxlOiAnZXNfQVInLFxyXG4gICAgICAgICAgICBjaGFubmVsOiAnbWlub3Jpc3RhJ1xyXG4gICAgICAgICAgfTtcclxuICAgICAgICAgIHRoaXMuX2NvbmZpZyA9IGZhbGxiYWNrQ29uZmlnO1xyXG4gICAgICAgICAgdGhpcy5jb25maWdTdWJqZWN0Lm5leHQoZmFsbGJhY2tDb25maWcpO1xyXG4gICAgICAgICAgcmV0dXJuIG9mKGZhbGxiYWNrQ29uZmlnKTtcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gRW4gU1NSLCBsZWVtb3MgZGVzZGUgd2luZG93IHF1ZSBmdWUgaW55ZWN0YWRvIHBvciBlbCBzZXJ2aWRvclxyXG4gICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93Ll9fUlVOVElNRV9DT05GSUdfXykge1xyXG4gICAgICAgIHRoaXMuX2NvbmZpZyA9IHdpbmRvdy5fX1JVTlRJTUVfQ09ORklHX187XHJcbiAgICAgICAgdGhpcy5jb25maWdTdWJqZWN0Lm5leHQodGhpcy5fY29uZmlnKTtcclxuICAgICAgICByZXR1cm4gb2YodGhpcy5fY29uZmlnIGFzIFJ1bnRpbWVDb25maWcpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBGYWxsYmFjayBwYXJhIFNTUiBzaSBubyBoYXkgY29uZmlnIGlueWVjdGFkYVxyXG4gICAgICAvLyBFbiBlbCBzZXJ2aWRvciwgbGFzIHZhcmlhYmxlcyBkZSBlbnRvcm5vIHNlIGNvbmZpZ3VyYW4gZGVzZGUgZWwgc2VydmVyLnRzXHJcbiAgICAgIGNvbnN0IGZhbGxiYWNrQ29uZmlnOiBSdW50aW1lQ29uZmlnID0ge1xyXG4gICAgICAgIGFwaVVybDogJ2h0dHBzOi8vZWxkZW4tcHJlcHJvZC5iYWNrZW5kLmVhc3ljb21tZXJjZS5jb20uYXIvJyxcclxuICAgICAgICBhcHBFbnY6ICdwcmVwcm9kJyxcclxuICAgICAgICBwcm9kdWN0aW9uOiBmYWxzZSxcclxuICAgICAgICBsb2NhbGU6ICdlc19BUicsXHJcbiAgICAgICAgY2hhbm5lbDogJ21pbm9yaXN0YSdcclxuICAgICAgfTtcclxuICAgICAgXHJcbiAgICAgIHRoaXMuX2NvbmZpZyA9IGZhbGxiYWNrQ29uZmlnO1xyXG4gICAgICB0aGlzLmNvbmZpZ1N1YmplY3QubmV4dChmYWxsYmFja0NvbmZpZyk7XHJcbiAgICAgIHJldHVybiBvZihmYWxsYmFja0NvbmZpZyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBPYnRpZW5lIGxhIGNvbmZpZ3VyYWNpw7NuIGFjdHVhbCAoc8OtbmNyb25vKVxyXG4gICAqL1xyXG4gIGdldENvbmZpZygpOiBSdW50aW1lQ29uZmlnIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy5fY29uZmlnO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogT2J0aWVuZSBsYSBBUEkgVVJMIGFjdHVhbFxyXG4gICAqL1xyXG4gIGdldEFwaVVybCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZz8uYXBpVXJsIHx8ICdodHRwczovL2VsZGVuLXByZXByb2QuYmFja2VuZC5lYXN5Y29tbWVyY2UuY29tLmFyLyc7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBPYnRpZW5lIGxhIEZyb250ZW5kIFVSTCBhY3R1YWxcclxuICAgKi9cclxuICBnZXRGcm9udGVuZFVybCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZz8uZnJvbnRlbmRVcmw7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBPYnRpZW5lIGVsIGVudG9ybm8gYWN0dWFsXHJcbiAgICovXHJcbiAgZ2V0QXBwRW52KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fY29uZmlnPy5hcHBFbnYgfHwgJ2RldmVsb3BtZW50JztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFZlcmlmaWNhIHNpIGVzdGFtb3MgZW4gcHJvZHVjY2nDs25cclxuICAgKi9cclxuICBpc1Byb2R1Y3Rpb24oKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fY29uZmlnPy5wcm9kdWN0aW9uIHx8IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogT2J0aWVuZSBlbCBsb2NhbGUgYWN0dWFsXHJcbiAgICovXHJcbiAgZ2V0TG9jYWxlKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fY29uZmlnPy5sb2NhbGUgfHwgJ2VzX0FSJztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE9idGllbmUgZWwgY2FuYWwgYWN0dWFsXHJcbiAgICovXHJcbiAgZ2V0Q2hhbm5lbCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZz8uY2hhbm5lbCB8fCAnbWlub3Jpc3RhJztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE3DqXRvZG8gaGVscGVyIHBhcmEgY29uc3RydWlyIFVSTHMgZGUgQVBJXHJcbiAgICovXHJcbiAgYnVpbGRBcGlVcmwoZW5kcG9pbnQ6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBhcGlVcmwgPSB0aGlzLmdldEFwaVVybCgpO1xyXG4gICAgY29uc3QgY2xlYW5FbmRwb2ludCA9IGVuZHBvaW50LnN0YXJ0c1dpdGgoJy8nKSA/IGVuZHBvaW50LnNsaWNlKDEpIDogZW5kcG9pbnQ7XHJcbiAgICByZXR1cm4gYCR7YXBpVXJsfSR7Y2xlYW5FbmRwb2ludH1gO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTcOpdG9kbyBoZWxwZXIgcGFyYSBjb25zdHJ1aXIgVVJMcyBkZWwgZnJvbnRlbmRcclxuICAgKi9cclxuICBidWlsZEZyb250ZW5kVXJsKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBmcm9udGVuZFVybCA9IHRoaXMuZ2V0RnJvbnRlbmRVcmwoKTtcclxuICAgIGlmICghZnJvbnRlbmRVcmwpIHtcclxuICAgICAgcmV0dXJuIHBhdGg7XHJcbiAgICB9XHJcbiAgICBjb25zdCBjbGVhblBhdGggPSBwYXRoLnN0YXJ0c1dpdGgoJy8nKSA/IHBhdGguc2xpY2UoMSkgOiBwYXRoO1xyXG4gICAgcmV0dXJuIGAke2Zyb250ZW5kVXJsfSR7Y2xlYW5QYXRofWA7XHJcbiAgfVxyXG59Il19
190
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS1jb25maWcuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWVhc3ljb21tZXJjZS12MTgvc3JjL2xpYi9lYy1zZXJ2aWNlcy9ydW50aW1lLWNvbmZpZy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUVwRCxPQUFPLEVBQWMsRUFBRSxFQUFFLGVBQWUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN2RCxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7O0FBUTlELE1BQU0sT0FBTyxvQkFBb0I7SUFTQTtJQUNyQjtJQVRGLGFBQWEsR0FBRyxJQUFJLGVBQWUsQ0FBdUIsSUFBSSxDQUFDLENBQUM7SUFDakUsT0FBTyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLENBQUM7SUFFM0MsT0FBTyxHQUF5QixJQUFJLENBQUM7SUFDckMsWUFBWSxHQUFxQyxJQUFJLENBQUM7SUFDdEQsU0FBUyxHQUFHLEtBQUssQ0FBQztJQUUxQixZQUMrQixVQUFrQixFQUN2QyxJQUFnQjtRQURLLGVBQVUsR0FBVixVQUFVLENBQVE7UUFDdkMsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUV4QixtRkFBbUY7UUFDbkYsSUFBSSxPQUFPLE1BQU0sS0FBSyxXQUFXLElBQUksTUFBTSxDQUFDLGtCQUFrQixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2xGLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixDQUFDO1lBQ3pDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN4QyxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNILFVBQVU7UUFDUixJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ25DLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdkMsQ0FBQztRQUVELE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDckMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLFNBQVMsQ0FBQztnQkFDMUIsSUFBSSxFQUFFLENBQUMsTUFBcUIsRUFBRSxFQUFFO29CQUM5QixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztvQkFDdEIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNsQixDQUFDO2dCQUNELEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO29CQUNmLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDaEIsQ0FBQzthQUNGLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxVQUFVO1FBQ1IsZ0VBQWdFO1FBQ2hFLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbkMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQXdCLENBQUMsQ0FBQztRQUMzQyxDQUFDO1FBRUQsNkRBQTZEO1FBQzdELElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3RCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztRQUMzQixDQUFDO1FBRUQsSUFBSSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUN2QyxxRUFBcUU7WUFDckUsSUFBSSxPQUFPLE1BQU0sS0FBSyxXQUFXLElBQUksTUFBTSxDQUFDLGtCQUFrQixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUNsRixJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQztnQkFDekMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7Z0JBQ3RCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDdEMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQXdCLENBQUMsQ0FBQztZQUMzQyxDQUFDO1lBRUQsNkRBQTZEO1lBQzdELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQWdCLHNCQUFzQixDQUFDLENBQUMsSUFBSSxDQUMzRSxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQ1gsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7Z0JBQ3RCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO2dCQUN0QixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDaEMsOENBQThDO2dCQUM5QyxJQUFJLE9BQU8sTUFBTSxLQUFLLFdBQVcsRUFBRSxDQUFDO29CQUNsQyxNQUFNLENBQUMsa0JBQWtCLEdBQUcsTUFBTSxDQUFDO2dCQUNyQyxDQUFDO1lBQ0gsQ0FBQyxDQUFDLEVBQ0YsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLGtEQUFrRDtZQUNsRSxVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ2pCLE9BQU8sQ0FBQyxLQUFLLENBQUMsK0JBQStCLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQ3RELG9DQUFvQztnQkFDcEMsTUFBTSxjQUFjLEdBQWtCO29CQUNwQyxNQUFNLEVBQUUsb0RBQW9EO29CQUM1RCxNQUFNLEVBQUUsU0FBUztvQkFDakIsVUFBVSxFQUFFLEtBQUs7b0JBQ2pCLE1BQU0sRUFBRSxPQUFPO29CQUNmLE9BQU8sRUFBRSxXQUFXO2lCQUNyQixDQUFDO2dCQUNGLElBQUksQ0FBQyxPQUFPLEdBQUcsY0FBYyxDQUFDO2dCQUM5QixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztnQkFDdEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7Z0JBQ3hDLE9BQU8sRUFBRSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQzVCLENBQUMsQ0FBQyxDQUNILENBQUM7WUFFRixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7UUFDM0IsQ0FBQzthQUFNLENBQUM7WUFDTixnRUFBZ0U7WUFDaEUsSUFBSSxPQUFPLE1BQU0sS0FBSyxXQUFXLElBQUksTUFBTSxDQUFDLGtCQUFrQixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUNsRixJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQztnQkFDekMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7Z0JBQ3RCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDdEMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQXdCLENBQUMsQ0FBQztZQUMzQyxDQUFDO1lBRUQsK0NBQStDO1lBQy9DLDRFQUE0RTtZQUM1RSxNQUFNLGNBQWMsR0FBa0I7Z0JBQ3BDLE1BQU0sRUFBRSxvREFBb0Q7Z0JBQzVELE1BQU0sRUFBRSxTQUFTO2dCQUNqQixVQUFVLEVBQUUsS0FBSztnQkFDakIsTUFBTSxFQUFFLE9BQU87Z0JBQ2YsT0FBTyxFQUFFLFdBQVc7YUFDckIsQ0FBQztZQUVGLElBQUksQ0FBQyxPQUFPLEdBQUcsY0FBYyxDQUFDO1lBQzlCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ3hDLE9BQU8sRUFBRSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQzVCLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxTQUFTO1FBQ1AsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7T0FFRztJQUNILFNBQVM7UUFDUCxPQUFPLElBQUksQ0FBQyxPQUFPLEVBQUUsTUFBTSxJQUFJLG9EQUFvRCxDQUFDO0lBQ3RGLENBQUM7SUFFRDs7T0FFRztJQUNILGNBQWM7UUFDWixPQUFPLElBQUksQ0FBQyxPQUFPLEVBQUUsV0FBVyxDQUFDO0lBQ25DLENBQUM7SUFFRDs7T0FFRztJQUNILFNBQVM7UUFDUCxPQUFPLElBQUksQ0FBQyxPQUFPLEVBQUUsTUFBTSxJQUFJLGFBQWEsQ0FBQztJQUMvQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxZQUFZO1FBQ1YsT0FBTyxJQUFJLENBQUMsT0FBTyxFQUFFLFVBQVUsSUFBSSxLQUFLLENBQUM7SUFDM0MsQ0FBQztJQUVEOztPQUVHO0lBQ0gsU0FBUztRQUNQLE9BQU8sSUFBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLElBQUksT0FBTyxDQUFDO0lBQ3pDLENBQUM7SUFFRDs7T0FFRztJQUNILFVBQVU7UUFDUixPQUFPLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxJQUFJLFdBQVcsQ0FBQztJQUM5QyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxXQUFXLENBQUMsUUFBZ0I7UUFDMUIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2hDLE1BQU0sYUFBYSxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztRQUM5RSxPQUFPLEdBQUcsTUFBTSxHQUFHLGFBQWEsRUFBRSxDQUFDO0lBQ3JDLENBQUM7SUFFRDs7T0FFRztJQUNILGdCQUFnQixDQUFDLElBQVk7UUFDM0IsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQzFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNqQixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFDRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDOUQsT0FBTyxHQUFHLFdBQVcsR0FBRyxTQUFTLEVBQUUsQ0FBQztJQUN0QyxDQUFDO3dHQS9MVSxvQkFBb0Isa0JBU3JCLFdBQVc7NEdBVFYsb0JBQW9CLGNBRm5CLE1BQU07OzRGQUVQLG9CQUFvQjtrQkFIaEMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7OzBCQVVJLE1BQU07MkJBQUMsV0FBVyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIEluamVjdCwgUExBVEZPUk1fSUQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgaXNQbGF0Zm9ybUJyb3dzZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiwgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGNhdGNoRXJyb3IsIHRhcCwgc2hhcmVSZXBsYXkgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IFJ1bnRpbWVDb25maWcgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3J1bnRpbWUtY29uZmlnJztcclxuXHJcbmRlY2xhcmUgY29uc3Qgd2luZG93OiBhbnk7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBSdW50aW1lQ29uZmlnU2VydmljZSB7XHJcbiAgcHJpdmF0ZSBjb25maWdTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxSdW50aW1lQ29uZmlnIHwgbnVsbD4obnVsbCk7XHJcbiAgcHVibGljIGNvbmZpZyQgPSB0aGlzLmNvbmZpZ1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XHJcbiAgXHJcbiAgcHJpdmF0ZSBfY29uZmlnOiBSdW50aW1lQ29uZmlnIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfbG9hZFByb21pc2U6IE9ic2VydmFibGU8UnVudGltZUNvbmZpZz4gfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIF9pc0xvYWRlZCA9IGZhbHNlO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIEBJbmplY3QoUExBVEZPUk1fSUQpIHByaXZhdGUgcGxhdGZvcm1JZDogT2JqZWN0LFxyXG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50XHJcbiAgKSB7XHJcbiAgICAvLyBFbiBTU1IgbyBicm93c2VyLCBpbnRlbnRhciBjYXJnYXIgaW5tZWRpYXRhbWVudGUgZGVzZGUgd2luZG93IHNpIGVzdMOhIGRpc3BvbmlibGVcclxuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuX19SVU5USU1FX0NPTkZJR19fICYmICF0aGlzLl9pc0xvYWRlZCkge1xyXG4gICAgICB0aGlzLl9jb25maWcgPSB3aW5kb3cuX19SVU5USU1FX0NPTkZJR19fO1xyXG4gICAgICB0aGlzLl9pc0xvYWRlZCA9IHRydWU7XHJcbiAgICAgIHRoaXMuY29uZmlnU3ViamVjdC5uZXh0KHRoaXMuX2NvbmZpZyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBJbmljaWFsaXphY2nDs24gw7puaWNhIC0gbGxhbWFkYSBwb3IgQVBQX0lOSVRJQUxJWkVSXHJcbiAgICogR2FyYW50aXphIHF1ZSBsYSBjb25maWd1cmFjacOzbiBzZSBjYXJnYSBzb2xvIHVuYSB2ZXogYWwgaW5pY2lvXHJcbiAgICovXHJcbiAgaW5pdGlhbGl6ZSgpOiBQcm9taXNlPFJ1bnRpbWVDb25maWc+IHtcclxuICAgIGlmICh0aGlzLl9pc0xvYWRlZCAmJiB0aGlzLl9jb25maWcpIHtcclxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9jb25maWcpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIHRoaXMubG9hZENvbmZpZygpLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogKGNvbmZpZzogUnVudGltZUNvbmZpZykgPT4ge1xyXG4gICAgICAgICAgdGhpcy5faXNMb2FkZWQgPSB0cnVlO1xyXG4gICAgICAgICAgcmVzb2x2ZShjb25maWcpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgcmVqZWN0KGVycm9yKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDYXJnYSBsYSBjb25maWd1cmFjacOzbiBlbiBydW50aW1lIChvcHRpbWl6YWRhIHBhcmEgdW5hIHNvbGEgY2FyZ2EpXHJcbiAgICogLSBFbiBTU1I6IExlZSBkZXNkZSBlbCBvYmpldG8gd2luZG93IGlueWVjdGFkbyBwb3IgZWwgc2Vydmlkb3JcclxuICAgKiAtIEVuIEJyb3dzZXI6IEhhY2UgcGV0aWNpw7NuIEhUVFAgYSAvcnVudGltZS1jb25maWcuanNvbiAoc29sbyBzaSBubyBlc3TDoSBlbiB3aW5kb3cpXHJcbiAgICovXHJcbiAgbG9hZENvbmZpZygpOiBPYnNlcnZhYmxlPFJ1bnRpbWVDb25maWc+IHtcclxuICAgIC8vIFNpIHlhIHRlbmVtb3MgbGEgY29uZmlnIGNhcmdhZGEsIGxhIGRldm9sdmVtb3MgaW5tZWRpYXRhbWVudGVcclxuICAgIGlmICh0aGlzLl9pc0xvYWRlZCAmJiB0aGlzLl9jb25maWcpIHtcclxuICAgICAgcmV0dXJuIG9mKHRoaXMuX2NvbmZpZyBhcyBSdW50aW1lQ29uZmlnKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBTaSB5YSBoYXkgdW5hIGNhcmdhIGVuIHByb2dyZXNvLCByZXV0aWxpemFtb3MgZXNhIHBldGljacOzblxyXG4gICAgaWYgKHRoaXMuX2xvYWRQcm9taXNlKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLl9sb2FkUHJvbWlzZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkge1xyXG4gICAgICAvLyBFbiBlbCBuYXZlZ2Fkb3IsIHByaW1lcm8gaW50ZW50YW1vcyBvYnRlbmVyIGxhIGNvbmZpZyBkZXNkZSB3aW5kb3dcclxuICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5fX1JVTlRJTUVfQ09ORklHX18gJiYgIXRoaXMuX2lzTG9hZGVkKSB7XHJcbiAgICAgICAgdGhpcy5fY29uZmlnID0gd2luZG93Ll9fUlVOVElNRV9DT05GSUdfXztcclxuICAgICAgICB0aGlzLl9pc0xvYWRlZCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5jb25maWdTdWJqZWN0Lm5leHQodGhpcy5fY29uZmlnKTtcclxuICAgICAgICByZXR1cm4gb2YodGhpcy5fY29uZmlnIGFzIFJ1bnRpbWVDb25maWcpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBTaSBubyBlc3TDoSBlbiB3aW5kb3csIGhhY2Vtb3MgcGV0aWNpw7NuIEhUVFAgKHNvbG8gdW5hIHZleilcclxuICAgICAgdGhpcy5fbG9hZFByb21pc2UgPSB0aGlzLmh0dHAuZ2V0PFJ1bnRpbWVDb25maWc+KCcvcnVudGltZS1jb25maWcuanNvbicpLnBpcGUoXHJcbiAgICAgICAgdGFwKGNvbmZpZyA9PiB7XHJcbiAgICAgICAgICB0aGlzLl9jb25maWcgPSBjb25maWc7XHJcbiAgICAgICAgICB0aGlzLl9pc0xvYWRlZCA9IHRydWU7XHJcbiAgICAgICAgICB0aGlzLmNvbmZpZ1N1YmplY3QubmV4dChjb25maWcpO1xyXG4gICAgICAgICAgLy8gR3VhcmRhbW9zIGVuIHdpbmRvdyBwYXJhIHNpZ3VpZW50ZXMgYWNjZXNvc1xyXG4gICAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgIHdpbmRvdy5fX1JVTlRJTUVfQ09ORklHX18gPSBjb25maWc7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgc2hhcmVSZXBsYXkoMSksIC8vIENhY2hlIGxhIHJlc3B1ZXN0YSBwYXJhIG3Dumx0aXBsZXMgc3VzY3JpcGNpb25lc1xyXG4gICAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgbG9hZGluZyBydW50aW1lIGNvbmZpZzonLCBlcnJvcik7XHJcbiAgICAgICAgICAvLyBGYWxsYmFjayBjb25maWcgc2kgZmFsbGEgbGEgY2FyZ2FcclxuICAgICAgICAgIGNvbnN0IGZhbGxiYWNrQ29uZmlnOiBSdW50aW1lQ29uZmlnID0ge1xyXG4gICAgICAgICAgICBhcGlVcmw6ICdodHRwczovL2VsZGVuLXByZXByb2QuYmFja2VuZC5lYXN5Y29tbWVyY2UuY29tLmFyLycsXHJcbiAgICAgICAgICAgIGFwcEVudjogJ3ByZXByb2QnLFxyXG4gICAgICAgICAgICBwcm9kdWN0aW9uOiBmYWxzZSxcclxuICAgICAgICAgICAgbG9jYWxlOiAnZXNfQVInLFxyXG4gICAgICAgICAgICBjaGFubmVsOiAnbWlub3Jpc3RhJ1xyXG4gICAgICAgICAgfTtcclxuICAgICAgICAgIHRoaXMuX2NvbmZpZyA9IGZhbGxiYWNrQ29uZmlnO1xyXG4gICAgICAgICAgdGhpcy5faXNMb2FkZWQgPSB0cnVlO1xyXG4gICAgICAgICAgdGhpcy5jb25maWdTdWJqZWN0Lm5leHQoZmFsbGJhY2tDb25maWcpO1xyXG4gICAgICAgICAgcmV0dXJuIG9mKGZhbGxiYWNrQ29uZmlnKTtcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgICBcclxuICAgICAgcmV0dXJuIHRoaXMuX2xvYWRQcm9taXNlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gRW4gU1NSLCBsZWVtb3MgZGVzZGUgd2luZG93IHF1ZSBmdWUgaW55ZWN0YWRvIHBvciBlbCBzZXJ2aWRvclxyXG4gICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93Ll9fUlVOVElNRV9DT05GSUdfXyAmJiAhdGhpcy5faXNMb2FkZWQpIHtcclxuICAgICAgICB0aGlzLl9jb25maWcgPSB3aW5kb3cuX19SVU5USU1FX0NPTkZJR19fO1xyXG4gICAgICAgIHRoaXMuX2lzTG9hZGVkID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmNvbmZpZ1N1YmplY3QubmV4dCh0aGlzLl9jb25maWcpO1xyXG4gICAgICAgIHJldHVybiBvZih0aGlzLl9jb25maWcgYXMgUnVudGltZUNvbmZpZyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIEZhbGxiYWNrIHBhcmEgU1NSIHNpIG5vIGhheSBjb25maWcgaW55ZWN0YWRhXHJcbiAgICAgIC8vIEVuIGVsIHNlcnZpZG9yLCBsYXMgdmFyaWFibGVzIGRlIGVudG9ybm8gc2UgY29uZmlndXJhbiBkZXNkZSBlbCBzZXJ2ZXIudHNcclxuICAgICAgY29uc3QgZmFsbGJhY2tDb25maWc6IFJ1bnRpbWVDb25maWcgPSB7XHJcbiAgICAgICAgYXBpVXJsOiAnaHR0cHM6Ly9lbGRlbi1wcmVwcm9kLmJhY2tlbmQuZWFzeWNvbW1lcmNlLmNvbS5hci8nLFxyXG4gICAgICAgIGFwcEVudjogJ3ByZXByb2QnLFxyXG4gICAgICAgIHByb2R1Y3Rpb246IGZhbHNlLFxyXG4gICAgICAgIGxvY2FsZTogJ2VzX0FSJyxcclxuICAgICAgICBjaGFubmVsOiAnbWlub3Jpc3RhJ1xyXG4gICAgICB9O1xyXG4gICAgICBcclxuICAgICAgdGhpcy5fY29uZmlnID0gZmFsbGJhY2tDb25maWc7XHJcbiAgICAgIHRoaXMuX2lzTG9hZGVkID0gdHJ1ZTtcclxuICAgICAgdGhpcy5jb25maWdTdWJqZWN0Lm5leHQoZmFsbGJhY2tDb25maWcpO1xyXG4gICAgICByZXR1cm4gb2YoZmFsbGJhY2tDb25maWcpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogT2J0aWVuZSBsYSBjb25maWd1cmFjacOzbiBhY3R1YWwgKHPDrW5jcm9ubylcclxuICAgKi9cclxuICBnZXRDb25maWcoKTogUnVudGltZUNvbmZpZyB8IG51bGwge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE9idGllbmUgbGEgQVBJIFVSTCBhY3R1YWxcclxuICAgKi9cclxuICBnZXRBcGlVcmwoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9jb25maWc/LmFwaVVybCB8fCAnaHR0cHM6Ly9lbGRlbi1wcmVwcm9kLmJhY2tlbmQuZWFzeWNvbW1lcmNlLmNvbS5hci8nO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogT2J0aWVuZSBsYSBGcm9udGVuZCBVUkwgYWN0dWFsXHJcbiAgICovXHJcbiAgZ2V0RnJvbnRlbmRVcmwoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0aGlzLl9jb25maWc/LmZyb250ZW5kVXJsO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogT2J0aWVuZSBlbCBlbnRvcm5vIGFjdHVhbFxyXG4gICAqL1xyXG4gIGdldEFwcEVudigpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZz8uYXBwRW52IHx8ICdkZXZlbG9wbWVudCc7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBWZXJpZmljYSBzaSBlc3RhbW9zIGVuIHByb2R1Y2Npw7NuXHJcbiAgICovXHJcbiAgaXNQcm9kdWN0aW9uKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZz8ucHJvZHVjdGlvbiB8fCBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE9idGllbmUgZWwgbG9jYWxlIGFjdHVhbFxyXG4gICAqL1xyXG4gIGdldExvY2FsZSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZz8ubG9jYWxlIHx8ICdlc19BUic7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBPYnRpZW5lIGVsIGNhbmFsIGFjdHVhbFxyXG4gICAqL1xyXG4gIGdldENoYW5uZWwoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9jb25maWc/LmNoYW5uZWwgfHwgJ21pbm9yaXN0YSc7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNw6l0b2RvIGhlbHBlciBwYXJhIGNvbnN0cnVpciBVUkxzIGRlIEFQSVxyXG4gICAqL1xyXG4gIGJ1aWxkQXBpVXJsKGVuZHBvaW50OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgYXBpVXJsID0gdGhpcy5nZXRBcGlVcmwoKTtcclxuICAgIGNvbnN0IGNsZWFuRW5kcG9pbnQgPSBlbmRwb2ludC5zdGFydHNXaXRoKCcvJykgPyBlbmRwb2ludC5zbGljZSgxKSA6IGVuZHBvaW50O1xyXG4gICAgcmV0dXJuIGAke2FwaVVybH0ke2NsZWFuRW5kcG9pbnR9YDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE3DqXRvZG8gaGVscGVyIHBhcmEgY29uc3RydWlyIFVSTHMgZGVsIGZyb250ZW5kXHJcbiAgICovXHJcbiAgYnVpbGRGcm9udGVuZFVybChwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgZnJvbnRlbmRVcmwgPSB0aGlzLmdldEZyb250ZW5kVXJsKCk7XHJcbiAgICBpZiAoIWZyb250ZW5kVXJsKSB7XHJcbiAgICAgIHJldHVybiBwYXRoO1xyXG4gICAgfVxyXG4gICAgY29uc3QgY2xlYW5QYXRoID0gcGF0aC5zdGFydHNXaXRoKCcvJykgPyBwYXRoLnNsaWNlKDEpIDogcGF0aDtcclxuICAgIHJldHVybiBgJHtmcm9udGVuZFVybH0ke2NsZWFuUGF0aH1gO1xyXG4gIH1cclxufSJdfQ==
@@ -1,2 +1,3 @@
1
1
  export * from './auth.interceptor';
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1lYXN5Y29tbWVyY2UtdjE4L3NyYy9saWIvaW50ZXJjZXB0b3JzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsb0JBQW9CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2F1dGguaW50ZXJjZXB0b3InOyJdfQ==
2
+ export * from './runtime-config.interceptor';
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1lYXN5Y29tbWVyY2UtdjE4L3NyYy9saWIvaW50ZXJjZXB0b3JzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsY0FBYyw4QkFBOEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vYXV0aC5pbnRlcmNlcHRvcic7XHJcbmV4cG9ydCAqIGZyb20gJy4vcnVudGltZS1jb25maWcuaW50ZXJjZXB0b3InOyJdfQ==
@@ -0,0 +1,41 @@
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS1jb25maWcuaW50ZXJjZXB0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1lYXN5Y29tbWVyY2UtdjE4L3NyYy9saWIvaW50ZXJjZXB0b3JzL3J1bnRpbWUtY29uZmlnLmludGVyY2VwdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDN0UsT0FBTyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFekQ7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFzQixDQUFDLEdBQXlCLEVBQUUsSUFBbUIsRUFBRSxFQUFFO0lBQzVHLE1BQU0sb0JBQW9CLEdBQUcsTUFBTSxDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFFMUQsb0ZBQW9GO0lBQ3BGLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsc0JBQXNCLENBQUMsRUFBRSxDQUFDO1FBQzdDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ25CLENBQUM7SUFFRCw0REFBNEQ7SUFDNUQsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3JILE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ25CLENBQUM7SUFFRCxrRUFBa0U7SUFDbEUsT0FBTyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUN0QyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLEVBQUUsa0NBQWtDO0lBQ3JFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxzQ0FBc0M7SUFDL0MsU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1FBQ2pCLG9FQUFvRTtRQUNwRSxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDL0IsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbkIsQ0FBQztRQUVELCtEQUErRDtRQUMvRCxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDOUQsTUFBTSxNQUFNLEdBQUcsTUFBTyxDQUFDLE1BQU0sQ0FBQztZQUM5QixNQUFNLFFBQVEsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7WUFDMUUsTUFBTSxPQUFPLEdBQUcsR0FBRyxNQUFNLEdBQUcsUUFBUSxFQUFFLENBQUM7WUFFdkMsTUFBTSxXQUFXLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQztnQkFDNUIsR0FBRyxFQUFFLE9BQU87YUFDYixDQUFDLENBQUM7WUFFSCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMzQixDQUFDO1FBRUQsbURBQW1EO1FBQ25ELE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ25CLENBQUMsQ0FBQyxDQUNILENBQUM7QUFDSixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwSW50ZXJjZXB0b3JGbiwgSHR0cFJlcXVlc3QsIEh0dHBIYW5kbGVyRm4gfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBSdW50aW1lQ29uZmlnU2VydmljZSB9IGZyb20gJy4uL2VjLXNlcnZpY2VzL3J1bnRpbWUtY29uZmlnLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBzd2l0Y2hNYXAsIHRha2UsIGZpbHRlciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuXHJcbi8qKlxyXG4gKiBJbnRlcmNlcHRvciBxdWUgZ2FyYW50aXphIHF1ZSBsYXMgcGV0aWNpb25lcyBIVFRQIG5vIHNlIGhhZ2FuIGhhc3RhIHF1ZSBcclxuICogZWwgcnVudGltZSBjb25maWcgZXN0w6kgY29tcGxldGFtZW50ZSBjYXJnYWRvXHJcbiAqIEV2aXRhIHF1ZSBzZSBoYWdhbiBwZXRpY2lvbmVzIGNvbiBVUkxzIGluY29ycmVjdGFzXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgcnVudGltZUNvbmZpZ0ludGVyY2VwdG9yOiBIdHRwSW50ZXJjZXB0b3JGbiA9IChyZXE6IEh0dHBSZXF1ZXN0PHVua25vd24+LCBuZXh0OiBIdHRwSGFuZGxlckZuKSA9PiB7XHJcbiAgY29uc3QgcnVudGltZUNvbmZpZ1NlcnZpY2UgPSBpbmplY3QoUnVudGltZUNvbmZpZ1NlcnZpY2UpO1xyXG4gIFxyXG4gIC8vIFNpIGxhIHBldGljacOzbiBlcyBwYXJhIG9idGVuZXIgZWwgcnVudGltZSBjb25maWcsIGxhIGRlamFtb3MgcGFzYXIgaW5tZWRpYXRhbWVudGVcclxuICBpZiAocmVxLnVybC5pbmNsdWRlcygnL3J1bnRpbWUtY29uZmlnLmpzb24nKSkge1xyXG4gICAgcmV0dXJuIG5leHQocmVxKTtcclxuICB9XHJcbiAgXHJcbiAgLy8gU2kgbGEgcGV0aWNpw7NuIGVzIHBhcmEgYXNzZXRzIGVzdMOhdGljb3MsIGxhIGRlamFtb3MgcGFzYXJcclxuICBpZiAocmVxLnVybC5pbmNsdWRlcygnL2Fzc2V0cy8nKSB8fCByZXEudXJsLmluY2x1ZGVzKCcuanNvbicpIHx8IHJlcS51cmwuaW5jbHVkZXMoJy5jc3MnKSB8fCByZXEudXJsLmluY2x1ZGVzKCcuanMnKSkge1xyXG4gICAgcmV0dXJuIG5leHQocmVxKTtcclxuICB9XHJcblxyXG4gIC8vIFBhcmEgbGFzIGRlbcOhcyBwZXRpY2lvbmVzLCBlc3BlcmFtb3MgYSBxdWUgZWwgY29uZmlnIGVzdMOpIGxpc3RvXHJcbiAgcmV0dXJuIHJ1bnRpbWVDb25maWdTZXJ2aWNlLmNvbmZpZyQucGlwZShcclxuICAgIGZpbHRlcihjb25maWcgPT4gY29uZmlnICE9PSBudWxsKSwgLy8gRXNwZXJhbW9zIGhhc3RhIHF1ZSBoYXlhIGNvbmZpZ1xyXG4gICAgdGFrZSgxKSwgLy8gU29sbyB0b21hbW9zIGVsIHByaW1lciB2YWxvciB2w6FsaWRvXHJcbiAgICBzd2l0Y2hNYXAoY29uZmlnID0+IHtcclxuICAgICAgLy8gU2kgbGEgVVJMIHlhIGVzIGNvbXBsZXRhIChlbXBpZXphIGNvbiBodHRwKSwgbGEgZGVqYW1vcyBjb21vIGVzdMOhXHJcbiAgICAgIGlmIChyZXEudXJsLnN0YXJ0c1dpdGgoJ2h0dHAnKSkge1xyXG4gICAgICAgIHJldHVybiBuZXh0KHJlcSk7XHJcbiAgICAgIH1cclxuICAgICAgXHJcbiAgICAgIC8vIFNpIGVzIHVuYSBVUkwgcmVsYXRpdmEgcXVlIGRlYmVyw61hIGlyIGFsIEFQSSwgbGEgY29tcGxldGFtb3NcclxuICAgICAgaWYgKHJlcS51cmwuc3RhcnRzV2l0aCgnL2FwaS8nKSB8fCByZXEudXJsLnN0YXJ0c1dpdGgoJ2FwaS8nKSkge1xyXG4gICAgICAgIGNvbnN0IGFwaVVybCA9IGNvbmZpZyEuYXBpVXJsO1xyXG4gICAgICAgIGNvbnN0IGNsZWFuVXJsID0gcmVxLnVybC5zdGFydHNXaXRoKCcvJykgPyByZXEudXJsLnN1YnN0cmluZygxKSA6IHJlcS51cmw7XHJcbiAgICAgICAgY29uc3QgZnVsbFVybCA9IGAke2FwaVVybH0ke2NsZWFuVXJsfWA7XHJcbiAgICAgICAgXHJcbiAgICAgICAgY29uc3QgbW9kaWZpZWRSZXEgPSByZXEuY2xvbmUoe1xyXG4gICAgICAgICAgdXJsOiBmdWxsVXJsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIG5leHQobW9kaWZpZWRSZXEpO1xyXG4gICAgICB9XHJcbiAgICAgIFxyXG4gICAgICAvLyBQYXJhIG90cmFzIFVSTHMsIGxhcyBkZWphbW9zIHBhc2FyIHNpbiBtb2RpZmljYXJcclxuICAgICAgcmV0dXJuIG5leHQocmVxKTtcclxuICAgIH0pXHJcbiAgKTtcclxufTsiXX0=
@@ -1,23 +1,26 @@
1
1
  import { APP_INITIALIZER, makeEnvironmentProviders } from '@angular/core';
2
2
  import { RuntimeConfigService } from '../ec-services/runtime-config.service';
3
3
  /**
4
- * Factory function para APP_INITIALIZER
5
- * Carga la configuración runtime antes de que Angular bootstrap la aplicación
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
6
7
  */
7
8
  export function initializeRuntimeConfig(runtimeConfigService) {
8
9
  return () => {
9
- return new Promise((resolve, reject) => {
10
- runtimeConfigService.loadConfig().subscribe({
11
- next: (config) => {
12
- console.log('🔧 Runtime config loaded:', config);
13
- resolve(config);
14
- },
15
- error: (error) => {
16
- console.error('❌ Failed to load runtime config:', error);
17
- // Aún en caso de error, resolvemos para no bloquear la app
18
- resolve(null);
19
- }
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
20
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;
21
24
  });
22
25
  };
23
26
  }
@@ -36,4 +39,4 @@ export function provideRuntimeConfig() {
36
39
  }
37
40
  ]);
38
41
  }
39
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZVJ1bnRpbWVDb25maWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1lYXN5Y29tbWVyY2UtdjE4L3NyYy9saWIvcHJvdmlkZXJzL3Byb3ZpZGVSdW50aW1lQ29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxlQUFlLEVBQXdCLHdCQUF3QixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hHLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBRTdFOzs7R0FHRztBQUNILE1BQU0sVUFBVSx1QkFBdUIsQ0FBQyxvQkFBMEM7SUFDaEYsT0FBTyxHQUFpQixFQUFFO1FBQ3hCLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDckMsb0JBQW9CLENBQUMsVUFBVSxFQUFFLENBQUMsU0FBUyxDQUFDO2dCQUMxQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRTtvQkFDZixPQUFPLENBQUMsR0FBRyxDQUFDLDJCQUEyQixFQUFFLE1BQU0sQ0FBQyxDQUFDO29CQUNqRCxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ2xCLENBQUM7Z0JBQ0QsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7b0JBQ2YsT0FBTyxDQUFDLEtBQUssQ0FBQyxrQ0FBa0MsRUFBRSxLQUFLLENBQUMsQ0FBQztvQkFDekQsMkRBQTJEO29CQUMzRCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2hCLENBQUM7YUFDRixDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsb0JBQW9CO0lBQ2xDLE9BQU8sd0JBQXdCLENBQUM7UUFDOUIsb0JBQW9CO1FBQ3BCO1lBQ0UsT0FBTyxFQUFFLGVBQWU7WUFDeEIsVUFBVSxFQUFFLHVCQUF1QjtZQUNuQyxJQUFJLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQztZQUM1QixLQUFLLEVBQUUsSUFBSTtTQUNaO0tBQ0YsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFQUF9JTklUSUFMSVpFUiwgRW52aXJvbm1lbnRQcm92aWRlcnMsIG1ha2VFbnZpcm9ubWVudFByb3ZpZGVycyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBSdW50aW1lQ29uZmlnU2VydmljZSB9IGZyb20gJy4uL2VjLXNlcnZpY2VzL3J1bnRpbWUtY29uZmlnLnNlcnZpY2UnO1xyXG5cclxuLyoqXHJcbiAqIEZhY3RvcnkgZnVuY3Rpb24gcGFyYSBBUFBfSU5JVElBTElaRVJcclxuICogQ2FyZ2EgbGEgY29uZmlndXJhY2nDs24gcnVudGltZSBhbnRlcyBkZSBxdWUgQW5ndWxhciBib290c3RyYXAgbGEgYXBsaWNhY2nDs25cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBpbml0aWFsaXplUnVudGltZUNvbmZpZyhydW50aW1lQ29uZmlnU2VydmljZTogUnVudGltZUNvbmZpZ1NlcnZpY2UpOiAoKSA9PiBQcm9taXNlPGFueT4ge1xyXG4gIHJldHVybiAoKTogUHJvbWlzZTxhbnk+ID0+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIHJ1bnRpbWVDb25maWdTZXJ2aWNlLmxvYWRDb25maWcoKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IChjb25maWcpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKCfwn5SnIFJ1bnRpbWUgY29uZmlnIGxvYWRlZDonLCBjb25maWcpO1xyXG4gICAgICAgICAgcmVzb2x2ZShjb25maWcpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcign4p2MIEZhaWxlZCB0byBsb2FkIHJ1bnRpbWUgY29uZmlnOicsIGVycm9yKTtcclxuICAgICAgICAgIC8vIEHDum4gZW4gY2FzbyBkZSBlcnJvciwgcmVzb2x2ZW1vcyBwYXJhIG5vIGJsb3F1ZWFyIGxhIGFwcFxyXG4gICAgICAgICAgcmVzb2x2ZShudWxsKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEZ1bmNpw7NuIHF1ZSBjb25maWd1cmEgZWwgUnVudGltZUNvbmZpZ1NlcnZpY2UgeSBzdSBpbmljaWFsaXphY2nDs25cclxuICogRGViZSBzZXIgdXNhZG8gZW4gYXBwLmNvbmZpZy50cyBqdW50byBjb24gcHJvdmlkZUVudmlyb25tZW50XHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gcHJvdmlkZVJ1bnRpbWVDb25maWcoKTogRW52aXJvbm1lbnRQcm92aWRlcnMge1xyXG4gIHJldHVybiBtYWtlRW52aXJvbm1lbnRQcm92aWRlcnMoW1xyXG4gICAgUnVudGltZUNvbmZpZ1NlcnZpY2UsXHJcbiAgICB7XHJcbiAgICAgIHByb3ZpZGU6IEFQUF9JTklUSUFMSVpFUixcclxuICAgICAgdXNlRmFjdG9yeTogaW5pdGlhbGl6ZVJ1bnRpbWVDb25maWcsXHJcbiAgICAgIGRlcHM6IFtSdW50aW1lQ29uZmlnU2VydmljZV0sXHJcbiAgICAgIG11bHRpOiB0cnVlXHJcbiAgICB9XHJcbiAgXSk7XHJcbn0iXX0=
42
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZVJ1bnRpbWVDb25maWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1lYXN5Y29tbWVyY2UtdjE4L3NyYy9saWIvcHJvdmlkZXJzL3Byb3ZpZGVSdW50aW1lQ29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxlQUFlLEVBQXdCLHdCQUF3QixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hHLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBRTdFOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsdUJBQXVCLENBQUMsb0JBQTBDO0lBQ2hGLE9BQU8sR0FBaUIsRUFBRTtRQUN4QixPQUFPLENBQUMsR0FBRyxDQUFDLG9DQUFvQyxDQUFDLENBQUM7UUFDbEQsT0FBTyxvQkFBb0IsQ0FBQyxVQUFVLEVBQUU7YUFDckMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDZixPQUFPLENBQUMsR0FBRyxDQUFDLDhDQUE4QyxFQUFFO2dCQUMxRCxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU07Z0JBQ3JCLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTTtnQkFDckIsVUFBVSxFQUFFLE1BQU0sQ0FBQyxVQUFVO2FBQzlCLENBQUMsQ0FBQztZQUNILE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUMsQ0FBQzthQUNELEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ2YsT0FBTyxDQUFDLEtBQUssQ0FBQyx3Q0FBd0MsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUMvRCw0REFBNEQ7WUFDNUQsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsb0JBQW9CO0lBQ2xDLE9BQU8sd0JBQXdCLENBQUM7UUFDOUIsb0JBQW9CO1FBQ3BCO1lBQ0UsT0FBTyxFQUFFLGVBQWU7WUFDeEIsVUFBVSxFQUFFLHVCQUF1QjtZQUNuQyxJQUFJLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQztZQUM1QixLQUFLLEVBQUUsSUFBSTtTQUNaO0tBQ0YsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFQUF9JTklUSUFMSVpFUiwgRW52aXJvbm1lbnRQcm92aWRlcnMsIG1ha2VFbnZpcm9ubWVudFByb3ZpZGVycyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBSdW50aW1lQ29uZmlnU2VydmljZSB9IGZyb20gJy4uL2VjLXNlcnZpY2VzL3J1bnRpbWUtY29uZmlnLnNlcnZpY2UnO1xyXG5cclxuLyoqXHJcbiAqIEZhY3RvcnkgZnVuY3Rpb24gcGFyYSBBUFBfSU5JVElBTElaRVIgKE9QVElNSVpBREEpXHJcbiAqIENhcmdhIGxhIGNvbmZpZ3VyYWNpw7NuIHJ1bnRpbWUgVU5BIFNPTEEgVkVaIGFudGVzIGRlIHF1ZSBBbmd1bGFyIGJvb3RzdHJhcCBsYSBhcGxpY2FjacOzblxyXG4gKiBFdml0YSBtw7psdGlwbGVzIGNhcmdhcyB5IG1lam9yYSBlbCByZW5kaW1pZW50b1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGluaXRpYWxpemVSdW50aW1lQ29uZmlnKHJ1bnRpbWVDb25maWdTZXJ2aWNlOiBSdW50aW1lQ29uZmlnU2VydmljZSk6ICgpID0+IFByb21pc2U8YW55PiB7XHJcbiAgcmV0dXJuICgpOiBQcm9taXNlPGFueT4gPT4ge1xyXG4gICAgY29uc29sZS5sb2coJ/CfmoAgSW5pY2lhbGl6YW5kbyBSdW50aW1lIENvbmZpZy4uLicpO1xyXG4gICAgcmV0dXJuIHJ1bnRpbWVDb25maWdTZXJ2aWNlLmluaXRpYWxpemUoKVxyXG4gICAgICAudGhlbigoY29uZmlnKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ+KchSBSdW50aW1lIGNvbmZpZyBpbmljaWFsaXphZG8gY29ycmVjdGFtZW50ZTonLCB7XHJcbiAgICAgICAgICBhcGlVcmw6IGNvbmZpZy5hcGlVcmwsXHJcbiAgICAgICAgICBhcHBFbnY6IGNvbmZpZy5hcHBFbnYsXHJcbiAgICAgICAgICBwcm9kdWN0aW9uOiBjb25maWcucHJvZHVjdGlvblxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiBjb25maWc7XHJcbiAgICAgIH0pXHJcbiAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKCfinYwgRXJyb3IgYWwgaW5pY2lhbGl6YXIgcnVudGltZSBjb25maWc6JywgZXJyb3IpO1xyXG4gICAgICAgIC8vIEHDum4gZW4gY2FzbyBkZSBlcnJvciwgY29udGludWFtb3MgcGFyYSBubyBibG9xdWVhciBsYSBhcHBcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgfSk7XHJcbiAgfTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEZ1bmNpw7NuIHF1ZSBjb25maWd1cmEgZWwgUnVudGltZUNvbmZpZ1NlcnZpY2UgeSBzdSBpbmljaWFsaXphY2nDs25cclxuICogRGViZSBzZXIgdXNhZG8gZW4gYXBwLmNvbmZpZy50cyBqdW50byBjb24gcHJvdmlkZUVudmlyb25tZW50XHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gcHJvdmlkZVJ1bnRpbWVDb25maWcoKTogRW52aXJvbm1lbnRQcm92aWRlcnMge1xyXG4gIHJldHVybiBtYWtlRW52aXJvbm1lbnRQcm92aWRlcnMoW1xyXG4gICAgUnVudGltZUNvbmZpZ1NlcnZpY2UsXHJcbiAgICB7XHJcbiAgICAgIHByb3ZpZGU6IEFQUF9JTklUSUFMSVpFUixcclxuICAgICAgdXNlRmFjdG9yeTogaW5pdGlhbGl6ZVJ1bnRpbWVDb25maWcsXHJcbiAgICAgIGRlcHM6IFtSdW50aW1lQ29uZmlnU2VydmljZV0sXHJcbiAgICAgIG11bHRpOiB0cnVlXHJcbiAgICB9XHJcbiAgXSk7XHJcbn0iXX0=
@@ -2,10 +2,10 @@ import * as i0 from '@angular/core';
2
2
  import { InjectionToken, makeEnvironmentProviders, PLATFORM_ID, Injectable, Inject, APP_INITIALIZER, inject, RendererFactory2, afterNextRender, signal, EnvironmentInjector, runInInjectionContext, Component, ChangeDetectorRef, HostListener, CUSTOM_ELEMENTS_SCHEMA, Input, Pipe, Injector, EventEmitter, Output, forwardRef, afterRender, ViewChild, computed, Renderer2, ChangeDetectionStrategy, Directive } from '@angular/core';
3
3
  import * as i1$1 from '@angular/common';
4
4
  import { isPlatformBrowser, DOCUMENT, AsyncPipe, CommonModule, TitleCasePipe, JsonPipe, UpperCasePipe, Location } from '@angular/common';
5
- import { BehaviorSubject, of, take, shareReplay, map, catchError as catchError$1, filter, ReplaySubject, firstValueFrom, concatMap, throwError, switchMap, combineLatest } from 'rxjs';
5
+ import { BehaviorSubject, of, take, shareReplay as shareReplay$1, map, catchError as catchError$1, filter, ReplaySubject, firstValueFrom, concatMap, throwError, switchMap, combineLatest } from 'rxjs';
6
6
  import * as i1 from '@angular/common/http';
7
7
  import { HttpClient, HttpHeaders } from '@angular/common/http';
8
- import { tap, catchError, filter as filter$1, skipWhile } from 'rxjs/operators';
8
+ import { tap, shareReplay, catchError, filter as filter$1, skipWhile, take as take$1, switchMap as switchMap$1 } from 'rxjs/operators';
9
9
  import * as i1$2 from '@ngx-translate/core';
10
10
  import { TranslateService, TranslateModule } from '@ngx-translate/core';
11
11
  import { CookieService } from 'ngx-cookie-service';
@@ -50,34 +50,71 @@ class RuntimeConfigService {
50
50
  configSubject = new BehaviorSubject(null);
51
51
  config$ = this.configSubject.asObservable();
52
52
  _config = null;
53
+ _loadPromise = null;
54
+ _isLoaded = false;
53
55
  constructor(platformId, http) {
54
56
  this.platformId = platformId;
55
57
  this.http = http;
58
+ // En SSR o browser, intentar cargar inmediatamente desde window si está disponible
59
+ if (typeof window !== 'undefined' && window.__RUNTIME_CONFIG__ && !this._isLoaded) {
60
+ this._config = window.__RUNTIME_CONFIG__;
61
+ this._isLoaded = true;
62
+ this.configSubject.next(this._config);
63
+ }
56
64
  }
57
65
  /**
58
- * Carga la configuración en runtime
66
+ * Inicialización única - llamada por APP_INITIALIZER
67
+ * Garantiza que la configuración se carga solo una vez al inicio
68
+ */
69
+ initialize() {
70
+ if (this._isLoaded && this._config) {
71
+ return Promise.resolve(this._config);
72
+ }
73
+ return new Promise((resolve, reject) => {
74
+ this.loadConfig().subscribe({
75
+ next: (config) => {
76
+ this._isLoaded = true;
77
+ resolve(config);
78
+ },
79
+ error: (error) => {
80
+ reject(error);
81
+ }
82
+ });
83
+ });
84
+ }
85
+ /**
86
+ * Carga la configuración en runtime (optimizada para una sola carga)
59
87
  * - En SSR: Lee desde el objeto window inyectado por el servidor
60
- * - En Browser: Hace petición HTTP a /runtime-config.json
88
+ * - En Browser: Hace petición HTTP a /runtime-config.json (solo si no está en window)
61
89
  */
62
90
  loadConfig() {
63
- // Si ya tenemos la config cargada, la devolvemos
64
- if (this._config) {
91
+ // Si ya tenemos la config cargada, la devolvemos inmediatamente
92
+ if (this._isLoaded && this._config) {
65
93
  return of(this._config);
66
94
  }
95
+ // Si ya hay una carga en progreso, reutilizamos esa petición
96
+ if (this._loadPromise) {
97
+ return this._loadPromise;
98
+ }
67
99
  if (isPlatformBrowser(this.platformId)) {
68
100
  // En el navegador, primero intentamos obtener la config desde window
69
- if (window.__RUNTIME_CONFIG__) {
101
+ if (typeof window !== 'undefined' && window.__RUNTIME_CONFIG__ && !this._isLoaded) {
70
102
  this._config = window.__RUNTIME_CONFIG__;
103
+ this._isLoaded = true;
71
104
  this.configSubject.next(this._config);
72
105
  return of(this._config);
73
106
  }
74
- // Si no está en window, hacemos petición HTTP
75
- return this.http.get('/runtime-config.json').pipe(tap(config => {
107
+ // Si no está en window, hacemos petición HTTP (solo una vez)
108
+ this._loadPromise = this.http.get('/runtime-config.json').pipe(tap(config => {
76
109
  this._config = config;
110
+ this._isLoaded = true;
77
111
  this.configSubject.next(config);
78
112
  // Guardamos en window para siguientes accesos
79
- window.__RUNTIME_CONFIG__ = config;
80
- }), catchError(error => {
113
+ if (typeof window !== 'undefined') {
114
+ window.__RUNTIME_CONFIG__ = config;
115
+ }
116
+ }), shareReplay(1), // Cache la respuesta para múltiples suscripciones
117
+ catchError(error => {
81
118
  console.error('Error loading runtime config:', error);
82
119
  // Fallback config si falla la carga
83
120
  const fallbackConfig = {
@@ -88,14 +125,17 @@ class RuntimeConfigService {
88
125
  channel: 'minorista'
89
126
  };
90
127
  this._config = fallbackConfig;
128
+ this._isLoaded = true;
91
129
  this.configSubject.next(fallbackConfig);
92
130
  return of(fallbackConfig);
93
131
  }));
132
+ return this._loadPromise;
94
133
  }
95
134
  else {
96
135
  // En SSR, leemos desde window que fue inyectado por el servidor
97
- if (typeof window !== 'undefined' && window.__RUNTIME_CONFIG__) {
136
+ if (typeof window !== 'undefined' && window.__RUNTIME_CONFIG__ && !this._isLoaded) {
98
137
  this._config = window.__RUNTIME_CONFIG__;
138
+ this._isLoaded = true;
99
139
  this.configSubject.next(this._config);
100
140
  return of(this._config);
101
141
  }
@@ -109,6 +149,7 @@ class RuntimeConfigService {
109
149
  channel: 'minorista'
110
150
  };
111
151
  this._config = fallbackConfig;
152
+ this._isLoaded = true;
112
153
  this.configSubject.next(fallbackConfig);
113
154
  return of(fallbackConfig);
114
155
  }
@@ -188,23 +229,26 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
188
229
  }] }, { type: i1.HttpClient }] });
189
230
 
190
231
  /**
191
- * Factory function para APP_INITIALIZER
192
- * Carga la configuración runtime antes de que Angular bootstrap la aplicación
232
+ * Factory function para APP_INITIALIZER (OPTIMIZADA)
233
+ * Carga la configuración runtime UNA SOLA VEZ antes de que Angular bootstrap la aplicación
234
+ * Evita múltiples cargas y mejora el rendimiento
193
235
  */
194
236
  function initializeRuntimeConfig(runtimeConfigService) {
195
237
  return () => {
196
- return new Promise((resolve, reject) => {
197
- runtimeConfigService.loadConfig().subscribe({
198
- next: (config) => {
199
- console.log('🔧 Runtime config loaded:', config);
200
- resolve(config);
201
- },
202
- error: (error) => {
203
- console.error('❌ Failed to load runtime config:', error);
204
- // Aún en caso de error, resolvemos para no bloquear la app
205
- resolve(null);
206
- }
238
+ console.log('🚀 Inicializando Runtime Config...');
239
+ return runtimeConfigService.initialize()
240
+ .then((config) => {
241
+ console.log(' Runtime config inicializado correctamente:', {
242
+ apiUrl: config.apiUrl,
243
+ appEnv: config.appEnv,
244
+ production: config.production
207
245
  });
246
+ return config;
247
+ })
248
+ .catch((error) => {
249
+ console.error('❌ Error al inicializar runtime config:', error);
250
+ // Aún en caso de error, continuamos para no bloquear la app
251
+ return null;
208
252
  });
209
253
  };
210
254
  }
@@ -773,7 +817,7 @@ class OptionsService {
773
817
  */
774
818
  getCategories() {
775
819
  if (this.categoriesSubject.getValue().length === 0) {
776
- this.connection.get(this.taxonsApi()).pipe(shareReplay(1), map((response) => {
820
+ this.connection.get(this.taxonsApi()).pipe(shareReplay$1(1), map((response) => {
777
821
  const categories = this.appendPaths(true, response);
778
822
  this.categoriesSubject.next(categories);
779
823
  return categories;
@@ -791,7 +835,7 @@ class OptionsService {
791
835
  */
792
836
  getSections() {
793
837
  if (this.sectionsSubject.getValue().length === 0) {
794
- this.connection.get(this.sectionsApi()).pipe(shareReplay(1), map((response) => {
838
+ this.connection.get(this.sectionsApi()).pipe(shareReplay$1(1), map((response) => {
795
839
  let sections = response.filter((section) => section.code != 'home');
796
840
  sections = sections.map((section) => this.appendSection(section));
797
841
  this.sectionsSubject.next(sections);
@@ -807,7 +851,7 @@ class OptionsService {
807
851
  */
808
852
  getAttributes(params) {
809
853
  if (this.attributesSubject.getValue().length === 0) {
810
- this.connection.get(this.attributesApi(params)).pipe(shareReplay(1), map((response) => {
854
+ this.connection.get(this.attributesApi(params)).pipe(shareReplay$1(1), map((response) => {
811
855
  const attributes = this.appendPaths(false, (response.attributes[0] || response));
812
856
  this.attributesSubject.next(attributes);
813
857
  return attributes;
@@ -1039,7 +1083,7 @@ class ParametersService {
1039
1083
  */
1040
1084
  getParameters() {
1041
1085
  if (this.parametersSubject.getValue() === null) {
1042
- this.connection.get(this.getAllParametersAPI()).pipe(shareReplay(1), map((response) => {
1086
+ this.connection.get(this.getAllParametersAPI()).pipe(shareReplay$1(1), map((response) => {
1043
1087
  this.parametersSubject.next(response);
1044
1088
  return response;
1045
1089
  }), catchError$1((error) => {
@@ -1103,7 +1147,7 @@ class BlocksRepositoryService {
1103
1147
  */
1104
1148
  getBlocks(section) {
1105
1149
  //if(this.blocksSubject.getValue() != null){
1106
- this.connection.get(this.blocksAPI(section)).pipe(shareReplay(1), map((response) => {
1150
+ this.connection.get(this.blocksAPI(section)).pipe(shareReplay$1(1), map((response) => {
1107
1151
  //console.log(response)
1108
1152
  this.blocksSubject.next(response.items);
1109
1153
  return response;
@@ -2285,7 +2329,7 @@ class ChannelService {
2285
2329
  * @returns Observable con el canal.
2286
2330
  */
2287
2331
  getChannel = () => {
2288
- this.connection.get(this.channelApi()).pipe(shareReplay(1), map((response) => {
2332
+ this.connection.get(this.channelApi()).pipe(shareReplay$1(1), map((response) => {
2289
2333
  this.setChannelInfo(response);
2290
2334
  this.channelSubject.next(response);
2291
2335
  this.channelType = response.type;
@@ -2725,7 +2769,7 @@ class FormService {
2725
2769
  * @returns
2726
2770
  */
2727
2771
  getCountriesData() {
2728
- this.connection.get(this.countriesApi()).pipe(shareReplay(1), map((response) => {
2772
+ this.connection.get(this.countriesApi()).pipe(shareReplay$1(1), map((response) => {
2729
2773
  //console.log(response);
2730
2774
  const data = response._embedded.items;
2731
2775
  this.countriesSubject.next(data);
@@ -4011,7 +4055,7 @@ class PaginationService {
4011
4055
  _connectionService = inject(ConnectionService);
4012
4056
  _filtersService = inject(FiltersService);
4013
4057
  _constants = inject(CoreConstantsService);
4014
- paginationData$ = this._filtersService.filters$.pipe(shareReplay(1), filter(filters => filters && filters.length > 0), switchMap((filters) => {
4058
+ paginationData$ = this._filtersService.filters$.pipe(shareReplay$1(1), filter(filters => filters && filters.length > 0), switchMap((filters) => {
4015
4059
  const url = this.buildUrl(filters);
4016
4060
  return this.getData(url);
4017
4061
  }));
@@ -12246,6 +12290,44 @@ const authInterceptor = (req, next) => {
12246
12290
  return next(req);
12247
12291
  };
12248
12292
 
12293
+ /**
12294
+ * Interceptor que garantiza que las peticiones HTTP no se hagan hasta que
12295
+ * el runtime config esté completamente cargado
12296
+ * Evita que se hagan peticiones con URLs incorrectas
12297
+ */
12298
+ const runtimeConfigInterceptor = (req, next) => {
12299
+ const runtimeConfigService = inject(RuntimeConfigService);
12300
+ // Si la petición es para obtener el runtime config, la dejamos pasar inmediatamente
12301
+ if (req.url.includes('/runtime-config.json')) {
12302
+ return next(req);
12303
+ }
12304
+ // Si la petición es para assets estáticos, la dejamos pasar
12305
+ if (req.url.includes('/assets/') || req.url.includes('.json') || req.url.includes('.css') || req.url.includes('.js')) {
12306
+ return next(req);
12307
+ }
12308
+ // Para las demás peticiones, esperamos a que el config esté listo
12309
+ return runtimeConfigService.config$.pipe(filter$1(config => config !== null), // Esperamos hasta que haya config
12310
+ take$1(1), // Solo tomamos el primer valor válido
12311
+ switchMap$1(config => {
12312
+ // Si la URL ya es completa (empieza con http), la dejamos como está
12313
+ if (req.url.startsWith('http')) {
12314
+ return next(req);
12315
+ }
12316
+ // Si es una URL relativa que debería ir al API, la completamos
12317
+ if (req.url.startsWith('/api/') || req.url.startsWith('api/')) {
12318
+ const apiUrl = config.apiUrl;
12319
+ const cleanUrl = req.url.startsWith('/') ? req.url.substring(1) : req.url;
12320
+ const fullUrl = `${apiUrl}${cleanUrl}`;
12321
+ const modifiedReq = req.clone({
12322
+ url: fullUrl
12323
+ });
12324
+ return next(modifiedReq);
12325
+ }
12326
+ // Para otras URLs, las dejamos pasar sin modificar
12327
+ return next(req);
12328
+ }));
12329
+ };
12330
+
12249
12331
  class ProductStockDirective {
12250
12332
  templateRef;
12251
12333
  viewContainer;
@@ -12447,5 +12529,5 @@ const directives = [
12447
12529
  * Generated bundle index. Do not edit.
12448
12530
  */
12449
12531
 
12450
- export { AccountEcComponent, AddressingService, AnalyticsService, AuthEcComponent, AuthService, AuthStorageService, BaseApiService, BlockBannerBoxEcComponent, BlockBannerFullEcComponent, BlockFormContactEcComponent, BlockHtmlEcComponent, BlockNewsletterEcComponent, BlockProductsEcComponent, BlocksEcComponent, BlocksRepositoryService, BlocksService, BreadcrumbEcComponent, CartEcComponent, CartItemEcComponent, CartService, ChannelService, CheckoutEcComponent, CheckoutService, CollectionEcComponent, ConfirmAccountEcComponent, ContactEcComponent, CoreConstantsService, CouponEcComponent, CurrencyService, DopplerService, ENVIRONMENT_TOKEN, EcCurrencySymbolPipe, EcSafeHtmlPipe, FacebookPixelService, FaqsEcComponent, FiltersEcComponent, FiltersService, FiltersSortEcComponent, FooterEcComponent, ForgotPasswordEcComponent, FormService, GTMService, GoogleAnalyticsService, HeaderEcComponent, HomeEcComponent, LoadingFullEcComponent, LoadingInlineEcComponent, LoadingSectionEcComponent, LocalStorageService, LoginFormEcComponent, MagnizoomEcComponent, MetricoolPixelService, NgxLocalStorageService, OptionsService, OrderEcComponent, OrderUtilityService, OrdersListEcComponent, OrdersService, PaginationService, ParametersService, ParamsContext, PasswordResetEcComponent, PaymentService, PriceEcComponent, PriceRangeFilterComponent, ProductDetailEcComponent, ProductDetailService, ProductEcComponent, ProductOffDirective, ProductStockDirective, ProductsService, ReCaptchaEcComponent, ReCaptchaService, RedsysCatchEcComponent, RegisterFormEcComponent, RegisterWholesalerFormEcComponent, RelatedProductsEcComponent, ReviewsEcComponent, ReviewsFormEcComponent, RuntimeConfigService, SectionContainerEcComponent, ShareEcComponent, ShipmentService, SidebarEcComponent, StoresEcComponent, SuccessEcComponent, TestService, ToastService, VariantsEcComponent, authGuard, authInterceptor, directives, initializeRuntimeConfig, provideEnvironment, provideRuntimeConfig };
12532
+ export { AccountEcComponent, AddressingService, AnalyticsService, AuthEcComponent, AuthService, AuthStorageService, BaseApiService, BlockBannerBoxEcComponent, BlockBannerFullEcComponent, BlockFormContactEcComponent, BlockHtmlEcComponent, BlockNewsletterEcComponent, BlockProductsEcComponent, BlocksEcComponent, BlocksRepositoryService, BlocksService, BreadcrumbEcComponent, CartEcComponent, CartItemEcComponent, CartService, ChannelService, CheckoutEcComponent, CheckoutService, CollectionEcComponent, ConfirmAccountEcComponent, ContactEcComponent, CoreConstantsService, CouponEcComponent, CurrencyService, DopplerService, ENVIRONMENT_TOKEN, EcCurrencySymbolPipe, EcSafeHtmlPipe, FacebookPixelService, FaqsEcComponent, FiltersEcComponent, FiltersService, FiltersSortEcComponent, FooterEcComponent, ForgotPasswordEcComponent, FormService, GTMService, GoogleAnalyticsService, HeaderEcComponent, HomeEcComponent, LoadingFullEcComponent, LoadingInlineEcComponent, LoadingSectionEcComponent, LocalStorageService, LoginFormEcComponent, MagnizoomEcComponent, MetricoolPixelService, NgxLocalStorageService, OptionsService, OrderEcComponent, OrderUtilityService, OrdersListEcComponent, OrdersService, PaginationService, ParametersService, ParamsContext, PasswordResetEcComponent, PaymentService, PriceEcComponent, PriceRangeFilterComponent, ProductDetailEcComponent, ProductDetailService, ProductEcComponent, ProductOffDirective, ProductStockDirective, ProductsService, ReCaptchaEcComponent, ReCaptchaService, RedsysCatchEcComponent, RegisterFormEcComponent, RegisterWholesalerFormEcComponent, RelatedProductsEcComponent, ReviewsEcComponent, ReviewsFormEcComponent, RuntimeConfigService, SectionContainerEcComponent, ShareEcComponent, ShipmentService, SidebarEcComponent, StoresEcComponent, SuccessEcComponent, TestService, ToastService, VariantsEcComponent, authGuard, authInterceptor, directives, initializeRuntimeConfig, provideEnvironment, provideRuntimeConfig, runtimeConfigInterceptor };
12451
12533
  //# sourceMappingURL=ng-easycommerce-v18.mjs.map