ng-easycommerce-v18 0.3.20-beta.1 → 0.3.21-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -16
- package/esm2022/lib/classes/filters/attributes-filter.mjs +4 -74
- package/esm2022/lib/classes/filters/category-filter.mjs +26 -105
- package/esm2022/lib/classes/filters/filter-factory.mjs +3 -7
- package/esm2022/lib/classes/filters/price_range-filter.mjs +3 -3
- package/esm2022/lib/constants/api.constants.service.mjs +15 -19
- package/esm2022/lib/constants/core.constants.service.mjs +5 -16
- package/esm2022/lib/ec-components/abstractions-components/menu-ec.component.mjs +1 -17
- package/esm2022/lib/ec-components/auth-ec/login-form-ec/login-form-ec.component.mjs +16 -26
- package/esm2022/lib/ec-components/auth-ec/password-reset-ec/password-reset-ec.component.mjs +21 -25
- package/esm2022/lib/ec-components/blocks-ec/block-products-ec/block-products-ec.component.mjs +16 -4
- package/esm2022/lib/ec-components/collection-ec/collection-ec.component.mjs +17 -41
- package/esm2022/lib/ec-components/filters-ec/filters-ec.component.mjs +14 -72
- package/esm2022/lib/ec-components/header-ec/header-ec.component.mjs +25 -41
- package/esm2022/lib/ec-components/price-range-filter/price-range-filter.component.mjs +2 -13
- package/esm2022/lib/ec-components/product-detail-ec/product-detail-ec.component.mjs +7 -12
- package/esm2022/lib/ec-components/stores-ec/stores-ec.component.mjs +9 -18
- package/esm2022/lib/ec-components/widgets-ec/decidir-ec/decidir-ec.component.mjs +6 -12
- package/esm2022/lib/ec-components/widgets-ec/magnizoom-ec/magnizoom-ec.component.mjs +4 -6
- package/esm2022/lib/ec-components/widgets-ec/redsys-catch-ec/redsys-catch-ec.component.mjs +17 -7
- package/esm2022/lib/ec-services/analytics/google-analytics.service.mjs +4 -4
- package/esm2022/lib/ec-services/analytics/gtm.service.mjs +6 -10
- package/esm2022/lib/ec-services/analytics/metricool-pixel.service.mjs +18 -17
- package/esm2022/lib/ec-services/checkout.service.mjs +2 -4
- package/esm2022/lib/ec-services/filters.service.mjs +18 -124
- package/esm2022/lib/ec-services/index.mjs +1 -3
- package/esm2022/lib/ec-services/pagination.service.mjs +22 -70
- package/esm2022/lib/ec-services/products.service.mjs +3 -5
- package/esm2022/lib/interceptors/index.mjs +1 -2
- package/esm2022/lib/interfaces/environment.mjs +1 -1
- package/esm2022/lib/interfaces/filter.mjs +1 -1
- package/esm2022/lib/interfaces/index.mjs +1 -2
- package/esm2022/lib/interfaces/options.mjs +1 -1
- package/esm2022/lib/providers/index.mjs +1 -2
- package/fesm2022/ng-easycommerce-v18.mjs +316 -1186
- package/fesm2022/ng-easycommerce-v18.mjs.map +1 -1
- package/lib/classes/filters/attributes-filter.d.ts +0 -24
- package/lib/classes/filters/category-filter.d.ts +3 -30
- package/lib/constants/api.constants.service.d.ts +0 -1
- package/lib/constants/core.constants.service.d.ts +0 -7
- package/lib/ec-components/abstractions-components/menu-ec.component.d.ts +0 -12
- package/lib/ec-components/auth-ec/login-form-ec/login-form-ec.component.d.ts +0 -2
- package/lib/ec-components/collection-ec/collection-ec.component.d.ts +4 -5
- package/lib/ec-components/filters-ec/filters-ec.component.d.ts +4 -25
- package/lib/ec-components/price-range-filter/price-range-filter.component.d.ts +0 -2
- package/lib/ec-services/analytics/gtm.service.d.ts +1 -1
- package/lib/ec-services/filters.service.d.ts +1 -18
- package/lib/ec-services/index.d.ts +0 -2
- package/lib/ec-services/pagination.service.d.ts +5 -21
- package/lib/ec-services/products.service.d.ts +1 -1
- package/lib/interceptors/index.d.ts +0 -1
- package/lib/interfaces/environment.d.ts +0 -1
- package/lib/interfaces/filter.d.ts +0 -1
- package/lib/interfaces/index.d.ts +0 -1
- package/lib/interfaces/options.d.ts +0 -2
- package/lib/providers/index.d.ts +0 -1
- package/package.json +1 -1
- package/esm2022/lib/ec-services/base-api.service.mjs +0 -148
- package/esm2022/lib/ec-services/runtime-config.service.mjs +0 -190
- package/esm2022/lib/interceptors/runtime-config.interceptor.mjs +0 -41
- package/esm2022/lib/interfaces/runtime-config.mjs +0 -2
- package/esm2022/lib/providers/provideRuntimeConfig.mjs +0 -42
- package/lib/ec-services/base-api.service.d.ts +0 -64
- package/lib/ec-services/runtime-config.service.d.ts +0 -63
- package/lib/interceptors/runtime-config.interceptor.d.ts +0 -7
- package/lib/interfaces/runtime-config.d.ts +0 -22
- package/lib/providers/provideRuntimeConfig.d.ts +0 -13
|
@@ -1,38 +1,14 @@
|
|
|
1
1
|
import { FilterElement, FilterType } from "../../interfaces";
|
|
2
2
|
import { Filter } from "./filter";
|
|
3
|
-
import { Params } from "@angular/router";
|
|
4
|
-
/**
|
|
5
|
-
* AttributesFilter
|
|
6
|
-
* - Gestiona el filtro de atributos (estructura de padres/children).
|
|
7
|
-
* - Soporta hidratación desde query params y aplicación de códigos seleccionados.
|
|
8
|
-
*/
|
|
9
3
|
export declare class AttributesFilter extends Filter {
|
|
10
4
|
private _optionsService;
|
|
11
5
|
data: FilterElement[];
|
|
12
6
|
multi: boolean;
|
|
13
|
-
private _codesFromQuery;
|
|
14
7
|
constructor(initialValue?: any, options?: any);
|
|
15
8
|
type(): FilterType;
|
|
16
9
|
setContent(options: any, initialValue?: any): void;
|
|
17
10
|
getContent(): FilterElement[];
|
|
18
|
-
/**
|
|
19
|
-
* ADDED: toUrlParams construye la porción de query string que representa las selecciones de atributos.
|
|
20
|
-
*/
|
|
21
11
|
toUrlParams(actual_url?: string, sublist?: any, already?: any): string;
|
|
22
12
|
cleanResult(text: string): string;
|
|
23
|
-
/**
|
|
24
|
-
* ADDED: createElement transforma cada nodo original en FilterElement y marca selección inicial si corresponde.
|
|
25
|
-
*/
|
|
26
13
|
createElement(filter: any, original: any, initialValue?: any): any;
|
|
27
|
-
/** hidratar desde la URL */
|
|
28
|
-
hydrateFromQuery(params: Params): void;
|
|
29
|
-
/**
|
|
30
|
-
* ADDED: applyCodes recorre la estructura y marca selected=true en los children cuyo código está en 'codes'.
|
|
31
|
-
* Además marca el parent como seleccionado si alguno de sus hijos lo está.
|
|
32
|
-
*/
|
|
33
|
-
private applyCodes;
|
|
34
|
-
/**
|
|
35
|
-
* ADDED: clearSelection desmarca todos los parents y children (restablece el filtro).
|
|
36
|
-
*/
|
|
37
|
-
private clearSelection;
|
|
38
14
|
}
|
|
@@ -1,41 +1,14 @@
|
|
|
1
1
|
import { FilterElement, FilterType } from "../../interfaces";
|
|
2
2
|
import { Filter } from "./filter";
|
|
3
|
-
/**
|
|
4
|
-
* CategoryFilter
|
|
5
|
-
* - Gestiona el filtro de categorías.
|
|
6
|
-
* - Mantiene la estructura de categorías (parents/children) y permite:
|
|
7
|
-
* * Inicializar desde OptionsService.
|
|
8
|
-
* * Marcar elementos según slug o query param.
|
|
9
|
-
* * Generar porción de query string (&category=...).
|
|
10
|
-
*/
|
|
11
3
|
export declare class CategoryFilter extends Filter {
|
|
4
|
+
private initialValues?;
|
|
12
5
|
private _optionsService;
|
|
13
|
-
private _filtersService;
|
|
14
6
|
data: FilterElement[];
|
|
15
7
|
multi: boolean;
|
|
16
|
-
constructor(
|
|
8
|
+
constructor(initialValues?: any);
|
|
17
9
|
type(): FilterType;
|
|
18
10
|
setContent(options: any, initialValue?: any): void;
|
|
19
11
|
getContent(): FilterElement[];
|
|
20
|
-
|
|
21
|
-
* toUrlParams
|
|
22
|
-
* - Recorre la estructura y devuelve la porción de query string para la categoría seleccionada.
|
|
23
|
-
* - Prioriza el primer selected encontrado (solo una categoría se envía).
|
|
24
|
-
*/
|
|
25
|
-
toUrlParams(): string;
|
|
12
|
+
toUrlParams(actual_url?: string, sublist?: any): string;
|
|
26
13
|
createElement(filter: any, original: any, initialValue?: any): any;
|
|
27
|
-
/**
|
|
28
|
-
* setFromSlug
|
|
29
|
-
* - Marca como selected los nodos cuyo slug/path/name coincide con el slug proporcionado.
|
|
30
|
-
* - Utiliza removeAccents para comparar sin tildes y en minúsculas.
|
|
31
|
-
* - No retorna valor, solo modifica this.data.
|
|
32
|
-
*/
|
|
33
|
-
setFromSlug(slug: string): void;
|
|
34
|
-
/**
|
|
35
|
-
* hydrateFromQuery
|
|
36
|
-
* - Marca la categoría según el parámetro de query 'category' si existe.
|
|
37
|
-
* - Busca el code exacto en la estructura y marca el nodo correspondiente.
|
|
38
|
-
* - Loggea si se encontró o no la categoría.
|
|
39
|
-
*/
|
|
40
|
-
hydrateFromQuery(query: any): void;
|
|
41
14
|
}
|
|
@@ -27,11 +27,6 @@ export declare class CoreConstantsService {
|
|
|
27
27
|
* Guarda la variable window del web browser.
|
|
28
28
|
*/
|
|
29
29
|
private window?;
|
|
30
|
-
/**
|
|
31
|
-
* Tipo de ruta actual (ej: 'categories', 'attributes', etc).
|
|
32
|
-
* Lo usamos para que PaginationService sepa qué filtro esperar.
|
|
33
|
-
*/
|
|
34
|
-
currentRouteType: string | null;
|
|
35
30
|
constructor();
|
|
36
31
|
/**
|
|
37
32
|
* Path usado en las colecciones de productos.
|
|
@@ -149,8 +144,6 @@ export declare class CoreConstantsService {
|
|
|
149
144
|
getParamsProductsWithUniqueVariant: () => ParamsProductsWithUniqueVariant;
|
|
150
145
|
getChannel(): string;
|
|
151
146
|
form_sender: boolean;
|
|
152
|
-
setCurrentRouteType(type: string | null): void;
|
|
153
|
-
getCurrentRouteType(): string | null;
|
|
154
147
|
static ɵfac: i0.ɵɵFactoryDeclaration<CoreConstantsService, never>;
|
|
155
148
|
static ɵprov: i0.ɵɵInjectableDeclaration<CoreConstantsService>;
|
|
156
149
|
}
|
|
@@ -75,18 +75,6 @@ export declare class MenuEcComponent {
|
|
|
75
75
|
* @returns true si la categoría es visible, false en caso contrario
|
|
76
76
|
*/
|
|
77
77
|
hasVisibleProperty(category: Category): boolean;
|
|
78
|
-
private filterVisibleTree;
|
|
79
|
-
categoriesVisible$: Observable<Category[]>;
|
|
80
|
-
sectionsVisible$: Observable<Section[]>;
|
|
81
|
-
attributesVisible$: Observable<Attribute[]>;
|
|
82
|
-
getVisibleChildren<T extends {
|
|
83
|
-
isVisible?: boolean;
|
|
84
|
-
children?: T[];
|
|
85
|
-
}>(node?: T): T[];
|
|
86
|
-
hasVisibleChildren<T extends {
|
|
87
|
-
isVisible?: boolean;
|
|
88
|
-
children?: T[];
|
|
89
|
-
}>(node?: T): boolean;
|
|
90
78
|
static ɵfac: i0.ɵɵFactoryDeclaration<MenuEcComponent, never>;
|
|
91
79
|
static ɵcmp: i0.ɵɵComponentDeclaration<MenuEcComponent, "lib-footer-ec", never, {}, {}, never, never, true, never>;
|
|
92
80
|
}
|
|
@@ -2,12 +2,10 @@ import { EventEmitter } from '@angular/core';
|
|
|
2
2
|
import { UserRoleType } from '../../../interfaces';
|
|
3
3
|
import * as i0 from "@angular/core";
|
|
4
4
|
export declare class LoginFormEcComponent {
|
|
5
|
-
private platformId;
|
|
6
5
|
private _authService;
|
|
7
6
|
private _formBuilder;
|
|
8
7
|
private _toastService;
|
|
9
8
|
private _router;
|
|
10
|
-
constructor(platformId: Object);
|
|
11
9
|
showPassword: boolean;
|
|
12
10
|
/**
|
|
13
11
|
* Parametro para indicar si tras loguear
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { OnInit } from '@angular/core';
|
|
2
2
|
import { DefaultFilter, FilterType, Product } from '../../interfaces';
|
|
3
3
|
import { AuthService, OptionsService, ProductsService } from '../../ec-services';
|
|
4
4
|
import { ActivatedRoute } from '@angular/router';
|
|
@@ -6,11 +6,10 @@ import { CoreConstantsService } from '../../constants';
|
|
|
6
6
|
import { Observable } from 'rxjs';
|
|
7
7
|
import { Filter } from '../../classes';
|
|
8
8
|
import * as i0 from "@angular/core";
|
|
9
|
-
export declare class CollectionEcComponent implements OnInit
|
|
9
|
+
export declare class CollectionEcComponent implements OnInit {
|
|
10
10
|
protected _productsService: ProductsService;
|
|
11
11
|
protected _activeRoute: ActivatedRoute;
|
|
12
12
|
protected _optionsService: OptionsService;
|
|
13
|
-
private _filtersService;
|
|
14
13
|
params$: Observable<import("@angular/router").Params>;
|
|
15
14
|
queryParams$: Observable<import("@angular/router").Params>;
|
|
16
15
|
products$: Observable<Product[]>;
|
|
@@ -23,17 +22,17 @@ export declare class CollectionEcComponent implements OnInit, OnDestroy {
|
|
|
23
22
|
private loaded;
|
|
24
23
|
optionsFilters: FilterType[];
|
|
25
24
|
filters_sort: Filter[];
|
|
25
|
+
private _filtersService;
|
|
26
26
|
filters$: Observable<Filter[]>;
|
|
27
27
|
ready$: Observable<boolean>;
|
|
28
28
|
private window?;
|
|
29
29
|
isList: boolean;
|
|
30
|
-
private destroy$;
|
|
31
30
|
setAsList: (value: boolean) => boolean;
|
|
32
31
|
ngOnInit(): void;
|
|
33
32
|
private total;
|
|
34
33
|
private platformId;
|
|
35
34
|
constructor();
|
|
36
|
-
|
|
35
|
+
getProducts(): void;
|
|
37
36
|
onScroll(): void;
|
|
38
37
|
productHasStock(product: Product): boolean;
|
|
39
38
|
static ɵfac: i0.ɵɵFactoryDeclaration<CollectionEcComponent, never>;
|
|
@@ -15,7 +15,6 @@ export declare class FiltersEcComponent {
|
|
|
15
15
|
injector: Injector;
|
|
16
16
|
isAuthenticated$: boolean;
|
|
17
17
|
hidePrices: boolean;
|
|
18
|
-
private route;
|
|
19
18
|
setSelect: any;
|
|
20
19
|
ngOnInit(): void;
|
|
21
20
|
constructor();
|
|
@@ -24,18 +23,6 @@ export declare class FiltersEcComponent {
|
|
|
24
23
|
/** 2) Para cualquier otro FilterType, devuelvo Filter */
|
|
25
24
|
getSpecificFilter(type: FilterType): Filter | null;
|
|
26
25
|
onSelect(event: any, filter: FilterElement[] | null): void;
|
|
27
|
-
/**
|
|
28
|
-
* Maneja el click sobre un elemento de filtro (categoría, atributo, etc.).
|
|
29
|
-
*
|
|
30
|
-
* - Para categorías: navega a la URL de la categoría.
|
|
31
|
-
* - Para atributos: actualiza la query string de la URL con `attributeCodes`.
|
|
32
|
-
* - Para otros filtros: delega en FiltersService para marcar seleccionado.
|
|
33
|
-
*
|
|
34
|
-
* La idea es que **la URL siempre represente los filtros aplicados**,
|
|
35
|
-
* de modo que:
|
|
36
|
-
* - al hacer F5 no se pierdan los filtros,
|
|
37
|
-
* - los links sean compartibles (deep linking).
|
|
38
|
-
*/
|
|
39
26
|
setSelected(filter: Filter | null, selected: FilterElement | null): void;
|
|
40
27
|
uniqueSelection(filter: {
|
|
41
28
|
data: any[];
|
|
@@ -44,19 +31,11 @@ export declare class FiltersEcComponent {
|
|
|
44
31
|
scrollUp: () => boolean;
|
|
45
32
|
hasAppliedFilters(): boolean;
|
|
46
33
|
/**
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
34
|
+
* Verifica si una categoría tiene la propiedad isVisible y está marcada como visible
|
|
35
|
+
* @param category - La categoría a verificar
|
|
36
|
+
* @returns true si la categoría es visible, false en caso contrario
|
|
37
|
+
*/
|
|
51
38
|
hasVisibleProperty(category: FilterElement): boolean;
|
|
52
|
-
/** Lista visible (filtra recursivo por isVisible) */
|
|
53
|
-
getVisibleData(filter: Filter | null): FilterElement[];
|
|
54
|
-
/** Children visibles de un nodo */
|
|
55
|
-
getVisibleChildren(node?: FilterElement): FilterElement[];
|
|
56
|
-
/** Tiene hijos visibles? */
|
|
57
|
-
hasVisibleChildren(node?: FilterElement): boolean;
|
|
58
|
-
/** Utilidad recursiva */
|
|
59
|
-
private filterVisibleTree;
|
|
60
39
|
static ɵfac: i0.ɵɵFactoryDeclaration<FiltersEcComponent, never>;
|
|
61
40
|
static ɵcmp: i0.ɵɵComponentDeclaration<FiltersEcComponent, "lib-filters-ec", never, { "setSelect": { "alias": "setSelect"; "required": false; }; }, {}, never, never, true, never>;
|
|
62
41
|
}
|
|
@@ -3,8 +3,6 @@ import { PriceRangeFilter } from '../../classes/filters/price_range-filter';
|
|
|
3
3
|
import * as i0 from "@angular/core";
|
|
4
4
|
export declare class PriceRangeFilterComponent {
|
|
5
5
|
private _filtersService;
|
|
6
|
-
private router;
|
|
7
|
-
private route;
|
|
8
6
|
priceGap: number;
|
|
9
7
|
roundStep: number;
|
|
10
8
|
filter: PriceRangeFilter;
|
|
@@ -23,7 +23,6 @@ export declare class GTMService {
|
|
|
23
23
|
private window?;
|
|
24
24
|
private rendererFactory;
|
|
25
25
|
private document;
|
|
26
|
-
private platformId;
|
|
27
26
|
/**
|
|
28
27
|
* Servicio de ruteo de angular.
|
|
29
28
|
*/
|
|
@@ -32,6 +31,7 @@ export declare class GTMService {
|
|
|
32
31
|
* Configuración de Google Tag Manager.
|
|
33
32
|
*/
|
|
34
33
|
private config;
|
|
34
|
+
private platformId;
|
|
35
35
|
constructor();
|
|
36
36
|
/**
|
|
37
37
|
* Obtiene el dataLayer del objecto window
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { Observable } from 'rxjs';
|
|
2
2
|
import { Filter } from '../classes';
|
|
3
3
|
import { FilterElement, PaginationSettings, FilterType } from '../interfaces';
|
|
4
|
-
import { Params } from '@angular/router';
|
|
5
4
|
import * as i0 from "@angular/core";
|
|
6
5
|
export declare class FiltersService {
|
|
7
6
|
private _apiConsts;
|
|
@@ -17,7 +16,6 @@ export declare class FiltersService {
|
|
|
17
16
|
private _defaultFilters;
|
|
18
17
|
private _paginationSettings;
|
|
19
18
|
private _filtersInitialized;
|
|
20
|
-
private _lastRouteQuery;
|
|
21
19
|
constructor();
|
|
22
20
|
/**
|
|
23
21
|
* Retorna la url para el filtrado
|
|
@@ -32,7 +30,7 @@ export declare class FiltersService {
|
|
|
32
30
|
*/
|
|
33
31
|
generateFinalApi(search_value?: string): string;
|
|
34
32
|
private isUpdated;
|
|
35
|
-
setFilters(paginationSettings: PaginationSettings, search_value?: string
|
|
33
|
+
setFilters(paginationSettings: PaginationSettings, search_value?: string): void;
|
|
36
34
|
getFilters(paginationSettings?: PaginationSettings): Filter[] | undefined;
|
|
37
35
|
getSpecificFilters(types: FilterType[]): Filter[];
|
|
38
36
|
setFilterSelected(filterObj: Filter, filterElem: FilterElement): void;
|
|
@@ -42,21 +40,6 @@ export declare class FiltersService {
|
|
|
42
40
|
* el array de filtros para que PaginationService vuelva a llamar
|
|
43
41
|
*/
|
|
44
42
|
updatePriceRangeFilter(min: number, max: number): void;
|
|
45
|
-
/**
|
|
46
|
-
* Fuerza a emitir de nuevo los filtros actuales.
|
|
47
|
-
* Útil cuando un filtro async (categorías, atributos) termina de cargarse
|
|
48
|
-
* y necesitamos que PaginationService vuelva a armar la URL.
|
|
49
|
-
*/
|
|
50
|
-
refreshFilters(): void;
|
|
51
|
-
/**
|
|
52
|
-
* Punto central donde se hidratan los filtros a partir de la URL:
|
|
53
|
-
* - Lee type/value de la ruta (ej. /collection/categories/:value).
|
|
54
|
-
* - Lee query params (category, price_min, price_max, attributeCodes, search, etc.).
|
|
55
|
-
* - Crea instancias de filtros y les delega la hidratación específica.
|
|
56
|
-
*
|
|
57
|
-
* Este método se llama tanto en SSR como en navegador.
|
|
58
|
-
*/
|
|
59
|
-
hydrateFromRoute(paginationSettings: PaginationSettings, routeParams: Params, routeQuery: Params): void;
|
|
60
43
|
static ɵfac: i0.ɵɵFactoryDeclaration<FiltersService, never>;
|
|
61
44
|
static ɵprov: i0.ɵɵInjectableDeclaration<FiltersService>;
|
|
62
45
|
}
|
|
@@ -3,30 +3,14 @@ import { Pagination, Product } from '../interfaces';
|
|
|
3
3
|
import { Filter } from '../classes';
|
|
4
4
|
import * as i0 from "@angular/core";
|
|
5
5
|
/**
|
|
6
|
-
* Servicio para manejar la paginación
|
|
7
|
-
*
|
|
8
|
-
* Se encarga de:
|
|
9
|
-
* - Escuchar los cambios en los filtros (categorías, atributos, precio, búsqueda, etc.).
|
|
10
|
-
* - Construir la URL al backend con esos filtros.
|
|
11
|
-
* - Pedir los productos al endpoint de product-search.
|
|
12
|
-
* - Exponer un observable con la última página de productos (`paginationData$`)
|
|
13
|
-
* y otros helpers (precio mínimo/máximo, siguiente página, etc.).
|
|
6
|
+
* Servicio para manejar la paginación de los productos.
|
|
7
|
+
* @class PaginationService
|
|
14
8
|
*/
|
|
15
9
|
export declare class PaginationService {
|
|
16
10
|
private _connectionService;
|
|
17
11
|
private _filtersService;
|
|
18
12
|
private _constants;
|
|
19
|
-
|
|
20
|
-
* Flujo principal: a partir de los filtros → arma URL → consulta backend → devuelve productos.
|
|
21
|
-
*
|
|
22
|
-
* Pasos:
|
|
23
|
-
* 1) Espera a que `FiltersService` emita filtros válidos.
|
|
24
|
-
* 2) Construye la URL final con `buildUrl()`.
|
|
25
|
-
* 3) Evita repetir llamadas si la URL no cambió (`distinctUntilChanged`).
|
|
26
|
-
* 4) Llama al backend con `getData(url)`.
|
|
27
|
-
* 5) Comparte el último resultado con todos los suscriptores (`shareReplay(1)`).
|
|
28
|
-
*/
|
|
29
|
-
paginationData$: Observable<Product[]>;
|
|
13
|
+
paginationData$: Observable<any>;
|
|
30
14
|
private _dataPagination;
|
|
31
15
|
private _waiting;
|
|
32
16
|
private _finished;
|
|
@@ -101,11 +85,11 @@ export declare class PaginationService {
|
|
|
101
85
|
*/
|
|
102
86
|
buildUrl(filters: Filter[]): string;
|
|
103
87
|
/**
|
|
104
|
-
* Devuelve un observable de los productos que
|
|
88
|
+
* Devuelve un observable de los productos que devolvio la última página obtenida.
|
|
105
89
|
* @param url
|
|
106
90
|
* @returns
|
|
107
91
|
*/
|
|
108
|
-
getData(url: string): Observable<
|
|
92
|
+
getData(url: string): Observable<any>;
|
|
109
93
|
static ɵfac: i0.ɵɵFactoryDeclaration<PaginationService, never>;
|
|
110
94
|
static ɵprov: i0.ɵɵInjectableDeclaration<PaginationService>;
|
|
111
95
|
}
|
|
@@ -25,7 +25,7 @@ export declare class ProductsService {
|
|
|
25
25
|
* @param paginationSettings
|
|
26
26
|
* @param searchValue
|
|
27
27
|
*/
|
|
28
|
-
getProductsForFilter(paginationSettings?: PaginationSettings, searchValue?: any
|
|
28
|
+
getProductsForFilter(paginationSettings?: PaginationSettings, searchValue?: any): any;
|
|
29
29
|
/**
|
|
30
30
|
* Actualiza los productos con los de la siguiente pagina.
|
|
31
31
|
*/
|
|
@@ -4,7 +4,6 @@ export interface Category {
|
|
|
4
4
|
slug: string;
|
|
5
5
|
position: number;
|
|
6
6
|
path: string;
|
|
7
|
-
isVisible?: boolean;
|
|
8
7
|
children?: Category[];
|
|
9
8
|
images?: any[];
|
|
10
9
|
}
|
|
@@ -24,5 +23,4 @@ export interface Attribute {
|
|
|
24
23
|
slug: string;
|
|
25
24
|
useToFilter: boolean;
|
|
26
25
|
styles?: any[];
|
|
27
|
-
isVisible?: boolean;
|
|
28
26
|
}
|
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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SlUsY0FBYzs0R0FBZCxjQUFjLGNBRmIsTUFBTTs7NEZBRVAsY0FBYztrQkFIMUIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwSGVhZGVycywgSHR0cFBhcmFtcyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IE9ic2VydmFibGUsIHN3aXRjaE1hcCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgUnVudGltZUNvbmZpZ1NlcnZpY2UgfSBmcm9tICcuL3J1bnRpbWUtY29uZmlnLnNlcnZpY2UnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFwaVJlcXVlc3RPcHRpb25zIHtcbiAgaGVhZGVycz86IEh0dHBIZWFkZXJzIHwgeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfCBzdHJpbmdbXSB9O1xuICBwYXJhbXM/OiBIdHRwUGFyYW1zIHwgeyBbcGFyYW06IHN0cmluZ106IHN0cmluZyB8IHN0cmluZ1tdIH07XG4gIHdpdGhDcmVkZW50aWFscz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogU2VydmljaW8gYmFzZSBwYXJhIHJlYWxpemFyIHBldGljaW9uZXMgSFRUUCB1c2FuZG8gY29uZmlndXJhY2nDs24gZGluw6FtaWNhXG4gKiBUb2RvcyBsb3Mgc2VydmljaW9zIGRlIGxhIGFwbGljYWNpw7NuIGRlYmVuIGV4dGVuZGVyIGVzdGUgc2VydmljaW8gbyB1c2FyIHN1cyBtw6l0b2Rvc1xuICovXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBCYXNlQXBpU2VydmljZSB7XG4gIFxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgaHR0cDogSHR0cENsaWVudCxcbiAgICBwcm90ZWN0ZWQgcnVudGltZUNvbmZpZ1NlcnZpY2U6IFJ1bnRpbWVDb25maWdTZXJ2aWNlXG4gICkge31cblxuICAvKipcbiAgICogQ29uc3RydXllIHVuYSBVUkwgY29tcGxldGEgdXNhbmRvIGxhIEFQSV9VUkwgZGVsIHJ1bnRpbWVcbiAgICovXG4gIHByb3RlY3RlZCBidWlsZEFwaVVybChlbmRwb2ludDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5ydW50aW1lQ29uZmlnU2VydmljZS5idWlsZEFwaVVybChlbmRwb2ludCk7XG4gIH1cblxuICAvKipcbiAgICogT2J0aWVuZSBoZWFkZXJzIGNvbXVuZXMgcXVlIGluY2x1eWVuIGluZm9ybWFjacOzbiBkZWwgcnVudGltZVxuICAgKi9cbiAgcHJvdGVjdGVkIGdldENvbW1vbkhlYWRlcnMoKTogSHR0cEhlYWRlcnMge1xuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMucnVudGltZUNvbmZpZ1NlcnZpY2UuZ2V0Q29uZmlnKCk7XG4gICAgbGV0IGhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgIH0pO1xuXG4gICAgaWYgKGNvbmZpZykge1xuICAgICAgaGVhZGVycyA9IGhlYWRlcnNcbiAgICAgICAgLnNldCgnWC1DaGFubmVsJywgY29uZmlnLmNoYW5uZWwpXG4gICAgICAgIC5zZXQoJ1gtTG9jYWxlJywgY29uZmlnLmxvY2FsZSlcbiAgICAgICAgLnNldCgnWC1FbnZpcm9ubWVudCcsIGNvbmZpZy5hcHBFbnYpO1xuICAgIH1cblxuICAgIHJldHVybiBoZWFkZXJzO1xuICB9XG5cbiAgLyoqXG4gICAqIE3DqXRvZG8gR0VUIGdlbsOpcmljb1xuICAgKi9cbiAgZ2V0PFQ+KGVuZHBvaW50OiBzdHJpbmcsIG9wdGlvbnM6IEFwaVJlcXVlc3RPcHRpb25zID0ge30pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICBjb25zdCB1cmwgPSB0aGlzLmJ1aWxkQXBpVXJsKGVuZHBvaW50KTtcbiAgICBjb25zdCBoZWFkZXJzID0gdGhpcy5tZXJnZUhlYWRlcnMob3B0aW9ucy5oZWFkZXJzKTtcbiAgICBcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxUPih1cmwsIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBoZWFkZXJzXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTcOpdG9kbyBQT1NUIGdlbsOpcmljb1xuICAgKi9cbiAgcG9zdDxUPihlbmRwb2ludDogc3RyaW5nLCBkYXRhOiBhbnksIG9wdGlvbnM6IEFwaVJlcXVlc3RPcHRpb25zID0ge30pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICBjb25zdCB1cmwgPSB0aGlzLmJ1aWxkQXBpVXJsKGVuZHBvaW50KTtcbiAgICBjb25zdCBoZWFkZXJzID0gdGhpcy5tZXJnZUhlYWRlcnMob3B0aW9ucy5oZWFkZXJzKTtcblxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxUPih1cmwsIGRhdGEsIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBoZWFkZXJzXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTcOpdG9kbyBQVVQgZ2Vuw6lyaWNvXG4gICAqL1xuICBwdXQ8VD4oZW5kcG9pbnQ6IHN0cmluZywgZGF0YTogYW55LCBvcHRpb25zOiBBcGlSZXF1ZXN0T3B0aW9ucyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgY29uc3QgdXJsID0gdGhpcy5idWlsZEFwaVVybChlbmRwb2ludCk7XG4gICAgY29uc3QgaGVhZGVycyA9IHRoaXMubWVyZ2VIZWFkZXJzKG9wdGlvbnMuaGVhZGVycyk7XG5cbiAgICByZXR1cm4gdGhpcy5odHRwLnB1dDxUPih1cmwsIGRhdGEsIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBoZWFkZXJzXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTcOpdG9kbyBQQVRDSCBnZW7DqXJpY29cbiAgICovXG4gIHBhdGNoPFQ+KGVuZHBvaW50OiBzdHJpbmcsIGRhdGE6IGFueSwgb3B0aW9uczogQXBpUmVxdWVzdE9wdGlvbnMgPSB7fSk6IE9ic2VydmFibGU8VD4ge1xuICAgIGNvbnN0IHVybCA9IHRoaXMuYnVpbGRBcGlVcmwoZW5kcG9pbnQpO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB0aGlzLm1lcmdlSGVhZGVycyhvcHRpb25zLmhlYWRlcnMpO1xuXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wYXRjaDxUPih1cmwsIGRhdGEsIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBoZWFkZXJzXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTcOpdG9kbyBERUxFVEUgZ2Vuw6lyaWNvXG4gICAqL1xuICBkZWxldGU8VD4oZW5kcG9pbnQ6IHN0cmluZywgb3B0aW9uczogQXBpUmVxdWVzdE9wdGlvbnMgPSB7fSk6IE9ic2VydmFibGU8VD4ge1xuICAgIGNvbnN0IHVybCA9IHRoaXMuYnVpbGRBcGlVcmwoZW5kcG9pbnQpO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB0aGlzLm1lcmdlSGVhZGVycyhvcHRpb25zLmhlYWRlcnMpO1xuXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5kZWxldGU8VD4odXJsLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgaGVhZGVyc1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE3DqXRvZG8gcGFyYSBwZXRpY2lvbmVzIHF1ZSBuZWNlc2l0YW4gZXNwZXJhciBhIHF1ZSBsYSBjb25maWcgZXN0w6kgY2FyZ2FkYVxuICAgKi9cbiAgZ2V0V2l0aENvbmZpZzxUPihlbmRwb2ludDogc3RyaW5nLCBvcHRpb25zOiBBcGlSZXF1ZXN0T3B0aW9ucyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMucnVudGltZUNvbmZpZ1NlcnZpY2UuY29uZmlnJC5waXBlKFxuICAgICAgc3dpdGNoTWFwKGNvbmZpZyA9PiB7XG4gICAgICAgIGlmICghY29uZmlnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSdW50aW1lIGNvbmZpZyBub3QgbG9hZGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0PFQ+KGVuZHBvaW50LCBvcHRpb25zKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNw6l0b2RvIHBhcmEgUE9TVCBxdWUgbmVjZXNpdGFuIGVzcGVyYXIgYSBxdWUgbGEgY29uZmlnIGVzdMOpIGNhcmdhZGFcbiAgICovXG4gIHBvc3RXaXRoQ29uZmlnPFQ+KGVuZHBvaW50OiBzdHJpbmcsIGRhdGE6IGFueSwgb3B0aW9uczogQXBpUmVxdWVzdE9wdGlvbnMgPSB7fSk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLnJ1bnRpbWVDb25maWdTZXJ2aWNlLmNvbmZpZyQucGlwZShcbiAgICAgIHN3aXRjaE1hcChjb25maWcgPT4ge1xuICAgICAgICBpZiAoIWNvbmZpZykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUnVudGltZSBjb25maWcgbm90IGxvYWRlZCcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnBvc3Q8VD4oZW5kcG9pbnQsIGRhdGEsIG9wdGlvbnMpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbWJpbmEgaGVhZGVycyBwZXJzb25hbGl6YWRvcyBjb24gbG9zIGhlYWRlcnMgY29tdW5lc1xuICAgKi9cbiAgcHJpdmF0ZSBtZXJnZUhlYWRlcnMoY3VzdG9tSGVhZGVycz86IEh0dHBIZWFkZXJzIHwgeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfCBzdHJpbmdbXSB9KTogSHR0cEhlYWRlcnMge1xuICAgIGxldCBoZWFkZXJzID0gdGhpcy5nZXRDb21tb25IZWFkZXJzKCk7XG5cbiAgICBpZiAoY3VzdG9tSGVhZGVycykge1xuICAgICAgaWYgKGN1c3RvbUhlYWRlcnMgaW5zdGFuY2VvZiBIdHRwSGVhZGVycykge1xuICAgICAgICBjdXN0b21IZWFkZXJzLmtleXMoKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgY29uc3QgdmFsdWVzID0gY3VzdG9tSGVhZGVycy5nZXRBbGwoa2V5KTtcbiAgICAgICAgICBpZiAodmFsdWVzKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoa2V5LCB2YWx1ZXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBPYmplY3Qua2V5cyhjdXN0b21IZWFkZXJzKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KGtleSwgY3VzdG9tSGVhZGVyc1trZXldKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGhlYWRlcnM7XG4gIH1cbn0iXX0=
|