valtech-components 2.0.903 → 2.0.904

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.
@@ -16,7 +16,7 @@ export class AuthSyncService {
16
16
  /** Observable de eventos de sincronización */
17
17
  this.onEvent$ = this.eventSubject.asObservable();
18
18
  this.isBrowser = isPlatformBrowser(platformId);
19
- const prefix = this.config.storagePrefix || 'valtech_auth_';
19
+ const prefix = this.config?.storagePrefix || 'valtech_auth_';
20
20
  this.channelName = `${prefix}sync_channel`;
21
21
  }
22
22
  /**
@@ -24,7 +24,7 @@ export class AuthSyncService {
24
24
  * SSR-noop — sync de pestañas solo aplica en browser.
25
25
  */
26
26
  start() {
27
- if (!this.config.enableTabSync || !this.isBrowser) {
27
+ if (!this.config?.enableTabSync || !this.isBrowser) {
28
28
  return;
29
29
  }
30
30
  // Intentar usar BroadcastChannel API (mejor rendimiento)
@@ -53,7 +53,7 @@ export class AuthSyncService {
53
53
  * Envía un evento a otras pestañas.
54
54
  */
55
55
  broadcast(event) {
56
- if (!this.config.enableTabSync || !this.isBrowser) {
56
+ if (!this.config?.enableTabSync || !this.isBrowser) {
57
57
  return;
58
58
  }
59
59
  const fullEvent = {
@@ -97,7 +97,7 @@ export class AuthSyncService {
97
97
  * Inicializa fallback con storage events.
98
98
  */
99
99
  initStorageEvents() {
100
- const storageKey = `${this.config.storagePrefix}sync_event`;
100
+ const storageKey = `${this.config?.storagePrefix}sync_event`;
101
101
  this.storageListener = (event) => {
102
102
  if (event.key === storageKey && event.newValue) {
103
103
  try {
@@ -115,7 +115,7 @@ export class AuthSyncService {
115
115
  * Envía evento via localStorage (fallback).
116
116
  */
117
117
  broadcastViaStorage(event) {
118
- const storageKey = `${this.config.storagePrefix}sync_event`;
118
+ const storageKey = `${this.config?.storagePrefix}sync_event`;
119
119
  try {
120
120
  // Escribir y luego limpiar para permitir múltiples eventos del mismo tipo
121
121
  localStorage.setItem(storageKey, JSON.stringify(event));
@@ -154,4 +154,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
154
154
  type: Inject,
155
155
  args: [PLATFORM_ID]
156
156
  }] }] });
157
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zZXJ2aWNlcy9hdXRoL3N5bmMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBYSxRQUFRLEVBQUUsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxPQUFPLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDM0MsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sVUFBVSxDQUFDOztBQUcvQzs7O0dBR0c7QUFFSCxNQUFNLE9BQU8sZUFBZTtJQVcxQixZQUNtRCxNQUFnQyxFQUM1RCxVQUFrQjtRQURVLFdBQU0sR0FBTixNQUFNLENBQTBCO1FBWDNFLFlBQU8sR0FBNEIsSUFBSSxDQUFDO1FBRXhDLGlCQUFZLEdBQUcsSUFBSSxPQUFPLEVBQWlCLENBQUM7UUFDNUMsb0JBQWUsR0FBMkMsSUFBSSxDQUFDO1FBRXZFLDhDQUE4QztRQUNyQyxhQUFRLEdBQThCLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxFQUFFLENBQUM7UUFROUUsSUFBSSxDQUFDLFNBQVMsR0FBRyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMvQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsSUFBSSxlQUFlLENBQUM7UUFDNUQsSUFBSSxDQUFDLFdBQVcsR0FBRyxHQUFHLE1BQU0sY0FBYyxDQUFDO0lBQzdDLENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLO1FBQ0gsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2xELE9BQU87UUFDVCxDQUFDO1FBRUQseURBQXlEO1FBQ3pELElBQUksT0FBTyxnQkFBZ0IsS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUM1QyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUM5QixDQUFDO2FBQU0sQ0FBQztZQUNOLDRCQUE0QjtZQUM1QixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUMzQixDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBSTtRQUNGLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2pCLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDdEIsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLGVBQWUsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDM0MsTUFBTSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDNUQsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7UUFDOUIsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILFNBQVMsQ0FBQyxLQUF1QztRQUMvQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDbEQsT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLFNBQVMsR0FBa0I7WUFDL0IsR0FBRyxLQUFLO1lBQ1IsU0FBUyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUU7U0FDdEIsQ0FBQztRQUVGLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2pCLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3RDLENBQUM7YUFBTSxDQUFDO1lBQ04sNkNBQTZDO1lBQzdDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN0QyxDQUFDO0lBQ0gsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDWixJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQy9CLENBQUM7SUFFRDs7T0FFRztJQUNLLG9CQUFvQjtRQUMxQixJQUFJLENBQUM7WUFDSCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBRXRELElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxHQUFHLENBQUMsS0FBa0MsRUFBRSxFQUFFO2dCQUM5RCxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMvQixDQUFDLENBQUM7WUFFRixJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsR0FBRyxHQUFHLEVBQUU7Z0JBQ2pDLE9BQU8sQ0FBQyxJQUFJLENBQUMsMERBQTBELENBQUMsQ0FBQztnQkFDekUsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQztnQkFDdEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7Z0JBQ3BCLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQzNCLENBQUMsQ0FBQztRQUNKLENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxnREFBZ0Q7WUFDaEQsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDM0IsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNLLGlCQUFpQjtRQUN2QixNQUFNLFVBQVUsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxZQUFZLENBQUM7UUFFNUQsSUFBSSxDQUFDLGVBQWUsR0FBRyxDQUFDLEtBQW1CLEVBQUUsRUFBRTtZQUM3QyxJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssVUFBVSxJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDL0MsSUFBSSxDQUFDO29CQUNILE1BQU0sU0FBUyxHQUFrQixJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDNUQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDOUIsQ0FBQztnQkFBQyxNQUFNLENBQUM7b0JBQ1AsK0JBQStCO2dCQUNqQyxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUMsQ0FBQztRQUVGLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFRDs7T0FFRztJQUNLLG1CQUFtQixDQUFDLEtBQW9CO1FBQzlDLE1BQU0sVUFBVSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLFlBQVksQ0FBQztRQUU1RCxJQUFJLENBQUM7WUFDSCwwRUFBMEU7WUFDMUUsWUFBWSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ3hELGlFQUFpRTtZQUNqRSxVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNkLFlBQVksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDdEMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ1YsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLE9BQU8sQ0FBQyxJQUFJLENBQUMsaURBQWlELENBQUMsQ0FBQztRQUNsRSxDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ssV0FBVyxDQUFDLEtBQW9CO1FBQ3RDLGlFQUFpRTtRQUNqRSxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQztRQUN6QyxJQUFJLEdBQUcsR0FBRyxJQUFJLEVBQUUsQ0FBQztZQUNmLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDaEMsQ0FBQzsrR0F2SlUsZUFBZSxrQkFZSixtQkFBbUIsNkJBQy9CLFdBQVc7bUhBYlYsZUFBZSxjQURGLE1BQU07OzRGQUNuQixlQUFlO2tCQUQzQixVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRTs7MEJBYTdCLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsbUJBQW1COzswQkFDdEMsTUFBTTsyQkFBQyxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBPbkRlc3Ryb3ksIE9wdGlvbmFsLCBQTEFURk9STV9JRCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgaXNQbGF0Zm9ybUJyb3dzZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgU3ViamVjdCwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgVkFMVEVDSF9BVVRIX0NPTkZJRyB9IGZyb20gJy4vY29uZmlnJztcbmltcG9ydCB7IEF1dGhTeW5jRXZlbnQsIEF1dGhTeW5jRXZlbnRUeXBlLCBWYWx0ZWNoQXV0aENvbmZpZyB9IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIFNlcnZpY2lvIHBhcmEgc2luY3Jvbml6YWNpw7NuIGRlIGVzdGFkbyBkZSBhdXRlbnRpY2FjacOzbiBlbnRyZSBwZXN0YcOxYXMuXG4gKiBVc2EgQnJvYWRjYXN0Q2hhbm5lbCBBUEkgY29uIGZhbGxiYWNrIGEgc3RvcmFnZSBldmVudHMuXG4gKi9cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgQXV0aFN5bmNTZXJ2aWNlIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBjaGFubmVsOiBCcm9hZGNhc3RDaGFubmVsIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY2hhbm5lbE5hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSBldmVudFN1YmplY3QgPSBuZXcgU3ViamVjdDxBdXRoU3luY0V2ZW50PigpO1xuICBwcml2YXRlIHN0b3JhZ2VMaXN0ZW5lcjogKChldmVudDogU3RvcmFnZUV2ZW50KSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBPYnNlcnZhYmxlIGRlIGV2ZW50b3MgZGUgc2luY3Jvbml6YWNpw7NuICovXG4gIHJlYWRvbmx5IG9uRXZlbnQkOiBPYnNlcnZhYmxlPEF1dGhTeW5jRXZlbnQ+ID0gdGhpcy5ldmVudFN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBpc0Jyb3dzZXI6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChWQUxURUNIX0FVVEhfQ09ORklHKSBwcml2YXRlIGNvbmZpZzogVmFsdGVjaEF1dGhDb25maWcgfCBudWxsLFxuICAgIEBJbmplY3QoUExBVEZPUk1fSUQpIHBsYXRmb3JtSWQ6IE9iamVjdFxuICApIHtcbiAgICB0aGlzLmlzQnJvd3NlciA9IGlzUGxhdGZvcm1Ccm93c2VyKHBsYXRmb3JtSWQpO1xuICAgIGNvbnN0IHByZWZpeCA9IHRoaXMuY29uZmlnLnN0b3JhZ2VQcmVmaXggfHwgJ3ZhbHRlY2hfYXV0aF8nO1xuICAgIHRoaXMuY2hhbm5lbE5hbWUgPSBgJHtwcmVmaXh9c3luY19jaGFubmVsYDtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmljaWEgbGEgc2luY3Jvbml6YWNpw7NuIGVudHJlIHBlc3Rhw7Fhcy5cbiAgICogU1NSLW5vb3Ag4oCUIHN5bmMgZGUgcGVzdGHDsWFzIHNvbG8gYXBsaWNhIGVuIGJyb3dzZXIuXG4gICAqL1xuICBzdGFydCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnLmVuYWJsZVRhYlN5bmMgfHwgIXRoaXMuaXNCcm93c2VyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSW50ZW50YXIgdXNhciBCcm9hZGNhc3RDaGFubmVsIEFQSSAobWVqb3IgcmVuZGltaWVudG8pXG4gICAgaWYgKHR5cGVvZiBCcm9hZGNhc3RDaGFubmVsICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhpcy5pbml0QnJvYWRjYXN0Q2hhbm5lbCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBGYWxsYmFjayBhIHN0b3JhZ2UgZXZlbnRzXG4gICAgICB0aGlzLmluaXRTdG9yYWdlRXZlbnRzKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERldGllbmUgbGEgc2luY3Jvbml6YWNpw7NuLlxuICAgKi9cbiAgc3RvcCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jaGFubmVsKSB7XG4gICAgICB0aGlzLmNoYW5uZWwuY2xvc2UoKTtcbiAgICAgIHRoaXMuY2hhbm5lbCA9IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc3RvcmFnZUxpc3RlbmVyICYmIHRoaXMuaXNCcm93c2VyKSB7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignc3RvcmFnZScsIHRoaXMuc3RvcmFnZUxpc3RlbmVyKTtcbiAgICAgIHRoaXMuc3RvcmFnZUxpc3RlbmVyID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRW52w61hIHVuIGV2ZW50byBhIG90cmFzIHBlc3Rhw7Fhcy5cbiAgICovXG4gIGJyb2FkY2FzdChldmVudDogT21pdDxBdXRoU3luY0V2ZW50LCAndGltZXN0YW1wJz4pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnLmVuYWJsZVRhYlN5bmMgfHwgIXRoaXMuaXNCcm93c2VyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZnVsbEV2ZW50OiBBdXRoU3luY0V2ZW50ID0ge1xuICAgICAgLi4uZXZlbnQsXG4gICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgfTtcblxuICAgIGlmICh0aGlzLmNoYW5uZWwpIHtcbiAgICAgIHRoaXMuY2hhbm5lbC5wb3N0TWVzc2FnZShmdWxsRXZlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBGYWxsYmFjazogdXNhciBsb2NhbFN0b3JhZ2UgcGFyYSBub3RpZmljYXJcbiAgICAgIHRoaXMuYnJvYWRjYXN0VmlhU3RvcmFnZShmdWxsRXZlbnQpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3RvcCgpO1xuICAgIHRoaXMuZXZlbnRTdWJqZWN0LmNvbXBsZXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogSW5pY2lhbGl6YSBCcm9hZGNhc3RDaGFubmVsIEFQSS5cbiAgICovXG4gIHByaXZhdGUgaW5pdEJyb2FkY2FzdENoYW5uZWwoKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuY2hhbm5lbCA9IG5ldyBCcm9hZGNhc3RDaGFubmVsKHRoaXMuY2hhbm5lbE5hbWUpO1xuXG4gICAgICB0aGlzLmNoYW5uZWwub25tZXNzYWdlID0gKGV2ZW50OiBNZXNzYWdlRXZlbnQ8QXV0aFN5bmNFdmVudD4pID0+IHtcbiAgICAgICAgdGhpcy5oYW5kbGVFdmVudChldmVudC5kYXRhKTtcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuY2hhbm5lbC5vbm1lc3NhZ2VlcnJvciA9ICgpID0+IHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbVmFsdGVjaEF1dGhdIEVycm9yIGVuIEJyb2FkY2FzdENoYW5uZWwsIHVzYW5kbyBmYWxsYmFjaycpO1xuICAgICAgICB0aGlzLmNoYW5uZWw/LmNsb3NlKCk7XG4gICAgICAgIHRoaXMuY2hhbm5lbCA9IG51bGw7XG4gICAgICAgIHRoaXMuaW5pdFN0b3JhZ2VFdmVudHMoKTtcbiAgICAgIH07XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBCcm9hZGNhc3RDaGFubmVsIG5vIGRpc3BvbmlibGUsIHVzYXIgZmFsbGJhY2tcbiAgICAgIHRoaXMuaW5pdFN0b3JhZ2VFdmVudHMoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5pY2lhbGl6YSBmYWxsYmFjayBjb24gc3RvcmFnZSBldmVudHMuXG4gICAqL1xuICBwcml2YXRlIGluaXRTdG9yYWdlRXZlbnRzKCk6IHZvaWQge1xuICAgIGNvbnN0IHN0b3JhZ2VLZXkgPSBgJHt0aGlzLmNvbmZpZy5zdG9yYWdlUHJlZml4fXN5bmNfZXZlbnRgO1xuXG4gICAgdGhpcy5zdG9yYWdlTGlzdGVuZXIgPSAoZXZlbnQ6IFN0b3JhZ2VFdmVudCkgPT4ge1xuICAgICAgaWYgKGV2ZW50LmtleSA9PT0gc3RvcmFnZUtleSAmJiBldmVudC5uZXdWYWx1ZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHN5bmNFdmVudDogQXV0aFN5bmNFdmVudCA9IEpTT04ucGFyc2UoZXZlbnQubmV3VmFsdWUpO1xuICAgICAgICAgIHRoaXMuaGFuZGxlRXZlbnQoc3luY0V2ZW50KTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gSWdub3JhciBldmVudG9zIG1hbCBmb3JtYWRvc1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzdG9yYWdlJywgdGhpcy5zdG9yYWdlTGlzdGVuZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVudsOtYSBldmVudG8gdmlhIGxvY2FsU3RvcmFnZSAoZmFsbGJhY2spLlxuICAgKi9cbiAgcHJpdmF0ZSBicm9hZGNhc3RWaWFTdG9yYWdlKGV2ZW50OiBBdXRoU3luY0V2ZW50KTogdm9pZCB7XG4gICAgY29uc3Qgc3RvcmFnZUtleSA9IGAke3RoaXMuY29uZmlnLnN0b3JhZ2VQcmVmaXh9c3luY19ldmVudGA7XG5cbiAgICB0cnkge1xuICAgICAgLy8gRXNjcmliaXIgeSBsdWVnbyBsaW1waWFyIHBhcmEgcGVybWl0aXIgbcO6bHRpcGxlcyBldmVudG9zIGRlbCBtaXNtbyB0aXBvXG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShzdG9yYWdlS2V5LCBKU09OLnN0cmluZ2lmeShldmVudCkpO1xuICAgICAgLy8gVXNhciBzZXRUaW1lb3V0IHBhcmEgcGVybWl0aXIgcXVlIG90cmFzIHBlc3Rhw7FhcyBsZWFuIGVsIHZhbG9yXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oc3RvcmFnZUtleSk7XG4gICAgICB9LCAxMDApO1xuICAgIH0gY2F0Y2gge1xuICAgICAgY29uc29sZS53YXJuKCdbVmFsdGVjaEF1dGhdIEVycm9yIGVudmlhbmRvIGV2ZW50byB2aWEgc3RvcmFnZScpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNYW5lamEgdW4gZXZlbnRvIHJlY2liaWRvLlxuICAgKi9cbiAgcHJpdmF0ZSBoYW5kbGVFdmVudChldmVudDogQXV0aFN5bmNFdmVudCk6IHZvaWQge1xuICAgIC8vIFZlcmlmaWNhciBxdWUgZWwgZXZlbnRvIG5vIHNlYSBtdXkgYW50aWd1byAobcOhcyBkZSA1IHNlZ3VuZG9zKVxuICAgIGNvbnN0IGFnZSA9IERhdGUubm93KCkgLSBldmVudC50aW1lc3RhbXA7XG4gICAgaWYgKGFnZSA+IDUwMDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmV2ZW50U3ViamVjdC5uZXh0KGV2ZW50KTtcbiAgfVxufVxuIl19
157
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zZXJ2aWNlcy9hdXRoL3N5bmMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBYSxRQUFRLEVBQUUsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxPQUFPLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDM0MsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sVUFBVSxDQUFDOztBQUcvQzs7O0dBR0c7QUFFSCxNQUFNLE9BQU8sZUFBZTtJQVcxQixZQUNtRCxNQUFnQyxFQUM1RCxVQUFrQjtRQURVLFdBQU0sR0FBTixNQUFNLENBQTBCO1FBWDNFLFlBQU8sR0FBNEIsSUFBSSxDQUFDO1FBRXhDLGlCQUFZLEdBQUcsSUFBSSxPQUFPLEVBQWlCLENBQUM7UUFDNUMsb0JBQWUsR0FBMkMsSUFBSSxDQUFDO1FBRXZFLDhDQUE4QztRQUNyQyxhQUFRLEdBQThCLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxFQUFFLENBQUM7UUFROUUsSUFBSSxDQUFDLFNBQVMsR0FBRyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMvQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLGFBQWEsSUFBSSxlQUFlLENBQUM7UUFDN0QsSUFBSSxDQUFDLFdBQVcsR0FBRyxHQUFHLE1BQU0sY0FBYyxDQUFDO0lBQzdDLENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLO1FBQ0gsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsYUFBYSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ25ELE9BQU87UUFDVCxDQUFDO1FBRUQseURBQXlEO1FBQ3pE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VSxFQUFFLE1BQU0sRUFBRTs7MEJBYTdCLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsbUJBQW1COzswQkFDdEMsTUFBTTsyQkFBQyxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBPbkRlc3Ryb3ksIE9wdGlvbmFsLCBQTEFURk9STV9JRCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgaXNQbGF0Zm9ybUJyb3dzZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgU3ViamVjdCwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgVkFMVEVDSF9BVVRIX0NPTkZJRyB9IGZyb20gJy4vY29uZmlnJztcbmltcG9ydCB7IEF1dGhTeW5jRXZlbnQsIEF1dGhTeW5jRXZlbnRUeXBlLCBWYWx0ZWNoQXV0aENvbmZpZyB9IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIFNlcnZpY2lvIHBhcmEgc2luY3Jvbml6YWNpw7NuIGRlIGVzdGFkbyBkZSBhdXRlbnRpY2FjacOzbiBlbnRyZSBwZXN0YcOxYXMuXG4gKiBVc2EgQnJvYWRjYXN0Q2hhbm5lbCBBUEkgY29uIGZhbGxiYWNrIGEgc3RvcmFnZSBldmVudHMuXG4gKi9cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgQXV0aFN5bmNTZXJ2aWNlIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBjaGFubmVsOiBCcm9hZGNhc3RDaGFubmVsIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY2hhbm5lbE5hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSBldmVudFN1YmplY3QgPSBuZXcgU3ViamVjdDxBdXRoU3luY0V2ZW50PigpO1xuICBwcml2YXRlIHN0b3JhZ2VMaXN0ZW5lcjogKChldmVudDogU3RvcmFnZUV2ZW50KSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBPYnNlcnZhYmxlIGRlIGV2ZW50b3MgZGUgc2luY3Jvbml6YWNpw7NuICovXG4gIHJlYWRvbmx5IG9uRXZlbnQkOiBPYnNlcnZhYmxlPEF1dGhTeW5jRXZlbnQ+ID0gdGhpcy5ldmVudFN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBpc0Jyb3dzZXI6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChWQUxURUNIX0FVVEhfQ09ORklHKSBwcml2YXRlIGNvbmZpZzogVmFsdGVjaEF1dGhDb25maWcgfCBudWxsLFxuICAgIEBJbmplY3QoUExBVEZPUk1fSUQpIHBsYXRmb3JtSWQ6IE9iamVjdFxuICApIHtcbiAgICB0aGlzLmlzQnJvd3NlciA9IGlzUGxhdGZvcm1Ccm93c2VyKHBsYXRmb3JtSWQpO1xuICAgIGNvbnN0IHByZWZpeCA9IHRoaXMuY29uZmlnPy5zdG9yYWdlUHJlZml4IHx8ICd2YWx0ZWNoX2F1dGhfJztcbiAgICB0aGlzLmNoYW5uZWxOYW1lID0gYCR7cHJlZml4fXN5bmNfY2hhbm5lbGA7XG4gIH1cblxuICAvKipcbiAgICogSW5pY2lhIGxhIHNpbmNyb25pemFjacOzbiBlbnRyZSBwZXN0YcOxYXMuXG4gICAqIFNTUi1ub29wIOKAlCBzeW5jIGRlIHBlc3Rhw7FhcyBzb2xvIGFwbGljYSBlbiBicm93c2VyLlxuICAgKi9cbiAgc3RhcnQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZz8uZW5hYmxlVGFiU3luYyB8fCAhdGhpcy5pc0Jyb3dzZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJbnRlbnRhciB1c2FyIEJyb2FkY2FzdENoYW5uZWwgQVBJIChtZWpvciByZW5kaW1pZW50bylcbiAgICBpZiAodHlwZW9mIEJyb2FkY2FzdENoYW5uZWwgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aGlzLmluaXRCcm9hZGNhc3RDaGFubmVsKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZhbGxiYWNrIGEgc3RvcmFnZSBldmVudHNcbiAgICAgIHRoaXMuaW5pdFN0b3JhZ2VFdmVudHMoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGV0aWVuZSBsYSBzaW5jcm9uaXphY2nDs24uXG4gICAqL1xuICBzdG9wKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNoYW5uZWwpIHtcbiAgICAgIHRoaXMuY2hhbm5lbC5jbG9zZSgpO1xuICAgICAgdGhpcy5jaGFubmVsID0gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zdG9yYWdlTGlzdGVuZXIgJiYgdGhpcy5pc0Jyb3dzZXIpIHtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdzdG9yYWdlJywgdGhpcy5zdG9yYWdlTGlzdGVuZXIpO1xuICAgICAgdGhpcy5zdG9yYWdlTGlzdGVuZXIgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFbnbDrWEgdW4gZXZlbnRvIGEgb3RyYXMgcGVzdGHDsWFzLlxuICAgKi9cbiAgYnJvYWRjYXN0KGV2ZW50OiBPbWl0PEF1dGhTeW5jRXZlbnQsICd0aW1lc3RhbXAnPik6IHZvaWQge1xuICAgIGlmICghdGhpcy5jb25maWc/LmVuYWJsZVRhYlN5bmMgfHwgIXRoaXMuaXNCcm93c2VyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZnVsbEV2ZW50OiBBdXRoU3luY0V2ZW50ID0ge1xuICAgICAgLi4uZXZlbnQsXG4gICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgfTtcblxuICAgIGlmICh0aGlzLmNoYW5uZWwpIHtcbiAgICAgIHRoaXMuY2hhbm5lbC5wb3N0TWVzc2FnZShmdWxsRXZlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBGYWxsYmFjazogdXNhciBsb2NhbFN0b3JhZ2UgcGFyYSBub3RpZmljYXJcbiAgICAgIHRoaXMuYnJvYWRjYXN0VmlhU3RvcmFnZShmdWxsRXZlbnQpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3RvcCgpO1xuICAgIHRoaXMuZXZlbnRTdWJqZWN0LmNvbXBsZXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogSW5pY2lhbGl6YSBCcm9hZGNhc3RDaGFubmVsIEFQSS5cbiAgICovXG4gIHByaXZhdGUgaW5pdEJyb2FkY2FzdENoYW5uZWwoKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuY2hhbm5lbCA9IG5ldyBCcm9hZGNhc3RDaGFubmVsKHRoaXMuY2hhbm5lbE5hbWUpO1xuXG4gICAgICB0aGlzLmNoYW5uZWwub25tZXNzYWdlID0gKGV2ZW50OiBNZXNzYWdlRXZlbnQ8QXV0aFN5bmNFdmVudD4pID0+IHtcbiAgICAgICAgdGhpcy5oYW5kbGVFdmVudChldmVudC5kYXRhKTtcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuY2hhbm5lbC5vbm1lc3NhZ2VlcnJvciA9ICgpID0+IHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbVmFsdGVjaEF1dGhdIEVycm9yIGVuIEJyb2FkY2FzdENoYW5uZWwsIHVzYW5kbyBmYWxsYmFjaycpO1xuICAgICAgICB0aGlzLmNoYW5uZWw/LmNsb3NlKCk7XG4gICAgICAgIHRoaXMuY2hhbm5lbCA9IG51bGw7XG4gICAgICAgIHRoaXMuaW5pdFN0b3JhZ2VFdmVudHMoKTtcbiAgICAgIH07XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBCcm9hZGNhc3RDaGFubmVsIG5vIGRpc3BvbmlibGUsIHVzYXIgZmFsbGJhY2tcbiAgICAgIHRoaXMuaW5pdFN0b3JhZ2VFdmVudHMoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5pY2lhbGl6YSBmYWxsYmFjayBjb24gc3RvcmFnZSBldmVudHMuXG4gICAqL1xuICBwcml2YXRlIGluaXRTdG9yYWdlRXZlbnRzKCk6IHZvaWQge1xuICAgIGNvbnN0IHN0b3JhZ2VLZXkgPSBgJHt0aGlzLmNvbmZpZz8uc3RvcmFnZVByZWZpeH1zeW5jX2V2ZW50YDtcblxuICAgIHRoaXMuc3RvcmFnZUxpc3RlbmVyID0gKGV2ZW50OiBTdG9yYWdlRXZlbnQpID0+IHtcbiAgICAgIGlmIChldmVudC5rZXkgPT09IHN0b3JhZ2VLZXkgJiYgZXZlbnQubmV3VmFsdWUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBzeW5jRXZlbnQ6IEF1dGhTeW5jRXZlbnQgPSBKU09OLnBhcnNlKGV2ZW50Lm5ld1ZhbHVlKTtcbiAgICAgICAgICB0aGlzLmhhbmRsZUV2ZW50KHN5bmNFdmVudCk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIElnbm9yYXIgZXZlbnRvcyBtYWwgZm9ybWFkb3NcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc3RvcmFnZScsIHRoaXMuc3RvcmFnZUxpc3RlbmVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnbDrWEgZXZlbnRvIHZpYSBsb2NhbFN0b3JhZ2UgKGZhbGxiYWNrKS5cbiAgICovXG4gIHByaXZhdGUgYnJvYWRjYXN0VmlhU3RvcmFnZShldmVudDogQXV0aFN5bmNFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHN0b3JhZ2VLZXkgPSBgJHt0aGlzLmNvbmZpZz8uc3RvcmFnZVByZWZpeH1zeW5jX2V2ZW50YDtcblxuICAgIHRyeSB7XG4gICAgICAvLyBFc2NyaWJpciB5IGx1ZWdvIGxpbXBpYXIgcGFyYSBwZXJtaXRpciBtw7psdGlwbGVzIGV2ZW50b3MgZGVsIG1pc21vIHRpcG9cbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHN0b3JhZ2VLZXksIEpTT04uc3RyaW5naWZ5KGV2ZW50KSk7XG4gICAgICAvLyBVc2FyIHNldFRpbWVvdXQgcGFyYSBwZXJtaXRpciBxdWUgb3RyYXMgcGVzdGHDsWFzIGxlYW4gZWwgdmFsb3JcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShzdG9yYWdlS2V5KTtcbiAgICAgIH0sIDEwMCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tWYWx0ZWNoQXV0aF0gRXJyb3IgZW52aWFuZG8gZXZlbnRvIHZpYSBzdG9yYWdlJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1hbmVqYSB1biBldmVudG8gcmVjaWJpZG8uXG4gICAqL1xuICBwcml2YXRlIGhhbmRsZUV2ZW50KGV2ZW50OiBBdXRoU3luY0V2ZW50KTogdm9pZCB7XG4gICAgLy8gVmVyaWZpY2FyIHF1ZSBlbCBldmVudG8gbm8gc2VhIG11eSBhbnRpZ3VvIChtw6FzIGRlIDUgc2VndW5kb3MpXG4gICAgY29uc3QgYWdlID0gRGF0ZS5ub3coKSAtIGV2ZW50LnRpbWVzdGFtcDtcbiAgICBpZiAoYWdlID4gNTAwMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZXZlbnRTdWJqZWN0Lm5leHQoZXZlbnQpO1xuICB9XG59XG4iXX0=
@@ -2,5 +2,5 @@
2
2
  * Current version of valtech-components.
3
3
  * This is automatically updated during the publish process.
4
4
  */
5
- export const VERSION = '2.0.903';
6
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvdmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDdXJyZW50IHZlcnNpb24gb2YgdmFsdGVjaC1jb21wb25lbnRzLlxuICogVGhpcyBpcyBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgZHVyaW5nIHRoZSBwdWJsaXNoIHByb2Nlc3MuXG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gJzIuMC45MDMnO1xuIl19
5
+ export const VERSION = '2.0.904';
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvdmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDdXJyZW50IHZlcnNpb24gb2YgdmFsdGVjaC1jb21wb25lbnRzLlxuICogVGhpcyBpcyBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgZHVyaW5nIHRoZSBwdWJsaXNoIHByb2Nlc3MuXG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gJzIuMC45MDQnO1xuIl19
@@ -53,7 +53,7 @@ import 'prismjs/components/prism-json';
53
53
  * Current version of valtech-components.
54
54
  * This is automatically updated during the publish process.
55
55
  */
56
- const VERSION = '2.0.903';
56
+ const VERSION = '2.0.904';
57
57
 
58
58
  /**
59
59
  * Servicio para gestionar presets de componentes.
@@ -21912,7 +21912,7 @@ class AuthStorageService {
21912
21912
  constructor(config, platformId) {
21913
21913
  this.config = config;
21914
21914
  this.isBrowser = isPlatformBrowser(platformId);
21915
- const prefix = this.config.storagePrefix || 'valtech_auth_';
21915
+ const prefix = this.config?.storagePrefix || 'valtech_auth_';
21916
21916
  this.keys = {
21917
21917
  ACCESS_TOKEN: `${prefix}access_token`,
21918
21918
  REFRESH_TOKEN: `${prefix}refresh_token`,
@@ -22092,7 +22092,7 @@ class AuthSyncService {
22092
22092
  /** Observable de eventos de sincronización */
22093
22093
  this.onEvent$ = this.eventSubject.asObservable();
22094
22094
  this.isBrowser = isPlatformBrowser(platformId);
22095
- const prefix = this.config.storagePrefix || 'valtech_auth_';
22095
+ const prefix = this.config?.storagePrefix || 'valtech_auth_';
22096
22096
  this.channelName = `${prefix}sync_channel`;
22097
22097
  }
22098
22098
  /**
@@ -22100,7 +22100,7 @@ class AuthSyncService {
22100
22100
  * SSR-noop — sync de pestañas solo aplica en browser.
22101
22101
  */
22102
22102
  start() {
22103
- if (!this.config.enableTabSync || !this.isBrowser) {
22103
+ if (!this.config?.enableTabSync || !this.isBrowser) {
22104
22104
  return;
22105
22105
  }
22106
22106
  // Intentar usar BroadcastChannel API (mejor rendimiento)
@@ -22129,7 +22129,7 @@ class AuthSyncService {
22129
22129
  * Envía un evento a otras pestañas.
22130
22130
  */
22131
22131
  broadcast(event) {
22132
- if (!this.config.enableTabSync || !this.isBrowser) {
22132
+ if (!this.config?.enableTabSync || !this.isBrowser) {
22133
22133
  return;
22134
22134
  }
22135
22135
  const fullEvent = {
@@ -22173,7 +22173,7 @@ class AuthSyncService {
22173
22173
  * Inicializa fallback con storage events.
22174
22174
  */
22175
22175
  initStorageEvents() {
22176
- const storageKey = `${this.config.storagePrefix}sync_event`;
22176
+ const storageKey = `${this.config?.storagePrefix}sync_event`;
22177
22177
  this.storageListener = (event) => {
22178
22178
  if (event.key === storageKey && event.newValue) {
22179
22179
  try {
@@ -22191,7 +22191,7 @@ class AuthSyncService {
22191
22191
  * Envía evento via localStorage (fallback).
22192
22192
  */
22193
22193
  broadcastViaStorage(event) {
22194
- const storageKey = `${this.config.storagePrefix}sync_event`;
22194
+ const storageKey = `${this.config?.storagePrefix}sync_event`;
22195
22195
  try {
22196
22196
  // Escribir y luego limpiar para permitir múltiples eventos del mismo tipo
22197
22197
  localStorage.setItem(storageKey, JSON.stringify(event));
@@ -25273,7 +25273,7 @@ class OAuthService {
25273
25273
  return new Observable(observer => {
25274
25274
  // Construir URL de inicio
25275
25275
  const redirectUri = `${window.location.origin}/auth/oauth/callback`;
25276
- const startUrl = `${this.config.apiUrl}/v2/auth/oauth/${provider}/start?redirect_uri=${encodeURIComponent(redirectUri)}`;
25276
+ const startUrl = `${this.config?.apiUrl}/v2/auth/oauth/${provider}/start?redirect_uri=${encodeURIComponent(redirectUri)}`;
25277
25277
  // Abrir popup centrado
25278
25278
  const width = 500;
25279
25279
  const height = 600;
@@ -25378,7 +25378,7 @@ class OAuthService {
25378
25378
  startLinkFlow(provider) {
25379
25379
  return new Observable(observer => {
25380
25380
  const redirectUri = `${window.location.origin}/auth/oauth/callback`;
25381
- const startUrl = `${this.config.apiUrl}/v2/auth/oauth/link/${provider}/start?redirect_uri=${encodeURIComponent(redirectUri)}`;
25381
+ const startUrl = `${this.config?.apiUrl}/v2/auth/oauth/link/${provider}/start?redirect_uri=${encodeURIComponent(redirectUri)}`;
25382
25382
  const width = 500;
25383
25383
  const height = 600;
25384
25384
  const left = window.screenX + (window.outerWidth - width) / 2;
@@ -25429,7 +25429,7 @@ class OAuthService {
25429
25429
  */
25430
25430
  getLinkedProviders() {
25431
25431
  return this.http
25432
- .get(`${this.config.apiUrl}/v2/auth/oauth/providers`)
25432
+ .get(`${this.config?.apiUrl}/v2/auth/oauth/providers`)
25433
25433
  .pipe(catchError(error => throwError(() => ({
25434
25434
  code: error.error?.code || 'FETCH_ERROR',
25435
25435
  message: error.error?.message || 'Error al obtener proveedores vinculados',
@@ -25440,7 +25440,7 @@ class OAuthService {
25440
25440
  */
25441
25441
  unlinkProvider(provider) {
25442
25442
  return this.http
25443
- .post(`${this.config.apiUrl}/v2/auth/oauth/unlink`, { provider })
25443
+ .post(`${this.config?.apiUrl}/v2/auth/oauth/unlink`, { provider })
25444
25444
  .pipe(catchError(error => throwError(() => ({
25445
25445
  code: error.error?.code || 'UNLINK_ERROR',
25446
25446
  message: error.error?.message || 'Error al desvincular proveedor',
@@ -25451,7 +25451,7 @@ class OAuthService {
25451
25451
  */
25452
25452
  setPassword(password) {
25453
25453
  return this.http
25454
- .post(`${this.config.apiUrl}/v2/auth/oauth/set-password`, { password })
25454
+ .post(`${this.config?.apiUrl}/v2/auth/oauth/set-password`, { password })
25455
25455
  .pipe(catchError(error => throwError(() => ({
25456
25456
  code: error.error?.code || 'SET_PASSWORD_ERROR',
25457
25457
  message: error.error?.message || 'Error al establecer contraseña',
@@ -25462,7 +25462,7 @@ class OAuthService {
25462
25462
  */
25463
25463
  hasPassword() {
25464
25464
  return this.http
25465
- .get(`${this.config.apiUrl}/v2/auth/oauth/has-password`)
25465
+ .get(`${this.config?.apiUrl}/v2/auth/oauth/has-password`)
25466
25466
  .pipe(catchError(error => throwError(() => ({
25467
25467
  code: error.error?.code || 'CHECK_PASSWORD_ERROR',
25468
25468
  message: error.error?.message || 'Error al verificar contraseña',
@@ -25873,7 +25873,7 @@ class AuthService {
25873
25873
  }
25874
25874
  }
25875
25875
  // 5. Iniciar sincronización entre pestañas
25876
- if (this.config.enableTabSync) {
25876
+ if (this.config?.enableTabSync) {
25877
25877
  this.syncService.start();
25878
25878
  this.syncSubscription = this.syncService.onEvent$.subscribe(event => this.handleSyncEvent(event));
25879
25879
  }
@@ -26106,7 +26106,7 @@ class AuthService {
26106
26106
  this.stateService.updateRefreshToken(response.refreshToken); // NUEVO: guardar refresh rotado
26107
26107
  this.storageService.saveAccessToken(response.accessToken, expiresAt);
26108
26108
  this.storageService.saveRefreshToken(response.refreshToken); // NUEVO: persistir refresh rotado
26109
- if (this.config.enableFirebaseIntegration && response.firebaseToken) {
26109
+ if (this.config?.enableFirebaseIntegration && response.firebaseToken) {
26110
26110
  this.signInWithFirebase(response.firebaseToken);
26111
26111
  }
26112
26112
  this.startRefreshTimer();
@@ -26192,7 +26192,7 @@ class AuthService {
26192
26192
  this.signOutFirebase();
26193
26193
  this.clearState();
26194
26194
  this.syncService.broadcast({ type: 'LOGOUT' });
26195
- this.router.navigate([this.config.loginRoute]);
26195
+ this.router.navigate([this.config?.loginRoute]);
26196
26196
  }
26197
26197
  // =============================================
26198
26198
  // MFA SETUP (usuario autenticado)
@@ -26407,7 +26407,7 @@ class AuthService {
26407
26407
  this.signOutFirebase();
26408
26408
  this.clearState();
26409
26409
  this.syncService.broadcast({ type: 'LOGOUT' });
26410
- this.router.navigate([this.config.loginRoute]);
26410
+ this.router.navigate([this.config?.loginRoute]);
26411
26411
  }
26412
26412
  }), catchError(error => this.handleAuthError(error)));
26413
26413
  }
@@ -26484,11 +26484,11 @@ class AuthService {
26484
26484
  // PRIVATE METHODS
26485
26485
  // =============================================
26486
26486
  get baseUrl() {
26487
- return `${this.config.apiUrl}${this.config.authPrefix}`;
26487
+ return `${this.config?.apiUrl}${this.config?.authPrefix}`;
26488
26488
  }
26489
26489
  /** Base for /v2/users endpoints (separate from /v2/auth). */
26490
26490
  get usersBaseUrl() {
26491
- return `${this.config.apiUrl}/v2/users`;
26491
+ return `${this.config?.apiUrl}/v2/users`;
26492
26492
  }
26493
26493
  handleSuccessfulAuth(response) {
26494
26494
  const expiresAt = Date.now() + response.expiresIn * 1000;
@@ -26521,18 +26521,18 @@ class AuthService {
26521
26521
  this.syncService.broadcast({ type: 'LOGIN' });
26522
26522
  // Integración con Firebase
26523
26523
  console.log('[ValtechAuth] handleSuccessfulAuth - Firebase check:', {
26524
- enableFirebaseIntegration: this.config.enableFirebaseIntegration,
26524
+ enableFirebaseIntegration: this.config?.enableFirebaseIntegration,
26525
26525
  hasFirebaseTokenKey: 'firebaseToken' in response,
26526
26526
  firebaseTokenValue: !!response.firebaseToken,
26527
26527
  firebaseTokenLength: response.firebaseToken?.length || 0,
26528
26528
  });
26529
- if (this.config.enableFirebaseIntegration &&
26529
+ if (this.config?.enableFirebaseIntegration &&
26530
26530
  'firebaseToken' in response &&
26531
26531
  response.firebaseToken) {
26532
26532
  console.log('[ValtechAuth] Calling signInWithFirebase with token length:', response.firebaseToken.length);
26533
26533
  this.signInWithFirebase(response.firebaseToken);
26534
26534
  }
26535
- else if (this.config.enableFirebaseIntegration) {
26535
+ else if (this.config?.enableFirebaseIntegration) {
26536
26536
  // El login NO trajo firebaseToken (ej. flujo OAuth que lo perdió). En vez
26537
26537
  // de quedar sin sesión de Firebase, recurrimos al fallback self-healing:
26538
26538
  // /refresh sí devuelve un firebaseToken confiable.
@@ -26543,7 +26543,7 @@ class AuthService {
26543
26543
  console.log('[ValtechAuth] Firebase signin skipped - integración Firebase desactivada');
26544
26544
  }
26545
26545
  // Registro automático de dispositivo para push notifications
26546
- if (this.config.enableDeviceRegistration) {
26546
+ if (this.config?.enableDeviceRegistration) {
26547
26547
  this.registerDeviceIfNeeded(); // fire-and-forget
26548
26548
  }
26549
26549
  // Sincronizar idioma del usuario con i18n
@@ -26595,7 +26595,7 @@ class AuthService {
26595
26595
  const state = this.stateService.state();
26596
26596
  if (!state.expiresAt)
26597
26597
  return;
26598
- const refreshBeforeMs = (this.config.refreshBeforeExpiry || 60) * 1000;
26598
+ const refreshBeforeMs = (this.config?.refreshBeforeExpiry || 60) * 1000;
26599
26599
  const refreshAt = state.expiresAt - refreshBeforeMs;
26600
26600
  const delay = refreshAt - Date.now();
26601
26601
  if (delay > 0) {
@@ -26640,7 +26640,7 @@ class AuthService {
26640
26640
  case 'LOGOUT':
26641
26641
  this.stateService.reset();
26642
26642
  this.stopRefreshTimer();
26643
- this.router.navigate([this.config.loginRoute]);
26643
+ this.router.navigate([this.config?.loginRoute]);
26644
26644
  break;
26645
26645
  case 'PERMISSIONS_UPDATE': {
26646
26646
  const perms = this.storageService.loadPermissions();
@@ -26686,7 +26686,7 @@ class AuthService {
26686
26686
  }
26687
26687
  }
26688
26688
  async signOutFirebase() {
26689
- if (!this.config.enableFirebaseIntegration)
26689
+ if (!this.config?.enableFirebaseIntegration)
26690
26690
  return;
26691
26691
  try {
26692
26692
  if (this.firebaseService) {
@@ -26717,7 +26717,7 @@ class AuthService {
26717
26717
  * Fire-and-forget: se invoca con `void` para no demorar `initialize()`.
26718
26718
  */
26719
26719
  async ensureFirebaseSessionOnBootstrap() {
26720
- if (!this.config.enableFirebaseIntegration || !this.firebaseService)
26720
+ if (!this.config?.enableFirebaseIntegration || !this.firebaseService)
26721
26721
  return;
26722
26722
  // Dar a la persistencia IndexedDB propia de Firebase Auth una oportunidad
26723
26723
  // de auto-restaurarse (navegador normal). En una PWA standalone de iOS
@@ -26743,7 +26743,7 @@ class AuthService {
26743
26743
  * desde el debug-console qué disparó el fallback.
26744
26744
  */
26745
26745
  async reestablishFirebaseViaRefresh(reason) {
26746
- if (!this.config.enableFirebaseIntegration || !this.firebaseService)
26746
+ if (!this.config?.enableFirebaseIntegration || !this.firebaseService)
26747
26747
  return;
26748
26748
  console.log(`[FBAuth] fallback — re-estableciendo Firebase vía /refresh (motivo: ${reason})`);
26749
26749
  try {
@@ -26816,7 +26816,7 @@ class AuthService {
26816
26816
  if (token) {
26817
26817
  // Eliminar del backend
26818
26818
  await firstValueFrom(this.http
26819
- .request('DELETE', `${this.config.apiUrl}/v2/users/me/devices/by-token`, {
26819
+ .request('DELETE', `${this.config?.apiUrl}/v2/users/me/devices/by-token`, {
26820
26820
  body: { token },
26821
26821
  })
26822
26822
  .pipe(catchError(() => of(null))));
@@ -26886,7 +26886,7 @@ class AuthService {
26886
26886
  }
26887
26887
  // Registrar en backend
26888
26888
  const { platform, browser, os } = this.detectPlatformInfo();
26889
- const response = await firstValueFrom(this.http.post(`${this.config.apiUrl}/v2/users/me/devices`, {
26889
+ const response = await firstValueFrom(this.http.post(`${this.config?.apiUrl}/v2/users/me/devices`, {
26890
26890
  token,
26891
26891
  platform,
26892
26892
  browser,
@@ -26909,7 +26909,7 @@ class AuthService {
26909
26909
  */
26910
26910
  async registerDeviceIfNeeded() {
26911
26911
  // Solo si está habilitado y messaging está disponible
26912
- if (!this.config.enableDeviceRegistration || !this.messagingService) {
26912
+ if (!this.config?.enableDeviceRegistration || !this.messagingService) {
26913
26913
  return false;
26914
26914
  }
26915
26915
  try {
@@ -26929,7 +26929,7 @@ class AuthService {
26929
26929
  }
26930
26930
  // Registrar en backend
26931
26931
  const { platform, browser, os } = this.detectPlatformInfo();
26932
- await firstValueFrom(this.http.post(`${this.config.apiUrl}/v2/users/me/devices`, {
26932
+ await firstValueFrom(this.http.post(`${this.config?.apiUrl}/v2/users/me/devices`, {
26933
26933
  token,
26934
26934
  platform,
26935
26935
  browser,
@@ -26948,7 +26948,7 @@ class AuthService {
26948
26948
  * Elimina el dispositivo del backend y borra el token FCM.
26949
26949
  */
26950
26950
  async unregisterDevice() {
26951
- if (!this.config.enableDeviceRegistration || !this.messagingService) {
26951
+ if (!this.config?.enableDeviceRegistration || !this.messagingService) {
26952
26952
  return;
26953
26953
  }
26954
26954
  try {
@@ -26956,7 +26956,7 @@ class AuthService {
26956
26956
  if (token) {
26957
26957
  // Delete from backend (fire and forget)
26958
26958
  this.http
26959
- .request('DELETE', `${this.config.apiUrl}/v2/users/me/devices/by-token`, {
26959
+ .request('DELETE', `${this.config?.apiUrl}/v2/users/me/devices/by-token`, {
26960
26960
  body: { token },
26961
26961
  })
26962
26962
  .pipe(catchError(() => of(null)))
@@ -30199,7 +30199,7 @@ class DeviceService {
30199
30199
  this.http = http;
30200
30200
  }
30201
30201
  get baseUrl() {
30202
- return `${this.config.apiUrl}/v2/users/me/devices`;
30202
+ return `${this.config?.apiUrl}/v2/users/me/devices`;
30203
30203
  }
30204
30204
  /**
30205
30205
  * Lista todos los dispositivos registrados del usuario.
@@ -30254,7 +30254,7 @@ class DeviceService {
30254
30254
  * ```
30255
30255
  */
30256
30256
  validateAction(token) {
30257
- return this.http.post(`${this.config.apiUrl}/v2/actions/validate`, { token });
30257
+ return this.http.post(`${this.config?.apiUrl}/v2/actions/validate`, { token });
30258
30258
  }
30259
30259
  /**
30260
30260
  * Ejecuta una acción de dispositivo desde un token de email.
@@ -30277,7 +30277,7 @@ class DeviceService {
30277
30277
  */
30278
30278
  executeAction(token) {
30279
30279
  // Usa el endpoint unificado de acciones
30280
- return this.http.post(`${this.config.apiUrl}/v2/actions/execute`, { token }).pipe(map$1(response => ({
30280
+ return this.http.post(`${this.config?.apiUrl}/v2/actions/execute`, { token }).pipe(map$1(response => ({
30281
30281
  operationId: response.operationId,
30282
30282
  success: response.success,
30283
30283
  message: response.message,
@@ -30336,7 +30336,7 @@ class SessionService {
30336
30336
  this.http = http;
30337
30337
  }
30338
30338
  get baseUrl() {
30339
- return `${this.config.apiUrl}/v2/users/me/sessions`;
30339
+ return `${this.config?.apiUrl}/v2/users/me/sessions`;
30340
30340
  }
30341
30341
  /**
30342
30342
  * Lista todas las sesiones activas del usuario.
@@ -30659,7 +30659,7 @@ class HandoffService {
30659
30659
  const tokenParam = options.tokenParam ?? HANDOFF_TOKEN_PARAM;
30660
30660
  const routeParam = options.routeParam ?? HANDOFF_ROUTE_PARAM;
30661
30661
  const defaultRoute = options.defaultRoute ?? '/';
30662
- const errorRoute = options.errorRoute ?? this.config.loginRoute ?? '/login';
30662
+ const errorRoute = options.errorRoute ?? this.config?.loginRoute ?? '/login';
30663
30663
  const params = new URLSearchParams(window.location.search);
30664
30664
  const token = params.get(tokenParam);
30665
30665
  if (!token) {
@@ -30689,7 +30689,7 @@ class HandoffService {
30689
30689
  });
30690
30690
  }
30691
30691
  get baseUrl() {
30692
- return `${this.config.apiUrl}${this.config.authPrefix}`;
30692
+ return `${this.config?.apiUrl}${this.config?.authPrefix}`;
30693
30693
  }
30694
30694
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: HandoffService, deps: [{ token: VALTECH_AUTH_CONFIG, optional: true }, { token: i1$8.HttpClient }, { token: AuthService }, { token: i1$1.Router }], target: i0.ɵɵFactoryTarget.Injectable }); }
30695
30695
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: HandoffService, providedIn: 'root' }); }
@@ -30877,7 +30877,7 @@ class NotificationActionService {
30877
30877
  if (!route) {
30878
30878
  return 'no-action-route';
30879
30879
  }
30880
- const currentApp = this.config.appId;
30880
+ const currentApp = this.config?.appId;
30881
30881
  const targetApp = notif.appId;
30882
30882
  // 2) Cross-app: handoff + full redirect
30883
30883
  //
@@ -30887,7 +30887,7 @@ class NotificationActionService {
30887
30887
  if (targetApp && currentApp && targetApp !== currentApp) {
30888
30888
  try {
30889
30889
  const resp = await firstValueFrom(this.handoff.createHandoff({ targetAppId: targetApp, route }));
30890
- const baseUrl = resp.targetBaseUrl ?? this.config.appUrls?.[targetApp];
30890
+ const baseUrl = resp.targetBaseUrl ?? this.config?.appUrls?.[targetApp];
30891
30891
  if (!baseUrl) {
30892
30892
  console.warn(`[NotificationAction] No baseUrl for app '${targetApp}' — backend did not return targetBaseUrl and no appUrls fallback configured`);
30893
30893
  return 'cross-app-unconfigured';