ng-easycommerce-v18 0.6.11 → 0.6.13

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.
Files changed (56) hide show
  1. package/README.md +27 -0
  2. package/assets/ec-i18n/ct.json +16 -7
  3. package/assets/ec-i18n/en.json +36 -27
  4. package/assets/ec-i18n/es.json +17 -12
  5. package/assets/ec-i18n/fr.json +16 -7
  6. package/assets/ec-i18n/gl.json +17 -8
  7. package/assets/ec-i18n/pr.json +17 -8
  8. package/esm2022/lib/api/connection.service.mjs +21 -15
  9. package/esm2022/lib/ec-components/account-ec/order-ec/order-ec.component.mjs +5 -3
  10. package/esm2022/lib/ec-components/blocks-ec/block-banner-full-ec/block-banner-full-ec.component.mjs +3 -3
  11. package/esm2022/lib/ec-components/cart-ec/cart-item-ec/cart-item-ec.component.mjs +98 -27
  12. package/esm2022/lib/ec-components/product-detail-ec/product-detail-ec.component.mjs +145 -8
  13. package/esm2022/lib/ec-components/related-products-ec/related-products-ec.component.mjs +6 -6
  14. package/esm2022/lib/ec-components/section-container-ec/section-container-ec.component.mjs +3 -4
  15. package/esm2022/lib/ec-components/variants-ec/variants-ec.component.mjs +91 -4
  16. package/esm2022/lib/ec-components/widgets-ec/index.mjs +2 -1
  17. package/esm2022/lib/ec-components/widgets-ec/product-comment-ec/product-comment-ec.component.mjs +35 -0
  18. package/esm2022/lib/ec-directive/index.mjs +4 -1
  19. package/esm2022/lib/ec-directive/lowercase-email.directive.mjs +36 -0
  20. package/esm2022/lib/ec-pipe/ec-currency-symbol.pipe.mjs +6 -4
  21. package/esm2022/lib/ec-services/auth.service.mjs +7 -6
  22. package/esm2022/lib/ec-services/cart.service.mjs +43 -21
  23. package/esm2022/lib/ec-services/currency.service.mjs +28 -6
  24. package/esm2022/lib/ec-services/filters.service.mjs +29 -1
  25. package/esm2022/lib/ec-services/index.mjs +2 -1
  26. package/esm2022/lib/ec-services/product-detail.service.mjs +51 -16
  27. package/esm2022/lib/ec-services/products.service.mjs +65 -16
  28. package/esm2022/lib/ec-services/recently-viewed.service.mjs +94 -0
  29. package/esm2022/lib/ec-services/toast.service.mjs +21 -4
  30. package/esm2022/lib/interceptors/auth.interceptor.mjs +15 -4
  31. package/esm2022/lib/interfaces/product.mjs +1 -1
  32. package/fesm2022/ng-easycommerce-v18.mjs +769 -126
  33. package/fesm2022/ng-easycommerce-v18.mjs.map +1 -1
  34. package/lib/api/connection.service.d.ts +1 -6
  35. package/lib/ec-components/account-ec/order-ec/order-ec.component.d.ts +1 -0
  36. package/lib/ec-components/blocks-ec/block-banner-full-ec/block-banner-full-ec.component.d.ts +1 -1
  37. package/lib/ec-components/cart-ec/cart-item-ec/cart-item-ec.component.d.ts +12 -0
  38. package/lib/ec-components/checkout-ec/dataform-ec/dataform-ec-single/dataform-ec-single.component.d.ts +1 -1
  39. package/lib/ec-components/checkout-ec/dataform-ec/dataform-ec.component.d.ts +1 -1
  40. package/lib/ec-components/product-detail-ec/product-detail-ec.component.d.ts +19 -0
  41. package/lib/ec-components/related-products-ec/related-products-ec.component.d.ts +2 -2
  42. package/lib/ec-components/variants-ec/variants-ec.component.d.ts +10 -0
  43. package/lib/ec-components/widgets-ec/index.d.ts +1 -0
  44. package/lib/ec-components/widgets-ec/product-comment-ec/product-comment-ec.component.d.ts +12 -0
  45. package/lib/ec-directive/index.d.ts +1 -0
  46. package/lib/ec-directive/lowercase-email.directive.d.ts +8 -0
  47. package/lib/ec-services/cart.service.d.ts +4 -4
  48. package/lib/ec-services/currency.service.d.ts +1 -1
  49. package/lib/ec-services/filters.service.d.ts +4 -0
  50. package/lib/ec-services/index.d.ts +1 -0
  51. package/lib/ec-services/product-detail.service.d.ts +5 -1
  52. package/lib/ec-services/products.service.d.ts +5 -0
  53. package/lib/ec-services/recently-viewed.service.d.ts +17 -0
  54. package/lib/ec-services/toast.service.d.ts +6 -0
  55. package/lib/interfaces/product.d.ts +2 -1
  56. package/package.json +1 -1
package/README.md CHANGED
@@ -1,3 +1,30 @@
1
+ # Version 0.6.13
2
+ - `AuthService.isAuthenticated()`: se elimina el logout implícito y cualquier escritura de estado durante validación; ahora sólo valida token/expiración y retorna `false` si no corresponde sesión válida.
3
+ - `auth.interceptor`: ante `401/403` se ejecuta limpieza completa de sesión (`doLogoutUser`) y redirección controlada a `/auth/login` (evitando redirecciones redundantes).
4
+ - `auth.interceptor`: se usa inyección diferida de `AuthService` mediante `Injector` para evitar dependencia circular de DI (`NG0200`).
5
+ - `ProductsService`: en la hidratación inicial/paginación se reemplaza siempre el listado con `products || []`, evitando estados stale cuando backend responde vacío.
6
+ # Version 0.6.12
7
+ - Collection: `ProductsService` aplica la separación de productos por variante también en la carga inicial, no sólo al paginar.
8
+ - Collection: la deduplicación de productos ahora usa una clave sensible a variante (`variant_id`/`currentOption.variantCode`), evitando que variantes del mismo producto se colapsen en una sola tarjeta.
9
+ - Variantes en listado: cuando `productWithUniqueVariant` está activo, cada tarjeta usa la imagen, stock, precio, precio tachado y variante seleccionada correspondientes a la variante materializada.
10
+ - Filtros dinámicos: al filtrar por opciones de variante (`optionCodes`), el listado conserva sólo las variantes que coinciden con los filtros seleccionados.
11
+ - Stock: si una variante filtrada no tiene stock o no puede materializarse, ya no se reemplaza por otra variante disponible del mismo producto.
12
+ - Bulk add: las tarjetas materializadas por variante mantienen la variante seleccionada como primera opción del producto para que el agregado masivo valide stock y agregue el SKU correcto.
13
+ - Filtros: `FiltersService.hydrateFromRoute()` preserva opciones dinámicas ya cargadas al volver desde detalle a la misma collection, evitando que desaparezcan filtros como color o talle cuando la URL no cambia.
14
+ - Tests: se agrega cobertura para la preservación de filtros dinámicos al rehidratar la misma ruta.
15
+ - Variantes: `variants-ec` ahora muestra las opciones como selector desplegable, con selección única, sin deselección y con estados visuales para opciones sin stock.
16
+ - Product detail: se soporta `?variant=CODIGO` para precargar la variante seleccionada, actualizar imágenes/precio/stock y mantener el estado al recargar o compartir la URL.
17
+ - Product detail: el botón de agregar al carrito queda deshabilitado y muestra loading mientras espera la respuesta del carrito.
18
+ - Carrito/sidebar: los links de items con variante apuntan al producto base con `?variant`, y el detalle de variantes usa la variante correcta del item.
19
+ - Carrito: al sumar un producto existente se usa la variante exacta y se evita que el loading quede activo si falla la validación.
20
+ - Productos visitados: se agrega `RecentlyViewedService` para guardar hasta 5 productos vistos junto con su variante opcional en browser storage.
21
+ - Formularios: se agrega `LowercaseEmailDirective` para normalizar inputs de email a minúsculas.
22
+ - Moneda: el pipe de moneda reacciona a cambios de moneda activa y respeta metadatos actualizados de posición y decimales.
23
+ - API: `ConnectionService` normaliza URLs relativas/absolutas para evitar rutas mal concatenadas.
24
+ - Alertas: `ToastService` muestra botón de cierre y barra de progreso por defecto en todos los mensajes.
25
+ - Product detail: se agrega el componente `ProductCommentEcComponent` para capturar notas por producto cuando `enableFieldNotesInArticleFile` está activo.
26
+ - Carrito/sidebar/pedidos: las notas del item se muestran de forma truncada y se preservan al actualizar cantidades.
27
+ - Carrito: `CartService` envía y mantiene `comments` al agregar, repetir o actualizar items del carrito.
1
28
  # Version 0.6.11
2
29
  - Collection: se agrega `PaginationService.refreshCurrentQuery()` para forzar recarga del listado al reingresar a la misma ruta/filtros, incluso cuando la URL final no cambió.
3
30
  - `collection-ec`: luego de `hydrateFromRoute(...)` dispara `refreshCurrentQuery()` para evitar reutilización de resultados previos entre navegaciones `collection -> home -> collection`.
@@ -239,6 +239,10 @@
239
239
  "size": "Mida",
240
240
  "product-removed": "Es va eliminar el producte de l'cistella",
241
241
  "product-added": "Es va agregar el producte a l'cistella",
242
+ "products-added": "S'han afegit els productes a la cistella",
243
+ "no-products-to-add": "No hi ha productes per afegir",
244
+ "all-products-out-of-stock": "Els productes seleccionats no tenen stock",
245
+ "some-products-out-of-stock": "Alguns productes seleccionats no tenen stock",
242
246
  "product-updated": "Es va actualitzar la quantitat del producte",
243
247
  "operation-error": "No va ser possible realitzar l'operació",
244
248
  "operation-error-param": "No va ser possible realitzar l'operació: {{ error }}",
@@ -269,7 +273,7 @@
269
273
  "no-stores": "Encara no hi ha punts de venda carregats",
270
274
  "inquiry-sent": "Seva consulta va ser enviada",
271
275
  "inquiry-error": "Hi va haver un error a l'realitzar la consulta. Torneu a intentar-ho més tard",
272
- "newsletter_email_already_registered": "La direcció de correu electrònic ja està registrada.",
276
+ "newsletter_email_already_registered": "La direcció de correu electrònic ja està registrada.",
273
277
  "newsletter-thanks": "Gràcies per subscriure a les notícies",
274
278
  "notes": "Detalls addicionals d'enviament",
275
279
  "register-ok": "Es va enviar un mail a la seva casella de correu a la seva nova compte",
@@ -290,10 +294,10 @@
290
294
  "show-password": "mostrar contrasenya",
291
295
  "confirm-password": "Confirmar contrasenya",
292
296
  "send": "Enviar",
293
- "payment-summary": "Resum de pagament",
294
- "shipment-method-required": "Selecciona un mètode d'enviament per habilitar el pagament",
295
- "national-taxes": "Impostos nacionals",
296
- "clientTaxes": "Impostos del client",
297
+ "payment-summary": "Resum de pagament",
298
+ "shipment-method-required": "Selecciona un mètode d'enviament per habilitar el pagament",
299
+ "national-taxes": "Impostos nacionals",
300
+ "clientTaxes": "Impostos del client",
297
301
  "document-type-number": "Tipus i nombre de document",
298
302
  "unsaved-changes-title": "Canvis sense desar",
299
303
  "unsaved-changes-body": "Tens canvis en aquest pas que encara no s'han desat. Si el tanques, es perdran.",
@@ -306,7 +310,12 @@
306
310
  "loading-address": "Carregant adreça...",
307
311
  "address-selection": "Selecció d'adreça",
308
312
  "document-pattern-error": {
309
- "numeric": "El número de document ha de contenir només dígits numèrics.",
310
- "default": "Format de número de document invàlid."
313
+ "numeric": "El número de document ha de contenir només dígits numèrics.",
314
+ "default": "Format de número de document invàlid."
315
+ },
316
+ "pay-with": "Pagar amb",
317
+ "product-comment": {
318
+ "label": "Comentaris sobre la teva comanda (opcional)",
319
+ "placeholder": "Aquí pots deixar especificacions per al producte (Màx. 100 caràcters.)"
311
320
  }
312
321
  }
@@ -147,9 +147,9 @@
147
147
  "image": "Imagen",
148
148
  "information": "Store information",
149
149
  "inquiry-error": "There was an error while querying. Try it again later",
150
- "newsletter_email_already_registered": "The email address is already registered.",
151
- "not-enough-stock": "Not enough stock",
152
- "current-stock": "Current stock",
150
+ "newsletter_email_already_registered": "The email address is already registered.",
151
+ "not-enough-stock": "Not enough stock",
152
+ "current-stock": "Current stock",
153
153
  "inquiry-sent": "Your inquiry was sent",
154
154
  "invalid-coupon": "Invalid discount code",
155
155
  "invalid-credentials": "The username and / or password are incorrect",
@@ -183,7 +183,7 @@
183
183
  "mercado-pago": "Mercado Pago",
184
184
  "minimum-items-quantity": "The minimum quantity allowed for this product is {{quantity}}",
185
185
  "multiple-quantity-required": "The quantity must be a multiple of {{multiple}}.",
186
- "invalid-multiple-quantity-config": "This product has an invalid multiple quantity configuration. Please contact the store.",
186
+ "invalid-multiple-quantity-config": "This product has an invalid multiple quantity configuration. Please contact the store.",
187
187
  "mismatched-password": "Password do not match",
188
188
  "most-expensive-first": "Most expensive first",
189
189
  "my-account": "My Account",
@@ -227,6 +227,7 @@
227
227
  "pay": "Pay",
228
228
  "pay-with-offline": "Finalize Order",
229
229
  "pay-with-transfer": "Pay with wire transfer",
230
+ "pay-with": "Pay with",
230
231
  "payment": "Payment method",
231
232
  "payment-error": "There was an error processing your payment. Please try again later.",
232
233
  "payment-preferences-error": "There was a problem trying to get payment preferences. Try it again later",
@@ -244,14 +245,18 @@
244
245
  "postal-code-help": "Postalcode is required",
245
246
  "postal-code-pattern-error": "The zip code must be numeric only",
246
247
  "document-pattern-error": {
247
- "numeric": "The document number must contain only numeric digits.",
248
- "default": "Invalid document number format."
248
+ "numeric": "The document number must contain only numeric digits.",
249
+ "default": "Invalid document number format."
249
250
  },
250
251
  "precious-jewellery": "precious jewellery",
251
252
  "price": "Price",
252
253
  "processing-payment": "Processing payment",
253
254
  "product": "Product",
254
255
  "product-added": "The product was added to the cart",
256
+ "products-added": "The products were added to the cart",
257
+ "no-products-to-add": "You have no products to add",
258
+ "all-products-out-of-stock": "The selected products are out of stock",
259
+ "some-products-out-of-stock": "Some of the selected products are out of stock",
255
260
  "product-details": "Product details",
256
261
  "product-name": "Article name",
257
262
  "product-removed": "Cart product removed",
@@ -405,25 +410,29 @@
405
410
  "confirm-password": "Confirm password",
406
411
  "send": "Send",
407
412
  "cart-not-empty": "The cart is not empty",
408
- "balance-in-account-message": "The payment has been completed automatically with the selected method. Your order is being processed and you will receive more information soon.",
409
- "not-enough-credits": "You do not have enough credits to buy this product",
410
- "not-enough-credits-to-complete": "Sorry, you cannot complete your purchase because you do not have enough available credit.",
411
- "insufficient_credit": "Insufficient credit",
412
- "this-payment-method-cannot-be-used": "This payment method cannot be used",
413
- "max-orders-reached": "You have reached the maximum number of orders",
414
- "clientTaxes": "Client taxes",
415
- "payment-summary": "Payment summary",
416
- "shipment-method-required": "Select a shipping method to enable payment",
417
- "shipment-selection-required": "Select a shipping option to continue",
418
- "document-type-number": "Document type and number",
419
- "national-taxes": "National taxes",
420
- "unsaved-changes-title": "Unsaved changes",
421
- "unsaved-changes-body": "You have changes in this step that are not saved yet. If you close it, they will be lost.",
422
- "unsaved-changes-continue": "Keep editing",
423
- "unsaved-changes-discard": "Discard changes",
424
- "select-address-short": "Saved",
425
- "new-address-short": "New",
426
- "update-address": "Update",
427
- "no-address-results": "No addresses found",
428
- "loading-address": "Loading address..."
413
+ "balance-in-account-message": "The payment has been completed automatically with the selected method. Your order is being processed and you will receive more information soon.",
414
+ "not-enough-credits": "You do not have enough credits to buy this product",
415
+ "not-enough-credits-to-complete": "Sorry, you cannot complete your purchase because you do not have enough available credit.",
416
+ "insufficient_credit": "Insufficient credit",
417
+ "this-payment-method-cannot-be-used": "This payment method cannot be used",
418
+ "max-orders-reached": "You have reached the maximum number of orders",
419
+ "clientTaxes": "Client taxes",
420
+ "payment-summary": "Payment summary",
421
+ "shipment-method-required": "Select a shipping method to enable payment",
422
+ "shipment-selection-required": "Select a shipping option to continue",
423
+ "document-type-number": "Document type and number",
424
+ "national-taxes": "National taxes",
425
+ "unsaved-changes-title": "Unsaved changes",
426
+ "unsaved-changes-body": "You have changes in this step that are not saved yet. If you close it, they will be lost.",
427
+ "unsaved-changes-continue": "Keep editing",
428
+ "unsaved-changes-discard": "Discard changes",
429
+ "select-address-short": "Saved",
430
+ "new-address-short": "New",
431
+ "update-address": "Update",
432
+ "no-address-results": "No addresses found",
433
+ "loading-address": "Loading address...",
434
+ "product-comment": {
435
+ "label": "Comments about your order (optional)",
436
+ "placeholder": "You can leave product details here (Max. 100 characters.)"
437
+ }
429
438
  }
@@ -7,7 +7,7 @@
7
7
  "accessories": "Accesorios",
8
8
  "accordian-details": "detalles de acordeón",
9
9
  "account-info": "Información de cuenta",
10
- "accept-terms": "Acepto los",
10
+ "accept-terms": "Acepto los términos y condiciones",
11
11
  "action": "Acción",
12
12
  "actual-password": "Contraseña actual",
13
13
  "add-to-cart": "Agregar",
@@ -154,7 +154,7 @@
154
154
  "image": "Imagen",
155
155
  "information": "Información",
156
156
  "inquiry-error": "Hubo un error al realizar la consulta. Vuelva a intentarlo más tarde",
157
- "newsletter_email_already_registered": "La dirección de correo electrónico ya se encuentra registrada.",
157
+ "newsletter_email_already_registered": "La dirección de correo electrónico ya se encuentra registrada.",
158
158
  "inquiry-sent": "Su consulta fue enviada",
159
159
  "invalid-coupon": "El código de descuento no es valido",
160
160
  "invalid-credentials": "El usuario y/o contraseña son incorrectos",
@@ -235,6 +235,7 @@
235
235
  "pay": "Pagar",
236
236
  "pay-with-offline": "Finalizar pedido",
237
237
  "pay-with-transfer": "Pago con transferencia",
238
+ "pay-with": "Pagar con",
238
239
  "payment": "Método de pago",
239
240
  "payment-error": "Hubo un error al procesar el pago. Vuelva a intentarlo más tarde.",
240
241
  "payment-preferences-error": "Hubo un problema al intentar obtener las preferencias del pago. Vuelva a intentarlo más tarde",
@@ -261,6 +262,9 @@
261
262
  "product": "Producto",
262
263
  "product-added": "Producto añadido al carrito",
263
264
  "products-added": "Productos añadidos al carrito",
265
+ "no-products-to-add": "No hay productos para agregar",
266
+ "all-products-out-of-stock": "Los productos seleccionados no tienen stock",
267
+ "some-products-out-of-stock": "Algunos productos seleccionados no tienen stock",
264
268
  "product-details": "Detalles del producto",
265
269
  "product-name": "Nombre de artículo",
266
270
  "product-removed": "Se eliminó el producto en tu carrito",
@@ -375,7 +379,6 @@
375
379
  "choose-province": "Selecciones una provincia/zona",
376
380
  "required-fields": "Campos requeridos",
377
381
  "fields-incomplete": "Aún hay campos sin completar o invalidos",
378
- "accept-terms": "Acepto los términos y condiciones",
379
382
  "must-accept-terms": "Debe aceptar los términos y condiciones para continuar.",
380
383
  "whats-this": "¿Que es esto?",
381
384
  "new-address": "Nueva dirección",
@@ -401,7 +404,6 @@
401
404
  "exit": "Salir",
402
405
  "start-impersonating": "Operando como: {{ customer }}",
403
406
  "stop-impersonating": "No se encuentra operando por ninguno de sus clientes",
404
- "must-accept-terms": "Debe aceptar los términos y condiciones para continuar.",
405
407
  "subscribe-newsletter": "Suscribirse al newsletter",
406
408
  "must-select-customer": "Debe seleccionar un cliente para ejecutar esta acción.",
407
409
  "new-orders": "Pedidos nuevos",
@@ -411,7 +413,7 @@
411
413
  "instructions": "Instrucciones",
412
414
  "success-review": "Su reseña fue enviada",
413
415
  "error-convertibility": "Se produjo un error al realizar la conversión",
414
- "product-review":"Reseña de Producto",
416
+ "product-review": "Reseña de Producto",
415
417
  "write-a-review": "Escribir una reseña",
416
418
  "submit-review": "Enviar reseña",
417
419
  "thanks-send-review": "Gracias por enviar su reseña",
@@ -427,23 +429,23 @@
427
429
  "quantity-not-exceeded": "La cantidad mínima de compra es {{amount}}",
428
430
  "login-form-incomplete": "El formulario de inicio de sesión está incompleto o contiene datos inválidos.",
429
431
  "price-without-national-taxes": "Precio sin impuestos nacionales",
430
- "maintenance":{
431
- "message": "Estamos realizando tareas de mantenimiento. Pronto estaremos de vuelta.",
432
- "contact": "Hasta regresar, puedes contactarnos vía correo electrónico:"
432
+ "maintenance": {
433
+ "message": "Estamos realizando tareas de mantenimiento. Pronto estaremos de vuelta.",
434
+ "contact": "Hasta regresar, puedes contactarnos vía correo electrónico:"
433
435
  },
434
436
  "notes-help": "Por favor, proporcione detalles adicionales sobre su pedido.",
435
437
  "register-welcome": "Registro exitoso. Se ha enviado un email de bienvenida a su casilla de correo.",
436
438
  "see-all": "Ver todo",
437
439
  "enter": "Ingresar",
438
440
  "not-enough-stock": "Stock insuficiente",
439
- "current-stock": "Stock actual",
441
+ "current-stock": "Stock actual",
440
442
  "forgot-your-password": "¿Olvidaste tu contraseña?",
441
443
  "hide-password": "Ocultar contraseña",
442
444
  "show-password": "Mostrar contraseña",
443
445
  "confirm-password": "Confirmar contraseña",
444
446
  "send": "Enviar",
445
447
  "select-state": "Seleccione una provincia/zona",
446
- "cart-not-empty": "Tu carrito no está vacío",
448
+ "cart-not-empty": "Tu carrito no está vacío",
447
449
  "balance-in-account-message": "El pago ha sido completado automáticamente con el método seleccionado. Su pedido está siendo procesado y pronto recibirá más información.",
448
450
  "not-enough-credits": "No tiene suficientes créditos para comprar este producto",
449
451
  "not-enough-credits-to-complete": "Lo sentimos, no puedes completar tu compra debido a que no tienes suficiente crédito disponible.",
@@ -465,6 +467,9 @@
465
467
  "update-address": "Actualizar",
466
468
  "no-address-results": "No se encontraron direcciones",
467
469
  "loading-address": "Cargando dirección...",
468
- "loading": "Cargando"
469
-
470
+ "loading": "Cargando",
471
+ "product-comment": {
472
+ "label": "Comentarios sobre tu pedido (opcional)",
473
+ "placeholder": "Aquí puedes dejar especificaciones para tu producto (Máx. 100 caracteres.)"
474
+ }
470
475
  }
@@ -231,6 +231,10 @@
231
231
  "size": "Taille",
232
232
  "product-removed": "Produit retiré du panier",
233
233
  "product-added": "Le produit a été ajouté au panier",
234
+ "products-added": "Les produits ont été ajoutés au panier",
235
+ "no-products-to-add": "Aucun produit à ajouter",
236
+ "all-products-out-of-stock": "Les produits sélectionnés sont en rupture de stock",
237
+ "some-products-out-of-stock": "Certains produits sélectionnés sont en rupture de stock",
234
238
  "product-updated": "Quantité de produit mise à jour",
235
239
  "operation-error": "Il n'a pas été possible d'effectuer l'opération",
236
240
  "operation-error-param": "Il n'a pas été possible d'effectuer l'opération: {{ error }}",
@@ -261,7 +265,7 @@
261
265
  "no-stores": "Aucun point de vente chargé pour le moment",
262
266
  "inquiry-sent": "Votre demande a été envoyée",
263
267
  "inquiry-error": "Une erreur s'est produite lors de l'interrogation. Réessayez plus tard",
264
- "newsletter_email_already_registered": "L'adresse e-mail est déjà enregistrée.",
268
+ "newsletter_email_already_registered": "L'adresse e-mail est déjà enregistrée.",
265
269
  "newsletter-thanks": "Merci de vous être abonné aux nouvelles",
266
270
  "notes": "Détails d'expédition supplémentaires",
267
271
  "register-ok": "Un e-mail a été envoyé à votre boîte aux lettres pour vérifier votre nouveau compte",
@@ -282,10 +286,10 @@
282
286
  "show-password": "montrer le mot de passe",
283
287
  "confirm-password": "Confirmer le mot de passe",
284
288
  "send": "Envoyer",
285
- "payment-summary": "Résumé de paiement",
286
- "shipment-method-required": "Sélectionnez un mode de livraison pour activer le paiement",
287
- "national-taxes": "Taxes nationales",
288
- "clientTaxes": "Taxes client",
289
+ "payment-summary": "Résumé de paiement",
290
+ "shipment-method-required": "Sélectionnez un mode de livraison pour activer le paiement",
291
+ "national-taxes": "Taxes nationales",
292
+ "clientTaxes": "Taxes client",
289
293
  "document-type-number": "Type et numéro de document",
290
294
  "unsaved-changes-title": "Modifications non enregistrées",
291
295
  "unsaved-changes-body": "Vous avez des changements dans cette étape qui ne sont pas encore enregistrés. Si vous fermez, ils seront perdus.",
@@ -298,7 +302,12 @@
298
302
  "loading-address": "Chargement de l'adresse...",
299
303
  "address-selection": "Sélection d'adresse",
300
304
  "document-pattern-error": {
301
- "numeric": "Le document doit contenir uniquement des chiffres.",
302
- "default": "Format de document invalide."
305
+ "numeric": "Le document doit contenir uniquement des chiffres.",
306
+ "default": "Format de document invalide."
307
+ },
308
+ "pay-with": "Payer avec",
309
+ "product-comment": {
310
+ "label": "Commentaires sur votre commande (facultatif)",
311
+ "placeholder": "Vous pouvez laisser ici des précisions pour votre produit (100 caractères max.)"
303
312
  }
304
313
  }
@@ -239,8 +239,12 @@
239
239
  "size": "Tamaño",
240
240
  "product-removed": "Eliminouse o produto do carro",
241
241
  "product-added": "Engadiuse o produto á cesta",
242
+ "products-added": "Engadíronse os produtos á cesta",
243
+ "no-products-to-add": "Non hai produtos para engadir",
244
+ "all-products-out-of-stock": "Os produtos seleccionados non teñen stock",
245
+ "some-products-out-of-stock": "Algúns produtos seleccionados non teñen stock",
242
246
  "product-updated": "Actualizado a cantidade do produto",
243
- "operation-error": "Non foi posible realizar a operación",
247
+ "operation-error": "Non foi posible realizar a operación",
244
248
  "operation-error-param": "Non foi posible realizar a operación: {{ error }}",
245
249
  "out-of-stock": "O produto ou variante seleccionado non ten stock",
246
250
  "no-variants": "Debe seleccionar as opcións do produto",
@@ -269,7 +273,7 @@
269
273
  "no-stores": "Non hai cargas aínda cargadas",
270
274
  "inquiry-sent": "Enviouse a súa consulta",
271
275
  "inquiry-error": "Produciuse un erro durante a consulta. Próbao máis tarde",
272
- "newsletter_email_already_registered": "A dirección de correo electrónico xa está rexistrada.",
276
+ "newsletter_email_already_registered": "A dirección de correo electrónico xa está rexistrada.",
273
277
  "newsletter-thanks": "Grazas por subscribirte á noticia",
274
278
  "notes": "Detalles adicionais de envío",
275
279
  "register-ok": "Enviouse un correo electrónico á súa caixa de correo para verificar a súa nova conta",
@@ -290,10 +294,10 @@
290
294
  "show-password": "mostrar contrasinal",
291
295
  "confirm-password": "Confirmar contrasinal",
292
296
  "send": "Enviar",
293
- "payment-summary": "Resumo de pago",
294
- "shipment-method-required": "Selecciona un método de envío para habilitar o pagamento",
295
- "national-taxes": "Impostos nacionais",
296
- "clientTaxes": "Impostos do cliente",
297
+ "payment-summary": "Resumo de pago",
298
+ "shipment-method-required": "Selecciona un método de envío para habilitar o pagamento",
299
+ "national-taxes": "Impostos nacionais",
300
+ "clientTaxes": "Impostos do cliente",
297
301
  "document-type-number": "Tipo e número do documento",
298
302
  "unsaved-changes-title": "Cambios sen gardar",
299
303
  "unsaved-changes-body": "Tes cambios neste paso que aínda non se gardaron. Se pechas, perderanse.",
@@ -306,7 +310,12 @@
306
310
  "loading-address": "Cargando enderezo...",
307
311
  "address-selection": "Selección de enderezo",
308
312
  "document-pattern-error": {
309
- "numeric": "O número de documento debe conter só díxitos numéricos.",
310
- "default": "Formato de documento inválido."
313
+ "numeric": "O número de documento debe conter só díxitos numéricos.",
314
+ "default": "Formato de documento inválido."
315
+ },
316
+ "pay-with": "Pagar con",
317
+ "product-comment": {
318
+ "label": "Comentarios sobre o teu pedido (opcional)",
319
+ "placeholder": "Aquí podes deixar especificacións para o teu produto (Máx. 100 caracteres.)"
311
320
  }
312
321
  }
@@ -239,6 +239,10 @@
239
239
  "size": "Tamanho",
240
240
  "product-removed": "Produto do carrinho removido",
241
241
  "product-added": "O produto foi adicionado ao carrinho",
242
+ "products-added": "Os produtos foram adicionados ao carrinho",
243
+ "no-products-to-add": "Não há produtos para adicionar",
244
+ "all-products-out-of-stock": "Os produtos selecionados estão sem estoque",
245
+ "some-products-out-of-stock": "Alguns produtos selecionados estão sem estoque",
242
246
  "product-updated": "Quantidade do produto atualizada",
243
247
  "operation-error": "Não foi possível executar a operação",
244
248
  "operation-error-param": "Não foi possível executar a operação: {{ error }}",
@@ -269,7 +273,7 @@
269
273
  "no-stores": "Ainda não há tomadas carregadas",
270
274
  "inquiry-sent": "Sua pergunta foi enviada",
271
275
  "inquiry-error": "Ocorreu um erro ao consultar. Por favor, tente novamente mais tarde",
272
- "newsletter_email_already_registered": "O endereço de e‑mail já se encontra registado.",
276
+ "newsletter_email_already_registered": "O endereço de e‑mail já se encontra registado.",
273
277
  "newsletter-thanks": "Obrigado por se inscrever nas notícias",
274
278
  "notes": "Detalhes adicionais de envio",
275
279
  "register-ok": "Um email foi enviado para sua caixa de correio para verificar sua nova conta",
@@ -289,11 +293,11 @@
289
293
  "show-password": "mostrar senha",
290
294
  "confirm-password": "Confirmar senha",
291
295
  "send": "Enviar",
292
- "payment-summary": "Resumo de pagamento",
293
- "shipment-method-required": "Selecione um método de envio para habilitar o pagamento",
294
- "shipment-selection-required": "Selecione uma opção de envio para continuar",
295
- "national-taxes": "Impostos nacionais",
296
- "clientTaxes": "Impostos do cliente",
296
+ "payment-summary": "Resumo de pagamento",
297
+ "shipment-method-required": "Selecione um método de envio para habilitar o pagamento",
298
+ "shipment-selection-required": "Selecione uma opção de envio para continuar",
299
+ "national-taxes": "Impostos nacionais",
300
+ "clientTaxes": "Impostos do cliente",
297
301
  "document-type-number": "Tipo e número do documento",
298
302
  "unsaved-changes-title": "Alterações não salvas",
299
303
  "unsaved-changes-body": "Você tem alterações neste passo que ainda não foram salvas. Se fechar, elas serão perdidas.",
@@ -306,7 +310,12 @@
306
310
  "loading-address": "Carregando endereço...",
307
311
  "address-selection": "Seleção de endereço",
308
312
  "document-pattern-error": {
309
- "numeric": "O documento deve conter apenas dígitos numéricos.",
310
- "default": "Formato de documento inválido."
313
+ "numeric": "O documento deve conter apenas dígitos numéricos.",
314
+ "default": "Formato de documento inválido."
315
+ },
316
+ "pay-with": "Pagar com",
317
+ "product-comment": {
318
+ "label": "Comentários sobre seu pedido (opcional)",
319
+ "placeholder": "Aqui você pode deixar especificações para o produto (Máx. 100 caracteres.)"
311
320
  }
312
321
  }
@@ -20,14 +20,20 @@ export class ConnectionService {
20
20
  * @memberof ConnectionService
21
21
  */
22
22
  constantsSvr = inject(ApiConstantsService);
23
- /**
24
- * URL Base para las peticiones.
25
- * @type {string}
26
- * @memberof ConnectionService
27
- */
28
- url;
29
- constructor() {
30
- this.url = this.constantsSvr.getUrlBase();
23
+ constructor() { }
24
+ buildUrl(apiurl) {
25
+ if (/^https?:\/\//i.test(apiurl)) {
26
+ return apiurl;
27
+ }
28
+ const baseUrl = (this.constantsSvr.getUrlBase() || '').trim().replace(/\/+$/, '');
29
+ const normalizedPath = apiurl.replace(/^\/+/, '').replace(/\/{2,}/g, '/');
30
+ if (!baseUrl) {
31
+ return normalizedPath;
32
+ }
33
+ if (!normalizedPath) {
34
+ return baseUrl;
35
+ }
36
+ return `${baseUrl}/${normalizedPath}`;
31
37
  }
32
38
  /**
33
39
  * Función para generar peticiones de tipo GET
@@ -36,10 +42,10 @@ export class ConnectionService {
36
42
  * @returns
37
43
  */
38
44
  get(apiurl, data) {
39
- return this._http.get(this.url + apiurl, { params: { ...data } }).pipe(take(1));
45
+ return this._http.get(this.buildUrl(apiurl), { params: { ...data } }).pipe(take(1));
40
46
  }
41
47
  getErrorNotHandler(apiurl) {
42
- return this._http.get(this.url + apiurl).pipe(take(1));
48
+ return this._http.get(this.buildUrl(apiurl)).pipe(take(1));
43
49
  }
44
50
  /**
45
51
  * Funcion para generar peticiones de tipo POST
@@ -47,13 +53,13 @@ export class ConnectionService {
47
53
  * @param data
48
54
  */
49
55
  post(apiurl, data) {
50
- return this._http.post(this.url + apiurl, data || {}).pipe(take(1));
56
+ return this._http.post(this.buildUrl(apiurl), data || {}).pipe(take(1));
51
57
  }
52
58
  put(apiurl, data) {
53
- return this._http.put(this.url + apiurl, data).pipe(take(1));
59
+ return this._http.put(this.buildUrl(apiurl), data).pipe(take(1));
54
60
  }
55
61
  delete(apiurl, data) {
56
- return this._http.delete(this.url + apiurl).pipe(take(1));
62
+ return this._http.delete(this.buildUrl(apiurl)).pipe(take(1));
57
63
  }
58
64
  /**
59
65
  * Genera un petición tipo GET pero usando el parametro como la url completa.
@@ -65,7 +71,7 @@ export class ConnectionService {
65
71
  }
66
72
  getHTML(api) {
67
73
  let httpHeaders = new HttpHeaders({ Accept: 'text/plain, text/html' });
68
- return this._http.get(this.url + api, { responseType: 'text', headers: httpHeaders }).pipe(take(1));
74
+ return this._http.get(this.buildUrl(api), { responseType: 'text', headers: httpHeaders }).pipe(take(1));
69
75
  }
70
76
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ConnectionService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
71
77
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ConnectionService, providedIn: 'root' });
@@ -76,4 +82,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
76
82
  providedIn: 'root'
77
83
  }]
78
84
  }], ctorParameters: () => [] });
79
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29ubmVjdGlvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctZWFzeWNvbW1lcmNlLXYxOC9zcmMvbGliL2FwaS9jb25uZWN0aW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbkQsT0FBTyxFQUF1QixJQUFJLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDakQsT0FBTyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMvRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQzs7QUFFekU7Ozs7O0dBS0c7QUFJSCxNQUFNLE9BQU8saUJBQWlCO0lBQzdCOzs7T0FHRztJQUNjLEtBQUssR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7SUFFNUM7OztPQUdHO0lBQ0ssWUFBWSxHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBRW5EOzs7O09BSUc7SUFDSyxHQUFHLENBQVM7SUFFcEI7UUFDQyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDM0MsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsR0FBRyxDQUFDLE1BQWMsRUFBRSxJQUFVO1FBQzdCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQU0sSUFBSSxDQUFDLEdBQUcsR0FBRyxNQUFNLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxHQUFHLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEYsQ0FBQztJQUNELGtCQUFrQixDQUFDLE1BQWM7UUFDaEMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBTSxJQUFJLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILElBQUksQ0FBQyxNQUFjLEVBQUUsSUFBVTtRQUM5QixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFNLElBQUksQ0FBQyxHQUFHLEdBQUcsTUFBTSxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUUsQ0FBQztJQUNELEdBQUcsQ0FBQyxNQUFjLEVBQUUsSUFBVTtRQUM3QixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFNLElBQUksQ0FBQyxHQUFHLEdBQUcsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBQ0QsTUFBTSxDQUFDLE1BQWMsRUFBRSxJQUFVO1FBQ2hDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQU0sSUFBSSxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUNEOzs7O09BSUc7SUFDSCxjQUFjLENBQUMsT0FBZTtRQUM3QixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFRLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRUQsT0FBTyxDQUFDLEdBQVc7UUFDbEIsSUFBSSxXQUFXLEdBQUcsSUFBSSxXQUFXLENBQUMsRUFBRSxNQUFNLEVBQUUsdUJBQXVCLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZFLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLEVBQUUsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyRyxDQUFDO3dHQS9EVyxpQkFBaUI7NEdBQWpCLGlCQUFpQixjQUZqQixNQUFNOzs0RkFFTixpQkFBaUI7a0JBSDdCLFVBQVU7bUJBQUM7b0JBQ1gsVUFBVSxFQUFFLE1BQU07aUJBQ2xCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbm5lY3Rpb24gfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcclxuaW1wb3J0IHsgbWFwLCBPYnNlcnZhYmxlLCBvZiwgdGFrZSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwSGVhZGVycyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgQXBpQ29uc3RhbnRzU2VydmljZSB9IGZyb20gJy4uL2NvbnN0YW50cy9hcGkuY29uc3RhbnRzLnNlcnZpY2UnO1xyXG5cclxuLyoqXHJcbiAqIFNlcnZpY2lvIHF1ZSBmdW5jaW9uYSBjb21vIGFic3RyYWNjacOzbiBwYXJhIG1hbmVqYXIgbGEgY29uZXhpw7NuIGNvbiBsYSBBUElcclxuICogQGV4cG9ydFxyXG4gKiBAY2xhc3MgQ29ubmVjdGlvblNlcnZpY2VcclxuICogQGltcGxlbWVudHMge0Nvbm5lY3Rpb259XHJcbiAqL1xyXG5ASW5qZWN0YWJsZSh7XHJcblx0cHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDb25uZWN0aW9uU2VydmljZSBpbXBsZW1lbnRzIENvbm5lY3Rpb24ge1xyXG5cdC8qKlxyXG5cdCAqIEhlcnJyYW1pZW50YSB1c2FkYSBwYXJhIGdlbmVyYXIgbGFzIHBldGljaW9uZXMuXHJcblx0ICogQG1lbWJlcm9mIENvbm5lY3Rpb25TZXJ2aWNlXHJcblx0ICovXHJcblx0cHJpdmF0ZSByZWFkb25seSBfaHR0cCA9IGluamVjdChIdHRwQ2xpZW50KTtcclxuXHJcblx0LyoqXHJcblx0ICogU2VydmljaW8gcXVlIGNvbnRpZW5lIGxhcyBjb25zdGFudGVzIHVzYWRhcyBwYXJhIGxhIEFQSVxyXG5cdCAqIEBtZW1iZXJvZiBDb25uZWN0aW9uU2VydmljZVxyXG5cdCAqL1xyXG5cdHByaXZhdGUgY29uc3RhbnRzU3ZyID0gaW5qZWN0KEFwaUNvbnN0YW50c1NlcnZpY2UpO1xyXG5cclxuXHQvKipcclxuXHQgKiBVUkwgQmFzZSBwYXJhIGxhcyBwZXRpY2lvbmVzLlxyXG5cdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0ICogQG1lbWJlcm9mIENvbm5lY3Rpb25TZXJ2aWNlXHJcblx0ICovXHJcblx0cHJpdmF0ZSB1cmw6IHN0cmluZztcclxuXHJcblx0Y29uc3RydWN0b3IoKSB7XHJcblx0XHR0aGlzLnVybCA9IHRoaXMuY29uc3RhbnRzU3ZyLmdldFVybEJhc2UoKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZ1bmNpw7NuIHBhcmEgZ2VuZXJhciBwZXRpY2lvbmVzIGRlIHRpcG8gR0VUXHJcblx0ICogQHBhcmFtIGFwaXVybCB1cmwgZGVsIGVuZHBvaW50XHJcblx0ICogQHBhcmFtIGRhdGEgcGFyYW1ldHJvcyBwYXJhIGxhIHVybFxyXG5cdCAqIEByZXR1cm5zIFxyXG5cdCAqL1xyXG5cdGdldChhcGl1cmw6IHN0cmluZywgZGF0YT86IGFueSk6IE9ic2VydmFibGU8YW55PiB7XHJcblx0XHRyZXR1cm4gdGhpcy5faHR0cC5nZXQ8YW55Pih0aGlzLnVybCArIGFwaXVybCwgeyBwYXJhbXM6IHsgLi4uZGF0YSB9IH0pLnBpcGUodGFrZSgxKSk7XHJcblx0fVxyXG5cdGdldEVycm9yTm90SGFuZGxlcihhcGl1cmw6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XHJcblx0XHRyZXR1cm4gdGhpcy5faHR0cC5nZXQ8YW55Pih0aGlzLnVybCArIGFwaXVybCkucGlwZSh0YWtlKDEpKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZ1bmNpb24gcGFyYSBnZW5lcmFyIHBldGljaW9uZXMgZGUgdGlwbyBQT1NUXHJcblx0ICogQHBhcmFtIGFwaXVybCB1cmwgZGVsIGVuZHBvaW50XHJcblx0ICogQHBhcmFtIGRhdGEgXHJcblx0ICovXHJcblx0cG9zdChhcGl1cmw6IHN0cmluZywgZGF0YT86IGFueSk6IE9ic2VydmFibGU8YW55PiB7XHJcblx0XHRyZXR1cm4gdGhpcy5faHR0cC5wb3N0PGFueT4odGhpcy51cmwgKyBhcGl1cmwsIGRhdGEgfHwge30pLnBpcGUodGFrZSgxKSk7XHJcblx0fVxyXG5cdHB1dChhcGl1cmw6IHN0cmluZywgZGF0YT86IGFueSk6IE9ic2VydmFibGU8YW55PiB7XHJcblx0XHRyZXR1cm4gdGhpcy5faHR0cC5wdXQ8YW55Pih0aGlzLnVybCArIGFwaXVybCwgZGF0YSkucGlwZSh0YWtlKDEpKTtcclxuXHR9XHJcblx0ZGVsZXRlKGFwaXVybDogc3RyaW5nLCBkYXRhPzogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuXHRcdHJldHVybiB0aGlzLl9odHRwLmRlbGV0ZTxhbnk+KHRoaXMudXJsICsgYXBpdXJsKS5waXBlKHRha2UoMSkpO1xyXG5cdH1cclxuXHQvKipcclxuXHQgKiBHZW5lcmEgdW4gcGV0aWNpw7NuIHRpcG8gR0VUIHBlcm8gdXNhbmRvIGVsIHBhcmFtZXRybyBjb21vIGxhIHVybCBjb21wbGV0YS5cclxuXHQgKiBAcGFyYW0gZnVsbHVybCBcclxuXHQgKiBAcmV0dXJucyBcclxuXHQgKi9cclxuXHRnZXRXaXRoRnVsbFVybChmdWxsdXJsOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG5cdFx0cmV0dXJuIHRoaXMuX2h0dHAuZ2V0PGFueVtdPihmdWxsdXJsKS5waXBlKHRha2UoMSkpO1xyXG5cdH1cclxuXHJcblx0Z2V0SFRNTChhcGk6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XHJcblx0XHRsZXQgaHR0cEhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoeyBBY2NlcHQ6ICd0ZXh0L3BsYWluLCB0ZXh0L2h0bWwnIH0pO1xyXG5cdFx0cmV0dXJuIHRoaXMuX2h0dHAuZ2V0KHRoaXMudXJsICsgYXBpLCB7IHJlc3BvbnNlVHlwZTogJ3RleHQnLCBoZWFkZXJzOiBodHRwSGVhZGVycyB9KS5waXBlKHRha2UoMSkpO1xyXG5cdH1cclxuXHJcblx0LyogZm9ybVVybCA9IChhcGk6IHN0cmluZykgPT4ge1xyXG5cdCAgcmV0dXJuIHdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbCA9PSAnaHR0cHM6JyAmJiAhdGhpcy51cmwuaW5jbHVkZXMoJ2h0dHBzJykgPyAodGhpcy51cmwucmVwbGFjZSgnaHR0cCcsICdodHRwcycpKSArIGFwaSA6IHRoaXMudXJsICsgYXBpO1xyXG5cdH0gKi9cclxufVxyXG4iXX0=
85
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29ubmVjdGlvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctZWFzeWNvbW1lcmNlLXYxOC9zcmMvbGliL2FwaS9jb25uZWN0aW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbkQsT0FBTyxFQUF1QixJQUFJLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDakQsT0FBTyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMvRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQzs7QUFFekU7Ozs7O0dBS0c7QUFJSCxNQUFNLE9BQU8saUJBQWlCO0lBQzdCOzs7T0FHRztJQUNjLEtBQUssR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7SUFFNUM7OztPQUdHO0lBQ0ssWUFBWSxHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBRW5ELGdCQUFlLENBQUM7SUFFUixRQUFRLENBQUMsTUFBYztRQUM5QixJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUNsQyxPQUFPLE1BQU0sQ0FBQztRQUNmLENBQUM7UUFFRCxNQUFNLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNsRixNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBRTFFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNkLE9BQU8sY0FBYyxDQUFDO1FBQ3ZCLENBQUM7UUFFRCxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDckIsT0FBTyxPQUFPLENBQUM7UUFDaEIsQ0FBQztRQUVELE9BQU8sR0FBRyxPQUFPLElBQUksY0FBYyxFQUFFLENBQUM7SUFDdkMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsR0FBRyxDQUFDLE1BQWMsRUFBRSxJQUFVO1FBQzdCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLEdBQUcsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxRixDQUFDO0lBQ0Qsa0JBQWtCLENBQUMsTUFBYztRQUNoQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxJQUFJLENBQUMsTUFBYyxFQUFFLElBQVU7UUFDOUIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBTSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDOUUsQ0FBQztJQUNELEdBQUcsQ0FBQyxNQUFjLEVBQUUsSUFBVTtRQUM3QixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFDRCxNQUFNLENBQUMsTUFBYyxFQUFFLElBQVU7UUFDaEMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBTSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFDRDs7OztPQUlHO0lBQ0gsY0FBYyxDQUFDLE9BQWU7UUFDN0IsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBUSxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVELE9BQU8sQ0FBQyxHQUFXO1FBQ2xCLElBQUksV0FBVyxHQUFHLElBQUksV0FBVyxDQUFDLEVBQUUsTUFBTSxFQUFFLHVCQUF1QixFQUFFLENBQUMsQ0FBQztRQUN2RSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN6RyxDQUFDO3dHQXpFVyxpQkFBaUI7NEdBQWpCLGlCQUFpQixjQUZqQixNQUFNOzs0RkFFTixpQkFBaUI7a0JBSDdCLFVBQVU7bUJBQUM7b0JBQ1gsVUFBVSxFQUFFLE1BQU07aUJBQ2xCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbm5lY3Rpb24gfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcclxuaW1wb3J0IHsgbWFwLCBPYnNlcnZhYmxlLCBvZiwgdGFrZSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwSGVhZGVycyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgQXBpQ29uc3RhbnRzU2VydmljZSB9IGZyb20gJy4uL2NvbnN0YW50cy9hcGkuY29uc3RhbnRzLnNlcnZpY2UnO1xyXG5cclxuLyoqXHJcbiAqIFNlcnZpY2lvIHF1ZSBmdW5jaW9uYSBjb21vIGFic3RyYWNjacOzbiBwYXJhIG1hbmVqYXIgbGEgY29uZXhpw7NuIGNvbiBsYSBBUElcclxuICogQGV4cG9ydFxyXG4gKiBAY2xhc3MgQ29ubmVjdGlvblNlcnZpY2VcclxuICogQGltcGxlbWVudHMge0Nvbm5lY3Rpb259XHJcbiAqL1xyXG5ASW5qZWN0YWJsZSh7XHJcblx0cHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDb25uZWN0aW9uU2VydmljZSBpbXBsZW1lbnRzIENvbm5lY3Rpb24ge1xyXG5cdC8qKlxyXG5cdCAqIEhlcnJyYW1pZW50YSB1c2FkYSBwYXJhIGdlbmVyYXIgbGFzIHBldGljaW9uZXMuXHJcblx0ICogQG1lbWJlcm9mIENvbm5lY3Rpb25TZXJ2aWNlXHJcblx0ICovXHJcblx0cHJpdmF0ZSByZWFkb25seSBfaHR0cCA9IGluamVjdChIdHRwQ2xpZW50KTtcclxuXHJcblx0LyoqXHJcblx0ICogU2VydmljaW8gcXVlIGNvbnRpZW5lIGxhcyBjb25zdGFudGVzIHVzYWRhcyBwYXJhIGxhIEFQSVxyXG5cdCAqIEBtZW1iZXJvZiBDb25uZWN0aW9uU2VydmljZVxyXG5cdCAqL1xyXG5cdHByaXZhdGUgY29uc3RhbnRzU3ZyID0gaW5qZWN0KEFwaUNvbnN0YW50c1NlcnZpY2UpO1xyXG5cclxuXHRjb25zdHJ1Y3RvcigpIHt9XHJcblxyXG5cdHByaXZhdGUgYnVpbGRVcmwoYXBpdXJsOiBzdHJpbmcpOiBzdHJpbmcge1xyXG5cdFx0aWYgKC9eaHR0cHM/OlxcL1xcLy9pLnRlc3QoYXBpdXJsKSkge1xyXG5cdFx0XHRyZXR1cm4gYXBpdXJsO1xyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IGJhc2VVcmwgPSAodGhpcy5jb25zdGFudHNTdnIuZ2V0VXJsQmFzZSgpIHx8ICcnKS50cmltKCkucmVwbGFjZSgvXFwvKyQvLCAnJyk7XHJcblx0XHRjb25zdCBub3JtYWxpemVkUGF0aCA9IGFwaXVybC5yZXBsYWNlKC9eXFwvKy8sICcnKS5yZXBsYWNlKC9cXC97Mix9L2csICcvJyk7XHJcblxyXG5cdFx0aWYgKCFiYXNlVXJsKSB7XHJcblx0XHRcdHJldHVybiBub3JtYWxpemVkUGF0aDtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIW5vcm1hbGl6ZWRQYXRoKSB7XHJcblx0XHRcdHJldHVybiBiYXNlVXJsO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBgJHtiYXNlVXJsfS8ke25vcm1hbGl6ZWRQYXRofWA7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGdW5jacOzbiBwYXJhIGdlbmVyYXIgcGV0aWNpb25lcyBkZSB0aXBvIEdFVFxyXG5cdCAqIEBwYXJhbSBhcGl1cmwgdXJsIGRlbCBlbmRwb2ludFxyXG5cdCAqIEBwYXJhbSBkYXRhIHBhcmFtZXRyb3MgcGFyYSBsYSB1cmxcclxuXHQgKiBAcmV0dXJucyBcclxuXHQgKi9cclxuXHRnZXQoYXBpdXJsOiBzdHJpbmcsIGRhdGE/OiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG5cdFx0cmV0dXJuIHRoaXMuX2h0dHAuZ2V0PGFueT4odGhpcy5idWlsZFVybChhcGl1cmwpLCB7IHBhcmFtczogeyAuLi5kYXRhIH0gfSkucGlwZSh0YWtlKDEpKTtcclxuXHR9XHJcblx0Z2V0RXJyb3JOb3RIYW5kbGVyKGFwaXVybDogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuXHRcdHJldHVybiB0aGlzLl9odHRwLmdldDxhbnk+KHRoaXMuYnVpbGRVcmwoYXBpdXJsKSkucGlwZSh0YWtlKDEpKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZ1bmNpb24gcGFyYSBnZW5lcmFyIHBldGljaW9uZXMgZGUgdGlwbyBQT1NUXHJcblx0ICogQHBhcmFtIGFwaXVybCB1cmwgZGVsIGVuZHBvaW50XHJcblx0ICogQHBhcmFtIGRhdGEgXHJcblx0ICovXHJcblx0cG9zdChhcGl1cmw6IHN0cmluZywgZGF0YT86IGFueSk6IE9ic2VydmFibGU8YW55PiB7XHJcblx0XHRyZXR1cm4gdGhpcy5faHR0cC5wb3N0PGFueT4odGhpcy5idWlsZFVybChhcGl1cmwpLCBkYXRhIHx8IHt9KS5waXBlKHRha2UoMSkpO1xyXG5cdH1cclxuXHRwdXQoYXBpdXJsOiBzdHJpbmcsIGRhdGE/OiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG5cdFx0cmV0dXJuIHRoaXMuX2h0dHAucHV0PGFueT4odGhpcy5idWlsZFVybChhcGl1cmwpLCBkYXRhKS5waXBlKHRha2UoMSkpO1xyXG5cdH1cclxuXHRkZWxldGUoYXBpdXJsOiBzdHJpbmcsIGRhdGE/OiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG5cdFx0cmV0dXJuIHRoaXMuX2h0dHAuZGVsZXRlPGFueT4odGhpcy5idWlsZFVybChhcGl1cmwpKS5waXBlKHRha2UoMSkpO1xyXG5cdH1cclxuXHQvKipcclxuXHQgKiBHZW5lcmEgdW4gcGV0aWNpw7NuIHRpcG8gR0VUIHBlcm8gdXNhbmRvIGVsIHBhcmFtZXRybyBjb21vIGxhIHVybCBjb21wbGV0YS5cclxuXHQgKiBAcGFyYW0gZnVsbHVybCBcclxuXHQgKiBAcmV0dXJucyBcclxuXHQgKi9cclxuXHRnZXRXaXRoRnVsbFVybChmdWxsdXJsOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG5cdFx0cmV0dXJuIHRoaXMuX2h0dHAuZ2V0PGFueVtdPihmdWxsdXJsKS5waXBlKHRha2UoMSkpO1xyXG5cdH1cclxuXHJcblx0Z2V0SFRNTChhcGk6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XHJcblx0XHRsZXQgaHR0cEhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoeyBBY2NlcHQ6ICd0ZXh0L3BsYWluLCB0ZXh0L2h0bWwnIH0pO1xyXG5cdFx0cmV0dXJuIHRoaXMuX2h0dHAuZ2V0KHRoaXMuYnVpbGRVcmwoYXBpKSwgeyByZXNwb25zZVR5cGU6ICd0ZXh0JywgaGVhZGVyczogaHR0cEhlYWRlcnMgfSkucGlwZSh0YWtlKDEpKTtcclxuXHR9XHJcblxyXG5cdC8qIGZvcm1VcmwgPSAoYXBpOiBzdHJpbmcpID0+IHtcclxuXHQgIHJldHVybiB3aW5kb3cubG9jYXRpb24ucHJvdG9jb2wgPT0gJ2h0dHBzOicgJiYgIXRoaXMudXJsLmluY2x1ZGVzKCdodHRwcycpID8gKHRoaXMudXJsLnJlcGxhY2UoJ2h0dHAnLCAnaHR0cHMnKSkgKyBhcGkgOiB0aGlzLnVybCArIGFwaTtcclxuXHR9ICovXHJcbn1cclxuIl19