ng-easycommerce-v18 0.3.18-beta.1 → 0.3.19-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 -3
- package/assets/ec-i18n/en.json +1 -0
- package/assets/ec-i18n/es.json +1 -0
- package/esm2022/lib/constants/api.constants.service.mjs +15 -19
- package/esm2022/lib/ec-components/blocks-ec/block-products-ec/block-products-ec.component.mjs +2 -4
- package/esm2022/lib/ec-components/cart-ec/cart-item-ec/cart-item-ec.component.mjs +37 -9
- package/esm2022/lib/ec-components/header-ec/header-ec.component.mjs +21 -31
- package/esm2022/lib/ec-components/product-ec/product-ec.component.mjs +54 -6
- package/esm2022/lib/ec-services/analytics/google-analytics.service.mjs +2 -2
- package/esm2022/lib/ec-services/cart.service.mjs +22 -4
- package/esm2022/lib/ec-services/checkout.service.mjs +2 -4
- package/esm2022/lib/ec-services/index.mjs +1 -3
- package/esm2022/lib/ec-services/product-detail.service.mjs +11 -1
- package/esm2022/lib/interfaces/environment.mjs +1 -1
- package/esm2022/lib/interfaces/index.mjs +1 -2
- package/esm2022/lib/interfaces/product.mjs +1 -1
- package/esm2022/lib/providers/index.mjs +1 -2
- package/fesm2022/ng-easycommerce-v18.mjs +215 -451
- package/fesm2022/ng-easycommerce-v18.mjs.map +1 -1
- package/lib/constants/api.constants.service.d.ts +0 -1
- package/lib/ec-components/cart-ec/cart-item-ec/cart-item-ec.component.d.ts +1 -1
- package/lib/ec-components/product-ec/product-ec.component.d.ts +4 -0
- package/lib/ec-services/cart.service.d.ts +1 -1
- package/lib/ec-services/index.d.ts +0 -2
- package/lib/interfaces/environment.d.ts +0 -1
- package/lib/interfaces/index.d.ts +0 -1
- package/lib/interfaces/product.d.ts +6 -0
- 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 -149
- package/esm2022/lib/interfaces/runtime-config.mjs +0 -2
- package/esm2022/lib/providers/provideRuntimeConfig.mjs +0 -39
- package/lib/ec-services/base-api.service.d.ts +0 -64
- package/lib/ec-services/runtime-config.service.d.ts +0 -56
- package/lib/interfaces/runtime-config.d.ts +0 -22
- package/lib/providers/provideRuntimeConfig.d.ts +0 -12
|
@@ -16,8 +16,8 @@ export declare class CartItemEcComponent implements OnInit {
|
|
|
16
16
|
isQuantityUpdating: boolean;
|
|
17
17
|
ngOnInit(): void;
|
|
18
18
|
updateQuantity(stock: number): void;
|
|
19
|
-
less(stock: number, value?: number): void;
|
|
20
19
|
plus(stock: number, value?: number): void;
|
|
20
|
+
less(stock: number, value?: number): void;
|
|
21
21
|
deleteCartItem(): void;
|
|
22
22
|
getVariants(product: any): any;
|
|
23
23
|
createDiscountMessage(saleprice: number, price: number): string;
|
|
@@ -50,6 +50,10 @@ export declare class ProductEcComponent implements OnInit {
|
|
|
50
50
|
plus(stock?: number, multipleQuantity?: number): void;
|
|
51
51
|
less(multipleQuantity?: number): void;
|
|
52
52
|
addToCart(): void;
|
|
53
|
+
/**
|
|
54
|
+
* Valida las restricciones de cantidad del producto
|
|
55
|
+
*/
|
|
56
|
+
private validateQuantity;
|
|
53
57
|
checkStock(stock: number): void;
|
|
54
58
|
onQuantityChange(event: Event): void;
|
|
55
59
|
static ɵfac: i0.ɵɵFactoryDeclaration<ProductEcComponent, never>;
|
|
@@ -115,7 +115,7 @@ export declare class CartService {
|
|
|
115
115
|
* @param item el item a actualizar.
|
|
116
116
|
* @param quantity la cantidad nueva.
|
|
117
117
|
*/
|
|
118
|
-
updateItemQuantity(item: CartItem, quantity: number):
|
|
118
|
+
updateItemQuantity(item: CartItem, quantity: number): boolean;
|
|
119
119
|
/**
|
|
120
120
|
* Maneja el error en caso de que no se pueda agregar al carrito el producto.
|
|
121
121
|
* @param err
|
|
@@ -5,6 +5,9 @@ export interface OptionValue {
|
|
|
5
5
|
name: string;
|
|
6
6
|
description?: string;
|
|
7
7
|
selected?: boolean;
|
|
8
|
+
maximumItemsQuantity?: number;
|
|
9
|
+
minimumItemsQuantity?: number;
|
|
10
|
+
multipleQuantity?: number;
|
|
8
11
|
}
|
|
9
12
|
export interface Options {
|
|
10
13
|
code: string;
|
|
@@ -34,6 +37,9 @@ export interface Product {
|
|
|
34
37
|
productWithUniqueVariant?: Product[];
|
|
35
38
|
stock?: number;
|
|
36
39
|
variant_id?: number;
|
|
40
|
+
maximumItemsQuantity?: number;
|
|
41
|
+
minimumItemsQuantity?: number;
|
|
42
|
+
multipleQuantity?: number;
|
|
37
43
|
}
|
|
38
44
|
export interface ProductToCartItem {
|
|
39
45
|
productCode?: string;
|
package/lib/providers/index.d.ts
CHANGED
package/package.json
CHANGED
|
@@ -1,148 +0,0 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
import { HttpHeaders } from '@angular/common/http';
|
|
3
|
-
import { switchMap } from 'rxjs';
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
import * as i1 from "@angular/common/http";
|
|
6
|
-
import * as i2 from "./runtime-config.service";
|
|
7
|
-
/**
|
|
8
|
-
* Servicio base para realizar peticiones HTTP usando configuración dinámica
|
|
9
|
-
* Todos los servicios de la aplicación deben extender este servicio o usar sus métodos
|
|
10
|
-
*/
|
|
11
|
-
export class BaseApiService {
|
|
12
|
-
http;
|
|
13
|
-
runtimeConfigService;
|
|
14
|
-
constructor(http, runtimeConfigService) {
|
|
15
|
-
this.http = http;
|
|
16
|
-
this.runtimeConfigService = runtimeConfigService;
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* Construye una URL completa usando la API_URL del runtime
|
|
20
|
-
*/
|
|
21
|
-
buildApiUrl(endpoint) {
|
|
22
|
-
return this.runtimeConfigService.buildApiUrl(endpoint);
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* Obtiene headers comunes que incluyen información del runtime
|
|
26
|
-
*/
|
|
27
|
-
getCommonHeaders() {
|
|
28
|
-
const config = this.runtimeConfigService.getConfig();
|
|
29
|
-
let headers = new HttpHeaders({
|
|
30
|
-
'Content-Type': 'application/json'
|
|
31
|
-
});
|
|
32
|
-
if (config) {
|
|
33
|
-
headers = headers
|
|
34
|
-
.set('X-Channel', config.channel)
|
|
35
|
-
.set('X-Locale', config.locale)
|
|
36
|
-
.set('X-Environment', config.appEnv);
|
|
37
|
-
}
|
|
38
|
-
return headers;
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* Método GET genérico
|
|
42
|
-
*/
|
|
43
|
-
get(endpoint, options = {}) {
|
|
44
|
-
const url = this.buildApiUrl(endpoint);
|
|
45
|
-
const headers = this.mergeHeaders(options.headers);
|
|
46
|
-
return this.http.get(url, {
|
|
47
|
-
...options,
|
|
48
|
-
headers
|
|
49
|
-
});
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* Método POST genérico
|
|
53
|
-
*/
|
|
54
|
-
post(endpoint, data, options = {}) {
|
|
55
|
-
const url = this.buildApiUrl(endpoint);
|
|
56
|
-
const headers = this.mergeHeaders(options.headers);
|
|
57
|
-
return this.http.post(url, data, {
|
|
58
|
-
...options,
|
|
59
|
-
headers
|
|
60
|
-
});
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* Método PUT genérico
|
|
64
|
-
*/
|
|
65
|
-
put(endpoint, data, options = {}) {
|
|
66
|
-
const url = this.buildApiUrl(endpoint);
|
|
67
|
-
const headers = this.mergeHeaders(options.headers);
|
|
68
|
-
return this.http.put(url, data, {
|
|
69
|
-
...options,
|
|
70
|
-
headers
|
|
71
|
-
});
|
|
72
|
-
}
|
|
73
|
-
/**
|
|
74
|
-
* Método PATCH genérico
|
|
75
|
-
*/
|
|
76
|
-
patch(endpoint, data, options = {}) {
|
|
77
|
-
const url = this.buildApiUrl(endpoint);
|
|
78
|
-
const headers = this.mergeHeaders(options.headers);
|
|
79
|
-
return this.http.patch(url, data, {
|
|
80
|
-
...options,
|
|
81
|
-
headers
|
|
82
|
-
});
|
|
83
|
-
}
|
|
84
|
-
/**
|
|
85
|
-
* Método DELETE genérico
|
|
86
|
-
*/
|
|
87
|
-
delete(endpoint, options = {}) {
|
|
88
|
-
const url = this.buildApiUrl(endpoint);
|
|
89
|
-
const headers = this.mergeHeaders(options.headers);
|
|
90
|
-
return this.http.delete(url, {
|
|
91
|
-
...options,
|
|
92
|
-
headers
|
|
93
|
-
});
|
|
94
|
-
}
|
|
95
|
-
/**
|
|
96
|
-
* Método para peticiones que necesitan esperar a que la config esté cargada
|
|
97
|
-
*/
|
|
98
|
-
getWithConfig(endpoint, options = {}) {
|
|
99
|
-
return this.runtimeConfigService.config$.pipe(switchMap(config => {
|
|
100
|
-
if (!config) {
|
|
101
|
-
throw new Error('Runtime config not loaded');
|
|
102
|
-
}
|
|
103
|
-
return this.get(endpoint, options);
|
|
104
|
-
}));
|
|
105
|
-
}
|
|
106
|
-
/**
|
|
107
|
-
* Método para POST que necesitan esperar a que la config esté cargada
|
|
108
|
-
*/
|
|
109
|
-
postWithConfig(endpoint, data, options = {}) {
|
|
110
|
-
return this.runtimeConfigService.config$.pipe(switchMap(config => {
|
|
111
|
-
if (!config) {
|
|
112
|
-
throw new Error('Runtime config not loaded');
|
|
113
|
-
}
|
|
114
|
-
return this.post(endpoint, data, options);
|
|
115
|
-
}));
|
|
116
|
-
}
|
|
117
|
-
/**
|
|
118
|
-
* Combina headers personalizados con los headers comunes
|
|
119
|
-
*/
|
|
120
|
-
mergeHeaders(customHeaders) {
|
|
121
|
-
let headers = this.getCommonHeaders();
|
|
122
|
-
if (customHeaders) {
|
|
123
|
-
if (customHeaders instanceof HttpHeaders) {
|
|
124
|
-
customHeaders.keys().forEach(key => {
|
|
125
|
-
const values = customHeaders.getAll(key);
|
|
126
|
-
if (values) {
|
|
127
|
-
headers = headers.set(key, values);
|
|
128
|
-
}
|
|
129
|
-
});
|
|
130
|
-
}
|
|
131
|
-
else {
|
|
132
|
-
Object.keys(customHeaders).forEach(key => {
|
|
133
|
-
headers = headers.set(key, customHeaders[key]);
|
|
134
|
-
});
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
return headers;
|
|
138
|
-
}
|
|
139
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: BaseApiService, deps: [{ token: i1.HttpClient }, { token: i2.RuntimeConfigService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
140
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: BaseApiService, providedIn: 'root' });
|
|
141
|
-
}
|
|
142
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: BaseApiService, decorators: [{
|
|
143
|
-
type: Injectable,
|
|
144
|
-
args: [{
|
|
145
|
-
providedIn: 'root'
|
|
146
|
-
}]
|
|
147
|
-
}], ctorParameters: () => [{ type: i1.HttpClient }, { type: i2.RuntimeConfigService }] });
|
|
148
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1hcGkuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWVhc3ljb21tZXJjZS12MTgvc3JjL2xpYi9lYy1zZXJ2aWNlcy9iYXNlLWFwaS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFjLFdBQVcsRUFBYyxNQUFNLHNCQUFzQixDQUFDO0FBQzNFLE9BQU8sRUFBYyxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7QUFTN0M7OztHQUdHO0FBSUgsTUFBTSxPQUFPLGNBQWM7SUFHYjtJQUNBO0lBRlosWUFDWSxJQUFnQixFQUNoQixvQkFBMEM7UUFEMUMsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUNoQix5QkFBb0IsR0FBcEIsb0JBQW9CLENBQXNCO0lBQ25ELENBQUM7SUFFSjs7T0FFRztJQUNPLFdBQVcsQ0FBQyxRQUFnQjtRQUNwQyxPQUFPLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVEOztPQUVHO0lBQ08sZ0JBQWdCO1FBQ3hCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNyRCxJQUFJLE9BQU8sR0FBRyxJQUFJLFdBQVcsQ0FBQztZQUM1QixjQUFjLEVBQUUsa0JBQWtCO1NBQ25DLENBQUMsQ0FBQztRQUVILElBQUksTUFBTSxFQUFFLENBQUM7WUFDWCxPQUFPLEdBQUcsT0FBTztpQkFDZCxHQUFHLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUM7aUJBQ2hDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQztpQkFDOUIsR0FBRyxDQUFDLGVBQWUsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDekMs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SlUsY0FBYzs0R0FBZCxjQUFjLGNBRmIsTUFBTTs7NEZBRVAsY0FBYztrQkFIMUIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBIZWFkZXJzLCBIdHRwUGFyYW1zIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgUnVudGltZUNvbmZpZ1NlcnZpY2UgfSBmcm9tICcuL3J1bnRpbWUtY29uZmlnLnNlcnZpY2UnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBBcGlSZXF1ZXN0T3B0aW9ucyB7XHJcbiAgaGVhZGVycz86IEh0dHBIZWFkZXJzIHwgeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfCBzdHJpbmdbXSB9O1xyXG4gIHBhcmFtcz86IEh0dHBQYXJhbXMgfCB7IFtwYXJhbTogc3RyaW5nXTogc3RyaW5nIHwgc3RyaW5nW10gfTtcclxuICB3aXRoQ3JlZGVudGlhbHM/OiBib29sZWFuO1xyXG59XHJcblxyXG4vKipcclxuICogU2VydmljaW8gYmFzZSBwYXJhIHJlYWxpemFyIHBldGljaW9uZXMgSFRUUCB1c2FuZG8gY29uZmlndXJhY2nDs24gZGluw6FtaWNhXHJcbiAqIFRvZG9zIGxvcyBzZXJ2aWNpb3MgZGUgbGEgYXBsaWNhY2nDs24gZGViZW4gZXh0ZW5kZXIgZXN0ZSBzZXJ2aWNpbyBvIHVzYXIgc3VzIG3DqXRvZG9zXHJcbiAqL1xyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBCYXNlQXBpU2VydmljZSB7XHJcbiAgXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcm90ZWN0ZWQgaHR0cDogSHR0cENsaWVudCxcclxuICAgIHByb3RlY3RlZCBydW50aW1lQ29uZmlnU2VydmljZTogUnVudGltZUNvbmZpZ1NlcnZpY2VcclxuICApIHt9XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbnN0cnV5ZSB1bmEgVVJMIGNvbXBsZXRhIHVzYW5kbyBsYSBBUElfVVJMIGRlbCBydW50aW1lXHJcbiAgICovXHJcbiAgcHJvdGVjdGVkIGJ1aWxkQXBpVXJsKGVuZHBvaW50OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMucnVudGltZUNvbmZpZ1NlcnZpY2UuYnVpbGRBcGlVcmwoZW5kcG9pbnQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogT2J0aWVuZSBoZWFkZXJzIGNvbXVuZXMgcXVlIGluY2x1eWVuIGluZm9ybWFjacOzbiBkZWwgcnVudGltZVxyXG4gICAqL1xyXG4gIHByb3RlY3RlZCBnZXRDb21tb25IZWFkZXJzKCk6IEh0dHBIZWFkZXJzIHtcclxuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMucnVudGltZUNvbmZpZ1NlcnZpY2UuZ2V0Q29uZmlnKCk7XHJcbiAgICBsZXQgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycyh7XHJcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcclxuICAgIH0pO1xyXG5cclxuICAgIGlmIChjb25maWcpIHtcclxuICAgICAgaGVhZGVycyA9IGhlYWRlcnNcclxuICAgICAgICAuc2V0KCdYLUNoYW5uZWwnLCBjb25maWcuY2hhbm5lbClcclxuICAgICAgICAuc2V0KCdYLUxvY2FsZScsIGNvbmZpZy5sb2NhbGUpXHJcbiAgICAgICAgLnNldCgnWC1FbnZpcm9ubWVudCcsIGNvbmZpZy5hcHBFbnYpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBoZWFkZXJzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTcOpdG9kbyBHRVQgZ2Vuw6lyaWNvXHJcbiAgICovXHJcbiAgZ2V0PFQ+KGVuZHBvaW50OiBzdHJpbmcsIG9wdGlvbnM6IEFwaVJlcXVlc3RPcHRpb25zID0ge30pOiBPYnNlcnZhYmxlPFQ+IHtcclxuICAgIGNvbnN0IHVybCA9IHRoaXMuYnVpbGRBcGlVcmwoZW5kcG9pbnQpO1xyXG4gICAgY29uc3QgaGVhZGVycyA9IHRoaXMubWVyZ2VIZWFkZXJzKG9wdGlvbnMuaGVhZGVycyk7XHJcbiAgICBcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PFQ+KHVybCwge1xyXG4gICAgICAuLi5vcHRpb25zLFxyXG4gICAgICBoZWFkZXJzXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE3DqXRvZG8gUE9TVCBnZW7DqXJpY29cclxuICAgKi9cclxuICBwb3N0PFQ+KGVuZHBvaW50OiBzdHJpbmcsIGRhdGE6IGFueSwgb3B0aW9uczogQXBpUmVxdWVzdE9wdGlvbnMgPSB7fSk6IE9ic2VydmFibGU8VD4ge1xyXG4gICAgY29uc3QgdXJsID0gdGhpcy5idWlsZEFwaVVybChlbmRwb2ludCk7XHJcbiAgICBjb25zdCBoZWFkZXJzID0gdGhpcy5tZXJnZUhlYWRlcnMob3B0aW9ucy5oZWFkZXJzKTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8VD4odXJsLCBkYXRhLCB7XHJcbiAgICAgIC4uLm9wdGlvbnMsXHJcbiAgICAgIGhlYWRlcnNcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTcOpdG9kbyBQVVQgZ2Vuw6lyaWNvXHJcbiAgICovXHJcbiAgcHV0PFQ+KGVuZHBvaW50OiBzdHJpbmcsIGRhdGE6IGFueSwgb3B0aW9uczogQXBpUmVxdWVzdE9wdGlvbnMgPSB7fSk6IE9ic2VydmFibGU8VD4ge1xyXG4gICAgY29uc3QgdXJsID0gdGhpcy5idWlsZEFwaVVybChlbmRwb2ludCk7XHJcbiAgICBjb25zdCBoZWFkZXJzID0gdGhpcy5tZXJnZUhlYWRlcnMob3B0aW9ucy5oZWFkZXJzKTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnB1dDxUPih1cmwsIGRhdGEsIHtcclxuICAgICAgLi4ub3B0aW9ucyxcclxuICAgICAgaGVhZGVyc1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNw6l0b2RvIFBBVENIIGdlbsOpcmljb1xyXG4gICAqL1xyXG4gIHBhdGNoPFQ+KGVuZHBvaW50OiBzdHJpbmcsIGRhdGE6IGFueSwgb3B0aW9uczogQXBpUmVxdWVzdE9wdGlvbnMgPSB7fSk6IE9ic2VydmFibGU8VD4ge1xyXG4gICAgY29uc3QgdXJsID0gdGhpcy5idWlsZEFwaVVybChlbmRwb2ludCk7XHJcbiAgICBjb25zdCBoZWFkZXJzID0gdGhpcy5tZXJnZUhlYWRlcnMob3B0aW9ucy5oZWFkZXJzKTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnBhdGNoPFQ+KHVybCwgZGF0YSwge1xyXG4gICAgICAuLi5vcHRpb25zLFxyXG4gICAgICBoZWFkZXJzXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE3DqXRvZG8gREVMRVRFIGdlbsOpcmljb1xyXG4gICAqL1xyXG4gIGRlbGV0ZTxUPihlbmRwb2ludDogc3RyaW5nLCBvcHRpb25zOiBBcGlSZXF1ZXN0T3B0aW9ucyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XHJcbiAgICBjb25zdCB1cmwgPSB0aGlzLmJ1aWxkQXBpVXJsKGVuZHBvaW50KTtcclxuICAgIGNvbnN0IGhlYWRlcnMgPSB0aGlzLm1lcmdlSGVhZGVycyhvcHRpb25zLmhlYWRlcnMpO1xyXG5cclxuICAgIHJldHVybiB0aGlzLmh0dHAuZGVsZXRlPFQ+KHVybCwge1xyXG4gICAgICAuLi5vcHRpb25zLFxyXG4gICAgICBoZWFkZXJzXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE3DqXRvZG8gcGFyYSBwZXRpY2lvbmVzIHF1ZSBuZWNlc2l0YW4gZXNwZXJhciBhIHF1ZSBsYSBjb25maWcgZXN0w6kgY2FyZ2FkYVxyXG4gICAqL1xyXG4gIGdldFdpdGhDb25maWc8VD4oZW5kcG9pbnQ6IHN0cmluZywgb3B0aW9uczogQXBpUmVxdWVzdE9wdGlvbnMgPSB7fSk6IE9ic2VydmFibGU8VD4ge1xyXG4gICAgcmV0dXJuIHRoaXMucnVudGltZUNvbmZpZ1NlcnZpY2UuY29uZmlnJC5waXBlKFxyXG4gICAgICBzd2l0Y2hNYXAoY29uZmlnID0+IHtcclxuICAgICAgICBpZiAoIWNvbmZpZykge1xyXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSdW50aW1lIGNvbmZpZyBub3QgbG9hZGVkJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLmdldDxUPihlbmRwb2ludCwgb3B0aW9ucyk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTcOpdG9kbyBwYXJhIFBPU1QgcXVlIG5lY2VzaXRhbiBlc3BlcmFyIGEgcXVlIGxhIGNvbmZpZyBlc3TDqSBjYXJnYWRhXHJcbiAgICovXHJcbiAgcG9zdFdpdGhDb25maWc8VD4oZW5kcG9pbnQ6IHN0cmluZywgZGF0YTogYW55LCBvcHRpb25zOiBBcGlSZXF1ZXN0T3B0aW9ucyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XHJcbiAgICByZXR1cm4gdGhpcy5ydW50aW1lQ29uZmlnU2VydmljZS5jb25maWckLnBpcGUoXHJcbiAgICAgIHN3aXRjaE1hcChjb25maWcgPT4ge1xyXG4gICAgICAgIGlmICghY29uZmlnKSB7XHJcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1J1bnRpbWUgY29uZmlnIG5vdCBsb2FkZWQnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucG9zdDxUPihlbmRwb2ludCwgZGF0YSwgb3B0aW9ucyk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ29tYmluYSBoZWFkZXJzIHBlcnNvbmFsaXphZG9zIGNvbiBsb3MgaGVhZGVycyBjb211bmVzXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBtZXJnZUhlYWRlcnMoY3VzdG9tSGVhZGVycz86IEh0dHBIZWFkZXJzIHwgeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfCBzdHJpbmdbXSB9KTogSHR0cEhlYWRlcnMge1xyXG4gICAgbGV0IGhlYWRlcnMgPSB0aGlzLmdldENvbW1vbkhlYWRlcnMoKTtcclxuXHJcbiAgICBpZiAoY3VzdG9tSGVhZGVycykge1xyXG4gICAgICBpZiAoY3VzdG9tSGVhZGVycyBpbnN0YW5jZW9mIEh0dHBIZWFkZXJzKSB7XHJcbiAgICAgICAgY3VzdG9tSGVhZGVycy5rZXlzKCkuZm9yRWFjaChrZXkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgdmFsdWVzID0gY3VzdG9tSGVhZGVycy5nZXRBbGwoa2V5KTtcclxuICAgICAgICAgIGlmICh2YWx1ZXMpIHtcclxuICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KGtleSwgdmFsdWVzKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBPYmplY3Qua2V5cyhjdXN0b21IZWFkZXJzKS5mb3JFYWNoKGtleSA9PiB7XHJcbiAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoa2V5LCBjdXN0b21IZWFkZXJzW2tleV0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGhlYWRlcnM7XHJcbiAgfVxyXG59Il19
|
|
@@ -1,149 +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 } 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
|
-
constructor(platformId, http) {
|
|
14
|
-
this.platformId = platformId;
|
|
15
|
-
this.http = http;
|
|
16
|
-
}
|
|
17
|
-
/**
|
|
18
|
-
* Carga la configuración en runtime
|
|
19
|
-
* - En SSR: Lee desde el objeto window inyectado por el servidor
|
|
20
|
-
* - En Browser: Hace petición HTTP a /runtime-config.json
|
|
21
|
-
*/
|
|
22
|
-
loadConfig() {
|
|
23
|
-
// Si ya tenemos la config cargada, la devolvemos
|
|
24
|
-
if (this._config) {
|
|
25
|
-
return of(this._config);
|
|
26
|
-
}
|
|
27
|
-
if (isPlatformBrowser(this.platformId)) {
|
|
28
|
-
// En el navegador, primero intentamos obtener la config desde window
|
|
29
|
-
if (window.__RUNTIME_CONFIG__) {
|
|
30
|
-
this._config = window.__RUNTIME_CONFIG__;
|
|
31
|
-
this.configSubject.next(this._config);
|
|
32
|
-
return of(this._config);
|
|
33
|
-
}
|
|
34
|
-
// Si no está en window, hacemos petición HTTP
|
|
35
|
-
return this.http.get('/runtime-config.json').pipe(tap(config => {
|
|
36
|
-
this._config = config;
|
|
37
|
-
this.configSubject.next(config);
|
|
38
|
-
// Guardamos en window para siguientes accesos
|
|
39
|
-
window.__RUNTIME_CONFIG__ = config;
|
|
40
|
-
}), catchError(error => {
|
|
41
|
-
console.error('Error loading runtime config:', error);
|
|
42
|
-
// Fallback config si falla la carga
|
|
43
|
-
const fallbackConfig = {
|
|
44
|
-
apiUrl: 'https://elden-preprod.backend.easycommerce.com.ar/',
|
|
45
|
-
appEnv: 'preprod',
|
|
46
|
-
production: false,
|
|
47
|
-
locale: 'es_AR',
|
|
48
|
-
channel: 'minorista'
|
|
49
|
-
};
|
|
50
|
-
this._config = fallbackConfig;
|
|
51
|
-
this.configSubject.next(fallbackConfig);
|
|
52
|
-
return of(fallbackConfig);
|
|
53
|
-
}));
|
|
54
|
-
}
|
|
55
|
-
else {
|
|
56
|
-
// En SSR, leemos desde window que fue inyectado por el servidor
|
|
57
|
-
if (typeof window !== 'undefined' && window.__RUNTIME_CONFIG__) {
|
|
58
|
-
this._config = window.__RUNTIME_CONFIG__;
|
|
59
|
-
this.configSubject.next(this._config);
|
|
60
|
-
return of(this._config);
|
|
61
|
-
}
|
|
62
|
-
// Fallback para SSR si no hay config inyectada
|
|
63
|
-
// En el servidor, las variables de entorno se configuran desde el server.ts
|
|
64
|
-
const fallbackConfig = {
|
|
65
|
-
apiUrl: 'https://elden-preprod.backend.easycommerce.com.ar/',
|
|
66
|
-
appEnv: 'preprod',
|
|
67
|
-
production: false,
|
|
68
|
-
locale: 'es_AR',
|
|
69
|
-
channel: 'minorista'
|
|
70
|
-
};
|
|
71
|
-
this._config = fallbackConfig;
|
|
72
|
-
this.configSubject.next(fallbackConfig);
|
|
73
|
-
return of(fallbackConfig);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
/**
|
|
77
|
-
* Obtiene la configuración actual (síncrono)
|
|
78
|
-
*/
|
|
79
|
-
getConfig() {
|
|
80
|
-
return this._config;
|
|
81
|
-
}
|
|
82
|
-
/**
|
|
83
|
-
* Obtiene la API URL actual
|
|
84
|
-
*/
|
|
85
|
-
getApiUrl() {
|
|
86
|
-
return this._config?.apiUrl || 'https://elden-preprod.backend.easycommerce.com.ar/';
|
|
87
|
-
}
|
|
88
|
-
/**
|
|
89
|
-
* Obtiene la Frontend URL actual
|
|
90
|
-
*/
|
|
91
|
-
getFrontendUrl() {
|
|
92
|
-
return this._config?.frontendUrl;
|
|
93
|
-
}
|
|
94
|
-
/**
|
|
95
|
-
* Obtiene el entorno actual
|
|
96
|
-
*/
|
|
97
|
-
getAppEnv() {
|
|
98
|
-
return this._config?.appEnv || 'development';
|
|
99
|
-
}
|
|
100
|
-
/**
|
|
101
|
-
* Verifica si estamos en producción
|
|
102
|
-
*/
|
|
103
|
-
isProduction() {
|
|
104
|
-
return this._config?.production || false;
|
|
105
|
-
}
|
|
106
|
-
/**
|
|
107
|
-
* Obtiene el locale actual
|
|
108
|
-
*/
|
|
109
|
-
getLocale() {
|
|
110
|
-
return this._config?.locale || 'es_AR';
|
|
111
|
-
}
|
|
112
|
-
/**
|
|
113
|
-
* Obtiene el canal actual
|
|
114
|
-
*/
|
|
115
|
-
getChannel() {
|
|
116
|
-
return this._config?.channel || 'minorista';
|
|
117
|
-
}
|
|
118
|
-
/**
|
|
119
|
-
* Método helper para construir URLs de API
|
|
120
|
-
*/
|
|
121
|
-
buildApiUrl(endpoint) {
|
|
122
|
-
const apiUrl = this.getApiUrl();
|
|
123
|
-
const cleanEndpoint = endpoint.startsWith('/') ? endpoint.slice(1) : endpoint;
|
|
124
|
-
return `${apiUrl}${cleanEndpoint}`;
|
|
125
|
-
}
|
|
126
|
-
/**
|
|
127
|
-
* Método helper para construir URLs del frontend
|
|
128
|
-
*/
|
|
129
|
-
buildFrontendUrl(path) {
|
|
130
|
-
const frontendUrl = this.getFrontendUrl();
|
|
131
|
-
if (!frontendUrl) {
|
|
132
|
-
return path;
|
|
133
|
-
}
|
|
134
|
-
const cleanPath = path.startsWith('/') ? path.slice(1) : path;
|
|
135
|
-
return `${frontendUrl}${cleanPath}`;
|
|
136
|
-
}
|
|
137
|
-
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 });
|
|
138
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RuntimeConfigService, providedIn: 'root' });
|
|
139
|
-
}
|
|
140
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RuntimeConfigService, decorators: [{
|
|
141
|
-
type: Injectable,
|
|
142
|
-
args: [{
|
|
143
|
-
providedIn: 'root'
|
|
144
|
-
}]
|
|
145
|
-
}], ctorParameters: () => [{ type: Object, decorators: [{
|
|
146
|
-
type: Inject,
|
|
147
|
-
args: [PLATFORM_ID]
|
|
148
|
-
}] }, { type: i1.HttpClient }] });
|
|
149
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS1jb25maWcuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWVhc3ljb21tZXJjZS12MTgvc3JjL2xpYi9lYy1zZXJ2aWNlcy9ydW50aW1lLWNvbmZpZy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUVwRCxPQUFPLEVBQWMsRUFBRSxFQUFFLGVBQWUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN2RCxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7QUFRakQsTUFBTSxPQUFPLG9CQUFvQjtJQU9BO0lBQ3JCO0lBUEYsYUFBYSxHQUFHLElBQUksZUFBZSxDQUF1QixJQUFJLENBQUMsQ0FBQztJQUNqRSxPQUFPLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUUzQyxPQUFPLEdBQXlCLElBQUksQ0FBQztJQUU3QyxZQUMrQixVQUFrQixFQUN2QyxJQUFnQjtRQURLLGVBQVUsR0FBVixVQUFVLENBQVE7UUFDdkMsU0FBSSxHQUFKLElBQUksQ0FBWTtJQUN2QixDQUFDO0lBRUo7Ozs7T0FJRztJQUNILFVBQVU7UUFDUixpREFBaUQ7UUFDakQsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakIsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQXdCLENBQUMsQ0FBQztRQUMzQyxDQUFDO1FBRUQsSUFBSSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUN2QyxxRUFBcUU7WUFDckUsSUFBSSxNQUFNLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztnQkFDOUIsSUFBSSxDQUFD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ICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgaXNQbGF0Zm9ybUJyb3dzZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiwgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGNhdGNoRXJyb3IsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgUnVudGltZUNvbmZpZyB9IGZyb20gJy4uL2ludGVyZmFjZXMvcnVudGltZS1jb25maWcnO1xyXG5cclxuZGVjbGFyZSBjb25zdCB3aW5kb3c6IGFueTtcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIFJ1bnRpbWVDb25maWdTZXJ2aWNlIHtcclxuICBwcml2YXRlIGNvbmZpZ1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFJ1bnRpbWVDb25maWcgfCBudWxsPihudWxsKTtcclxuICBwdWJsaWMgY29uZmlnJCA9IHRoaXMuY29uZmlnU3ViamVjdC5hc09ic2VydmFibGUoKTtcclxuICBcclxuICBwcml2YXRlIF9jb25maWc6IFJ1bnRpbWVDb25maWcgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBASW5qZWN0KFBMQVRGT1JNX0lEKSBwcml2YXRlIHBsYXRmb3JtSWQ6IE9iamVjdCxcclxuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudFxyXG4gICkge31cclxuXHJcbiAgLyoqXHJcbiAgICogQ2FyZ2EgbGEgY29uZmlndXJhY2nDs24gZW4gcnVudGltZVxyXG4gICAqIC0gRW4gU1NSOiBMZWUgZGVzZGUgZWwgb2JqZXRvIHdpbmRvdyBpbnllY3RhZG8gcG9yIGVsIHNlcnZpZG9yXHJcbiAgICogLSBFbiBCcm93c2VyOiBIYWNlIHBldGljacOzbiBIVFRQIGEgL3J1bnRpbWUtY29uZmlnLmpzb25cclxuICAgKi9cclxuICBsb2FkQ29uZmlnKCk6IE9ic2VydmFibGU8UnVudGltZUNvbmZpZz4ge1xyXG4gICAgLy8gU2kgeWEgdGVuZW1vcyBsYSBjb25maWcgY2FyZ2FkYSwgbGEgZGV2b2x2ZW1vc1xyXG4gICAgaWYgKHRoaXMuX2NvbmZpZykge1xyXG4gICAgICByZXR1cm4gb2YodGhpcy5fY29uZmlnIGFzIFJ1bnRpbWVDb25maWcpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSB7XHJcbiAgICAgIC8vIEVuIGVsIG5hdmVnYWRvciwgcHJpbWVybyBpbnRlbnRhbW9zIG9idGVuZXIgbGEgY29uZmlnIGRlc2RlIHdpbmRvd1xyXG4gICAgICBpZiAod2luZG93Ll9fUlVOVElNRV9DT05GSUdfXykge1xyXG4gICAgICAgIHRoaXMuX2NvbmZpZyA9IHdpbmRvdy5fX1JVTlRJTUVfQ09ORklHX187XHJcbiAgICAgICAgdGhpcy5jb25maWdTdWJqZWN0Lm5leHQodGhpcy5fY29uZmlnKTtcclxuICAgICAgICByZXR1cm4gb2YodGhpcy5fY29uZmlnIGFzIFJ1bnRpbWVDb25maWcpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBTaSBubyBlc3TDoSBlbiB3aW5kb3csIGhhY2Vtb3MgcGV0aWNpw7NuIEhUVFBcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8UnVudGltZUNvbmZpZz4oJy9ydW50aW1lLWNvbmZpZy5qc29uJykucGlwZShcclxuICAgICAgICB0YXAoY29uZmlnID0+IHtcclxuICAgICAgICAgIHRoaXMuX2NvbmZpZyA9IGNvbmZpZztcclxuICAgICAgICAgIHRoaXMuY29uZmlnU3ViamVjdC5uZXh0KGNvbmZpZyk7XHJcbiAgICAgICAgICAvLyBHdWFyZGFtb3MgZW4gd2luZG93IHBhcmEgc2lndWllbnRlcyBhY2Nlc29zXHJcbiAgICAgICAgICB3aW5kb3cuX19SVU5USU1FX0NPTkZJR19fID0gY29uZmlnO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgbG9hZGluZyBydW50aW1lIGNvbmZpZzonLCBlcnJvcik7XHJcbiAgICAgICAgICAvLyBGYWxsYmFjayBjb25maWcgc2kgZmFsbGEgbGEgY2FyZ2FcclxuICAgICAgICAgIGNvbnN0IGZhbGxiYWNrQ29uZmlnOiBSdW50aW1lQ29uZmlnID0ge1xyXG4gICAgICAgICAgICBhcGlVcmw6ICdodHRwczovL2VsZGVuLXByZXByb2QuYmFja2VuZC5lYXN5Y29tbWVyY2UuY29tLmFyLycsXHJcbiAgICAgICAgICAgIGFwcEVudjogJ3ByZXByb2QnLFxyXG4gICAgICAgICAgICBwcm9kdWN0aW9uOiBmYWxzZSxcclxuICAgICAgICAgICAgbG9jYWxlOiAnZXNfQVInLFxyXG4gICAgICAgICAgICBjaGFubmVsOiAnbWlub3Jpc3RhJ1xyXG4gICAgICAgICAgfTtcclxuICAgICAgICAgIHRoaXMuX2NvbmZpZyA9IGZhbGxiYWNrQ29uZmlnO1xyXG4gICAgICAgICAgdGhpcy5jb25maWdTdWJqZWN0Lm5leHQoZmFsbGJhY2tDb25maWcpO1xyXG4gICAgICAgICAgcmV0dXJuIG9mKGZhbGxiYWNrQ29uZmlnKTtcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gRW4gU1NSLCBsZWVtb3MgZGVzZGUgd2luZG93IHF1ZSBmdWUgaW55ZWN0YWRvIHBvciBlbCBzZXJ2aWRvclxyXG4gICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93Ll9fUlVOVElNRV9DT05GSUdfXykge1xyXG4gICAgICAgIHRoaXMuX2NvbmZpZyA9IHdpbmRvdy5fX1JVTlRJTUVfQ09ORklHX187XHJcbiAgICAgICAgdGhpcy5jb25maWdTdWJqZWN0Lm5leHQodGhpcy5fY29uZmlnKTtcclxuICAgICAgICByZXR1cm4gb2YodGhpcy5fY29uZmlnIGFzIFJ1bnRpbWVDb25maWcpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBGYWxsYmFjayBwYXJhIFNTUiBzaSBubyBoYXkgY29uZmlnIGlueWVjdGFkYVxyXG4gICAgICAvLyBFbiBlbCBzZXJ2aWRvciwgbGFzIHZhcmlhYmxlcyBkZSBlbnRvcm5vIHNlIGNvbmZpZ3VyYW4gZGVzZGUgZWwgc2VydmVyLnRzXHJcbiAgICAgIGNvbnN0IGZhbGxiYWNrQ29uZmlnOiBSdW50aW1lQ29uZmlnID0ge1xyXG4gICAgICAgIGFwaVVybDogJ2h0dHBzOi8vZWxkZW4tcHJlcHJvZC5iYWNrZW5kLmVhc3ljb21tZXJjZS5jb20uYXIvJyxcclxuICAgICAgICBhcHBFbnY6ICdwcmVwcm9kJyxcclxuICAgICAgICBwcm9kdWN0aW9uOiBmYWxzZSxcclxuICAgICAgICBsb2NhbGU6ICdlc19BUicsXHJcbiAgICAgICAgY2hhbm5lbDogJ21pbm9yaXN0YSdcclxuICAgICAgfTtcclxuICAgICAgXHJcbiAgICAgIHRoaXMuX2NvbmZpZyA9IGZhbGxiYWNrQ29uZmlnO1xyXG4gICAgICB0aGlzLmNvbmZpZ1N1YmplY3QubmV4dChmYWxsYmFja0NvbmZpZyk7XHJcbiAgICAgIHJldHVybiBvZihmYWxsYmFja0NvbmZpZyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBPYnRpZW5lIGxhIGNvbmZpZ3VyYWNpw7NuIGFjdHVhbCAoc8OtbmNyb25vKVxyXG4gICAqL1xyXG4gIGdldENvbmZpZygpOiBSdW50aW1lQ29uZmlnIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy5fY29uZmlnO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogT2J0aWVuZSBsYSBBUEkgVVJMIGFjdHVhbFxyXG4gICAqL1xyXG4gIGdldEFwaVVybCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZz8uYXBpVXJsIHx8ICdodHRwczovL2VsZGVuLXByZXByb2QuYmFja2VuZC5lYXN5Y29tbWVyY2UuY29tLmFyLyc7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBPYnRpZW5lIGxhIEZyb250ZW5kIFVSTCBhY3R1YWxcclxuICAgKi9cclxuICBnZXRGcm9udGVuZFVybCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZz8uZnJvbnRlbmRVcmw7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBPYnRpZW5lIGVsIGVudG9ybm8gYWN0dWFsXHJcbiAgICovXHJcbiAgZ2V0QXBwRW52KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fY29uZmlnPy5hcHBFbnYgfHwgJ2RldmVsb3BtZW50JztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFZlcmlmaWNhIHNpIGVzdGFtb3MgZW4gcHJvZHVjY2nDs25cclxuICAgKi9cclxuICBpc1Byb2R1Y3Rpb24oKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fY29uZmlnPy5wcm9kdWN0aW9uIHx8IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogT2J0aWVuZSBlbCBsb2NhbGUgYWN0dWFsXHJcbiAgICovXHJcbiAgZ2V0TG9jYWxlKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fY29uZmlnPy5sb2NhbGUgfHwgJ2VzX0FSJztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE9idGllbmUgZWwgY2FuYWwgYWN0dWFsXHJcbiAgICovXHJcbiAgZ2V0Q2hhbm5lbCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZz8uY2hhbm5lbCB8fCAnbWlub3Jpc3RhJztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE3DqXRvZG8gaGVscGVyIHBhcmEgY29uc3RydWlyIFVSTHMgZGUgQVBJXHJcbiAgICovXHJcbiAgYnVpbGRBcGlVcmwoZW5kcG9pbnQ6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBhcGlVcmwgPSB0aGlzLmdldEFwaVVybCgpO1xyXG4gICAgY29uc3QgY2xlYW5FbmRwb2ludCA9IGVuZHBvaW50LnN0YXJ0c1dpdGgoJy8nKSA/IGVuZHBvaW50LnNsaWNlKDEpIDogZW5kcG9pbnQ7XHJcbiAgICByZXR1cm4gYCR7YXBpVXJsfSR7Y2xlYW5FbmRwb2ludH1gO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTcOpdG9kbyBoZWxwZXIgcGFyYSBjb25zdHJ1aXIgVVJMcyBkZWwgZnJvbnRlbmRcclxuICAgKi9cclxuICBidWlsZEZyb250ZW5kVXJsKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBmcm9udGVuZFVybCA9IHRoaXMuZ2V0RnJvbnRlbmRVcmwoKTtcclxuICAgIGlmICghZnJvbnRlbmRVcmwpIHtcclxuICAgICAgcmV0dXJuIHBhdGg7XHJcbiAgICB9XHJcbiAgICBjb25zdCBjbGVhblBhdGggPSBwYXRoLnN0YXJ0c1dpdGgoJy8nKSA/IHBhdGguc2xpY2UoMSkgOiBwYXRoO1xyXG4gICAgcmV0dXJuIGAke2Zyb250ZW5kVXJsfSR7Y2xlYW5QYXRofWA7XHJcbiAgfVxyXG59Il19
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
export {};
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS1jb25maWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1lYXN5Y29tbWVyY2UtdjE4L3NyYy9saWIvaW50ZXJmYWNlcy9ydW50aW1lLWNvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBSdW50aW1lQ29uZmlnIHtcclxuICBhcGlVcmw6IHN0cmluZztcclxuICBmcm9udGVuZFVybD86IHN0cmluZztcclxuICAvKiogQW1iaWVudGUgZGUgbGEgYXBsaWNhY2nDs24uIFZhbG9yZXMgdsOhbGlkb3M6ICdwcm9kJywgJ3ByZXByb2QnLCAndGVzdCcgKi9cclxuICBhcHBFbnY6ICdwcm9kJyB8ICdwcmVwcm9kJyB8ICd0ZXN0JztcclxuICBwcm9kdWN0aW9uOiBib29sZWFuO1xyXG4gIGxvY2FsZTogc3RyaW5nO1xyXG4gIGNoYW5uZWw6IHN0cmluZztcclxuICBwb3J0PzogbnVtYmVyO1xyXG4gIGhvc3Q/OiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2VydmVyRW52aXJvbm1lbnRWYXJpYWJsZXMge1xyXG4gIEFQSV9VUkw/OiBzdHJpbmc7XHJcbiAgRlJPTlRFTkRfVVJMPzogc3RyaW5nO1xyXG4gIC8qKiBBbWJpZW50ZSBkZSBsYSBhcGxpY2FjacOzbi4gVmFsb3JlcyB2w6FsaWRvczogJ3Byb2QnLCAncHJlcHJvZCcsICd0ZXN0JyAqL1xyXG4gIEFQUF9FTlY/OiAncHJvZCcgfCAncHJlcHJvZCcgfCAndGVzdCc7XHJcbiAgUE9SVD86IHN0cmluZztcclxuICBIT1NUPzogc3RyaW5nO1xyXG4gIE5PREVfRU5WPzogJ2RldmVsb3BtZW50JyB8ICdwcm9kdWN0aW9uJztcclxuICBMT0NBTEU/OiBzdHJpbmc7XHJcbiAgQ0hBTk5FTD86IHN0cmluZztcclxufSJdfQ==
|
|
@@ -1,39 +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
|
|
5
|
-
* Carga la configuración runtime antes de que Angular bootstrap la aplicación
|
|
6
|
-
*/
|
|
7
|
-
export function initializeRuntimeConfig(runtimeConfigService) {
|
|
8
|
-
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
|
-
}
|
|
20
|
-
});
|
|
21
|
-
});
|
|
22
|
-
};
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* Función que configura el RuntimeConfigService y su inicialización
|
|
26
|
-
* Debe ser usado en app.config.ts junto con provideEnvironment
|
|
27
|
-
*/
|
|
28
|
-
export function provideRuntimeConfig() {
|
|
29
|
-
return makeEnvironmentProviders([
|
|
30
|
-
RuntimeConfigService,
|
|
31
|
-
{
|
|
32
|
-
provide: APP_INITIALIZER,
|
|
33
|
-
useFactory: initializeRuntimeConfig,
|
|
34
|
-
deps: [RuntimeConfigService],
|
|
35
|
-
multi: true
|
|
36
|
-
}
|
|
37
|
-
]);
|
|
38
|
-
}
|
|
39
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZVJ1bnRpbWVDb25maWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1lYXN5Y29tbWVyY2UtdjE4L3NyYy9saWIvcHJvdmlkZXJzL3Byb3ZpZGVSdW50aW1lQ29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxlQUFlLEVBQXdCLHdCQUF3QixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hHLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBRTdFOzs7R0FHRztBQUNILE1BQU0sVUFBVSx1QkFBdUIsQ0FBQyxvQkFBMEM7SUFDaEYsT0FBTyxHQUFpQixFQUFFO1FBQ3hCLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDckMsb0JBQW9CLENBQUMsVUFBVSxFQUFFLENBQUMsU0FBUyxDQUFDO2dCQUMxQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRTtvQkFDZixPQUFPLENBQUMsR0FBRyxDQUFDLDJCQUEyQixFQUFFLE1BQU0sQ0FBQyxDQUFDO29CQUNqRCxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ2xCLENBQUM7Z0JBQ0QsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7b0JBQ2YsT0FBTyxDQUFDLEtBQUssQ0FBQyxrQ0FBa0MsRUFBRSxLQUFLLENBQUMsQ0FBQztvQkFDekQsMkRBQTJEO29CQUMzRCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2hCLENBQUM7YUFDRixDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsb0JBQW9CO0lBQ2xDLE9BQU8sd0JBQXdCLENBQUM7UUFDOUIsb0JBQW9CO1FBQ3BCO1lBQ0UsT0FBTyxFQUFFLGVBQWU7WUFDeEIsVUFBVSxFQUFFLHVCQUF1QjtZQUNuQyxJQUFJLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQztZQUM1QixLQUFLLEVBQUUsSUFBSTtTQUNaO0tBQ0YsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFQUF9JTklUSUFMSVpFUiwgRW52aXJvbm1lbnRQcm92aWRlcnMsIG1ha2VFbnZpcm9ubWVudFByb3ZpZGVycyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBSdW50aW1lQ29uZmlnU2VydmljZSB9IGZyb20gJy4uL2VjLXNlcnZpY2VzL3J1bnRpbWUtY29uZmlnLnNlcnZpY2UnO1xyXG5cclxuLyoqXHJcbiAqIEZhY3RvcnkgZnVuY3Rpb24gcGFyYSBBUFBfSU5JVElBTElaRVJcclxuICogQ2FyZ2EgbGEgY29uZmlndXJhY2nDs24gcnVudGltZSBhbnRlcyBkZSBxdWUgQW5ndWxhciBib290c3RyYXAgbGEgYXBsaWNhY2nDs25cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBpbml0aWFsaXplUnVudGltZUNvbmZpZyhydW50aW1lQ29uZmlnU2VydmljZTogUnVudGltZUNvbmZpZ1NlcnZpY2UpOiAoKSA9PiBQcm9taXNlPGFueT4ge1xyXG4gIHJldHVybiAoKTogUHJvbWlzZTxhbnk+ID0+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIHJ1bnRpbWVDb25maWdTZXJ2aWNlLmxvYWRDb25maWcoKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IChjb25maWcpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKCfwn5SnIFJ1bnRpbWUgY29uZmlnIGxvYWRlZDonLCBjb25maWcpO1xyXG4gICAgICAgICAgcmVzb2x2ZShjb25maWcpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcign4p2MIEZhaWxlZCB0byBsb2FkIHJ1bnRpbWUgY29uZmlnOicsIGVycm9yKTtcclxuICAgICAgICAgIC8vIEHDum4gZW4gY2FzbyBkZSBlcnJvciwgcmVzb2x2ZW1vcyBwYXJhIG5vIGJsb3F1ZWFyIGxhIGFwcFxyXG4gICAgICAgICAgcmVzb2x2ZShudWxsKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEZ1bmNpw7NuIHF1ZSBjb25maWd1cmEgZWwgUnVudGltZUNvbmZpZ1NlcnZpY2UgeSBzdSBpbmljaWFsaXphY2nDs25cclxuICogRGViZSBzZXIgdXNhZG8gZW4gYXBwLmNvbmZpZy50cyBqdW50byBjb24gcHJvdmlkZUVudmlyb25tZW50XHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gcHJvdmlkZVJ1bnRpbWVDb25maWcoKTogRW52aXJvbm1lbnRQcm92aWRlcnMge1xyXG4gIHJldHVybiBtYWtlRW52aXJvbm1lbnRQcm92aWRlcnMoW1xyXG4gICAgUnVudGltZUNvbmZpZ1NlcnZpY2UsXHJcbiAgICB7XHJcbiAgICAgIHByb3ZpZGU6IEFQUF9JTklUSUFMSVpFUixcclxuICAgICAgdXNlRmFjdG9yeTogaW5pdGlhbGl6ZVJ1bnRpbWVDb25maWcsXHJcbiAgICAgIGRlcHM6IFtSdW50aW1lQ29uZmlnU2VydmljZV0sXHJcbiAgICAgIG11bHRpOiB0cnVlXHJcbiAgICB9XHJcbiAgXSk7XHJcbn0iXX0=
|
|
@@ -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,56 +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
|
-
constructor(platformId: Object, http: HttpClient);
|
|
12
|
-
/**
|
|
13
|
-
* Carga la configuración en runtime
|
|
14
|
-
* - En SSR: Lee desde el objeto window inyectado por el servidor
|
|
15
|
-
* - En Browser: Hace petición HTTP a /runtime-config.json
|
|
16
|
-
*/
|
|
17
|
-
loadConfig(): Observable<RuntimeConfig>;
|
|
18
|
-
/**
|
|
19
|
-
* Obtiene la configuración actual (síncrono)
|
|
20
|
-
*/
|
|
21
|
-
getConfig(): RuntimeConfig | null;
|
|
22
|
-
/**
|
|
23
|
-
* Obtiene la API URL actual
|
|
24
|
-
*/
|
|
25
|
-
getApiUrl(): string;
|
|
26
|
-
/**
|
|
27
|
-
* Obtiene la Frontend URL actual
|
|
28
|
-
*/
|
|
29
|
-
getFrontendUrl(): string | undefined;
|
|
30
|
-
/**
|
|
31
|
-
* Obtiene el entorno actual
|
|
32
|
-
*/
|
|
33
|
-
getAppEnv(): string;
|
|
34
|
-
/**
|
|
35
|
-
* Verifica si estamos en producción
|
|
36
|
-
*/
|
|
37
|
-
isProduction(): boolean;
|
|
38
|
-
/**
|
|
39
|
-
* Obtiene el locale actual
|
|
40
|
-
*/
|
|
41
|
-
getLocale(): string;
|
|
42
|
-
/**
|
|
43
|
-
* Obtiene el canal actual
|
|
44
|
-
*/
|
|
45
|
-
getChannel(): string;
|
|
46
|
-
/**
|
|
47
|
-
* Método helper para construir URLs de API
|
|
48
|
-
*/
|
|
49
|
-
buildApiUrl(endpoint: string): string;
|
|
50
|
-
/**
|
|
51
|
-
* Método helper para construir URLs del frontend
|
|
52
|
-
*/
|
|
53
|
-
buildFrontendUrl(path: string): string;
|
|
54
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<RuntimeConfigService, never>;
|
|
55
|
-
static ɵprov: i0.ɵɵInjectableDeclaration<RuntimeConfigService>;
|
|
56
|
-
}
|
|
@@ -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,12 +0,0 @@
|
|
|
1
|
-
import { EnvironmentProviders } from '@angular/core';
|
|
2
|
-
import { RuntimeConfigService } from '../ec-services/runtime-config.service';
|
|
3
|
-
/**
|
|
4
|
-
* Factory function para APP_INITIALIZER
|
|
5
|
-
* Carga la configuración runtime antes de que Angular bootstrap la aplicación
|
|
6
|
-
*/
|
|
7
|
-
export declare function initializeRuntimeConfig(runtimeConfigService: RuntimeConfigService): () => Promise<any>;
|
|
8
|
-
/**
|
|
9
|
-
* Función que configura el RuntimeConfigService y su inicialización
|
|
10
|
-
* Debe ser usado en app.config.ts junto con provideEnvironment
|
|
11
|
-
*/
|
|
12
|
-
export declare function provideRuntimeConfig(): EnvironmentProviders;
|