@cuby-ui/core 0.0.296 → 0.0.298

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.
@@ -6,12 +6,12 @@ export class CuiAuthBase extends CuiTokenBase {
6
6
  return super.createLoginUrl(state, loginHint, customRedirectUri, noPrompt, params);
7
7
  }
8
8
  async useCheckTokenFlow(loginCallback) {
9
- const isExpired = this.checkIsTokenExpired();
10
- const isRefreshTokenExist = this.getRefreshToken();
11
- if (!isRefreshTokenExist) {
9
+ const isAccessTokenExpired = this.checkIsTokenExpired();
10
+ const isRefreshTokenExpired = this.checkIsRefreshTokenExpired();
11
+ if (isRefreshTokenExpired) {
12
12
  return loginCallback();
13
13
  }
14
- if (!isExpired) {
14
+ if (!isAccessTokenExpired) {
15
15
  return;
16
16
  }
17
17
  return await this.refreshToken();
@@ -28,4 +28,4 @@ export class CuiAuthBase extends CuiTokenBase {
28
28
  });
29
29
  }
30
30
  }
31
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZS9zZXJ2aWNlcy9hdXRoLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBaUIsTUFBTSxxQkFBcUIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzlCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUUvQyxNQUFNLE9BQU8sV0FBWSxTQUFRLFlBQVk7SUFDekIsY0FBYyxDQUFDLEtBQWMsRUFBRSxTQUFrQixFQUFFLGlCQUEwQixFQUFFLFFBQWtCLEVBQUUsTUFBZTtRQUM5SCxPQUFPLEtBQUssQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDdkYsQ0FBQztJQUVNLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxhQUF5QjtRQUNwRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUM3QyxNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUVuRCxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUN2QixPQUFPLGFBQWEsRUFBRSxDQUFDO1FBQzNCLENBQUM7UUFFRCxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDYixPQUFPO1FBQ1gsQ0FBQztRQUVELE9BQU8sTUFBTSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDckMsQ0FBQztJQUVNLHFCQUFxQixDQUFDLGFBQXlCO1FBQ2xELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxZQUFZLGNBQWMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDckYsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLGVBQWUsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLGNBQWMsRUFBRSxDQUFDO2dCQUNsRSxPQUFPO1lBQ1gsQ0FBQztZQUVELElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsRUFBRSxDQUFDO2dCQUN6RCxPQUFPLGFBQWEsRUFBRSxDQUFDO1lBQzNCLENBQUM7WUFFRCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDeEIsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPQXV0aEluZm9FdmVudCwgVG9rZW5SZXNwb25zZSB9IGZyb20gJ2FuZ3VsYXItb2F1dGgyLW9pZGMnO1xuaW1wb3J0IHsgZmlsdGVyIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBDdWlUb2tlbkJhc2UgfSBmcm9tICcuL3Rva2VuLnNlcnZpY2UnO1xuXG5leHBvcnQgY2xhc3MgQ3VpQXV0aEJhc2UgZXh0ZW5kcyBDdWlUb2tlbkJhc2Uge1xuICAgIHB1YmxpYyBvdmVycmlkZSBjcmVhdGVMb2dpblVybChzdGF0ZT86IHN0cmluZywgbG9naW5IaW50Pzogc3RyaW5nLCBjdXN0b21SZWRpcmVjdFVyaT86IHN0cmluZywgbm9Qcm9tcHQ/OiBib29sZWFuLCBwYXJhbXM/OiBvYmplY3QpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICByZXR1cm4gc3VwZXIuY3JlYXRlTG9naW5Vcmwoc3RhdGUsIGxvZ2luSGludCwgY3VzdG9tUmVkaXJlY3RVcmksIG5vUHJvbXB0LCBwYXJhbXMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyB1c2VDaGVja1Rva2VuRmxvdyhsb2dpbkNhbGxiYWNrOiAoKSA9PiB2b2lkKTogUHJvbWlzZTxUb2tlblJlc3BvbnNlIHwgdm9pZD4ge1xuICAgICAgICBjb25zdCBpc0V4cGlyZWQgPSB0aGlzLmNoZWNrSXNUb2tlbkV4cGlyZWQoKTtcbiAgICAgICAgY29uc3QgaXNSZWZyZXNoVG9rZW5FeGlzdCA9IHRoaXMuZ2V0UmVmcmVzaFRva2VuKCk7XG5cbiAgICAgICAgaWYgKCFpc1JlZnJlc2hUb2tlbkV4aXN0KSB7XG4gICAgICAgICAgICByZXR1cm4gbG9naW5DYWxsYmFjaygpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc0V4cGlyZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJlZnJlc2hUb2tlbigpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpbml0QXV0aFJlZnJlc2hFdmVudHMobG9naW5DYWxsYmFjazogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgICAgICB0aGlzLmV2ZW50cy5waXBlKGZpbHRlcigoZXZlbnQpID0+IGV2ZW50IGluc3RhbmNlb2YgT0F1dGhJbmZvRXZlbnQpKS5zdWJzY3JpYmUoKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAoZXZlbnQudHlwZSAhPT0gJ3Rva2VuX2V4cGlyZXMnIHx8IGV2ZW50LmluZm8gIT09ICdhY2Nlc3NfdG9rZW4nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIXRoaXMuaGFzVmFsaWRBY2Nlc3NUb2tlbigpIHx8ICF0aGlzLmdldFJlZnJlc2hUb2tlbigpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxvZ2luQ2FsbGJhY2soKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5yZWZyZXNoVG9rZW4oKTtcbiAgICAgICAgfSk7XG4gICAgfVxufSJdfQ==
31
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZS9zZXJ2aWNlcy9hdXRoLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBaUIsTUFBTSxxQkFBcUIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzlCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUUvQyxNQUFNLE9BQU8sV0FBWSxTQUFRLFlBQVk7SUFDekIsY0FBYyxDQUFDLEtBQWMsRUFBRSxTQUFrQixFQUFFLGlCQUEwQixFQUFFLFFBQWtCLEVBQUUsTUFBZTtRQUM5SCxPQUFPLEtBQUssQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDdkYsQ0FBQztJQUVNLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxhQUF5QjtRQUNwRCxNQUFNLG9CQUFvQixHQUFHLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQ3hELE1BQU0scUJBQXFCLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7UUFFaEUsSUFBSSxxQkFBcUIsRUFBRSxDQUFDO1lBQ3hCLE9BQU8sYUFBYSxFQUFFLENBQUM7UUFDM0IsQ0FBQztRQUVELElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1lBQ3hCLE9BQU87UUFDWCxDQUFDO1FBRUQsT0FBTyxNQUFNLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUNyQyxDQUFDO0lBRU0scUJBQXFCLENBQUMsYUFBeUI7UUFDbEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLFlBQVksY0FBYyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNyRixJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssZUFBZSxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssY0FBYyxFQUFFLENBQUM7Z0JBQ2xFLE9BQU87WUFDWCxDQUFDO1lBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxFQUFFLENBQUM7Z0JBQ3pELE9BQU8sYUFBYSxFQUFFLENBQUM7WUFDM0IsQ0FBQztZQUVELElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN4QixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9BdXRoSW5mb0V2ZW50LCBUb2tlblJlc3BvbnNlIH0gZnJvbSAnYW5ndWxhci1vYXV0aDItb2lkYyc7XG5pbXBvcnQgeyBmaWx0ZXIgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEN1aVRva2VuQmFzZSB9IGZyb20gJy4vdG9rZW4uc2VydmljZSc7XG5cbmV4cG9ydCBjbGFzcyBDdWlBdXRoQmFzZSBleHRlbmRzIEN1aVRva2VuQmFzZSB7XG4gICAgcHVibGljIG92ZXJyaWRlIGNyZWF0ZUxvZ2luVXJsKHN0YXRlPzogc3RyaW5nLCBsb2dpbkhpbnQ/OiBzdHJpbmcsIGN1c3RvbVJlZGlyZWN0VXJpPzogc3RyaW5nLCBub1Byb21wdD86IGJvb2xlYW4sIHBhcmFtcz86IG9iamVjdCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiBzdXBlci5jcmVhdGVMb2dpblVybChzdGF0ZSwgbG9naW5IaW50LCBjdXN0b21SZWRpcmVjdFVyaSwgbm9Qcm9tcHQsIHBhcmFtcyk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHVzZUNoZWNrVG9rZW5GbG93KGxvZ2luQ2FsbGJhY2s6ICgpID0+IHZvaWQpOiBQcm9taXNlPFRva2VuUmVzcG9uc2UgfCB2b2lkPiB7XG4gICAgICAgIGNvbnN0IGlzQWNjZXNzVG9rZW5FeHBpcmVkID0gdGhpcy5jaGVja0lzVG9rZW5FeHBpcmVkKCk7XG4gICAgICAgIGNvbnN0IGlzUmVmcmVzaFRva2VuRXhwaXJlZCA9IHRoaXMuY2hlY2tJc1JlZnJlc2hUb2tlbkV4cGlyZWQoKTtcblxuICAgICAgICBpZiAoaXNSZWZyZXNoVG9rZW5FeHBpcmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gbG9naW5DYWxsYmFjaygpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc0FjY2Vzc1Rva2VuRXhwaXJlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucmVmcmVzaFRva2VuKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGluaXRBdXRoUmVmcmVzaEV2ZW50cyhsb2dpbkNhbGxiYWNrOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZXZlbnRzLnBpcGUoZmlsdGVyKChldmVudCkgPT4gZXZlbnQgaW5zdGFuY2VvZiBPQXV0aEluZm9FdmVudCkpLnN1YnNjcmliZSgoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGlmIChldmVudC50eXBlICE9PSAndG9rZW5fZXhwaXJlcycgfHwgZXZlbnQuaW5mbyAhPT0gJ2FjY2Vzc190b2tlbicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5oYXNWYWxpZEFjY2Vzc1Rva2VuKCkgfHwgIXRoaXMuZ2V0UmVmcmVzaFRva2VuKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbG9naW5DYWxsYmFjaygpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hUb2tlbigpO1xuICAgICAgICB9KTtcbiAgICB9XG59Il19
@@ -1,19 +1,43 @@
1
1
  import { inject, signal } from '@angular/core';
2
2
  import { CuiExchangeContextApiService } from '@cuby-ui/api';
3
3
  import { OAuthErrorEvent, OAuthService, OAuthSuccessEvent } from 'angular-oauth2-oidc';
4
- import { from, map, of, switchMap, tap } from 'rxjs';
4
+ import { catchError, from, map, of, switchMap, tap, throwError } from 'rxjs';
5
5
  class CuiToken extends OAuthService {
6
6
  constructor() {
7
7
  super(...arguments);
8
8
  this.tokenData = signal({});
9
9
  }
10
+ getRefreshTokenExpiration() {
11
+ return this.getTokenDataFromStore(this.getRefreshToken()).expires_in;
12
+ }
13
+ getAccessTokenData() {
14
+ const token = this.getAccessToken();
15
+ if (!token) {
16
+ throw new Error('No access token found');
17
+ }
18
+ return this.getTokenDataFromStore(token);
19
+ }
20
+ checkIsTokenExpired() {
21
+ const token = this.getAccessToken();
22
+ if (!token) {
23
+ return true;
24
+ }
25
+ return this.checkTokenExpired(this.getAccessTokenExpiration());
26
+ }
27
+ checkIsRefreshTokenExpired() {
28
+ const token = this.getRefreshToken();
29
+ if (!token) {
30
+ return true;
31
+ }
32
+ return this.checkTokenExpired(this.getRefreshTokenExpiration());
33
+ }
10
34
  getTokenDataFromStore(token) {
11
35
  const tokenData = this.tokenData()[token];
12
36
  if (tokenData) {
13
37
  return tokenData;
14
38
  }
15
39
  const currentTokenData = this.parseToken(token);
16
- this.tokenData.set({ [token]: currentTokenData });
40
+ this.tokenData.update((prev) => ({ ...prev, [token]: currentTokenData }));
17
41
  return currentTokenData;
18
42
  }
19
43
  parseToken(token) {
@@ -26,6 +50,10 @@ class CuiToken extends OAuthService {
26
50
  throw new Error('Invalid token');
27
51
  }
28
52
  }
53
+ checkTokenExpired(expiredTime) {
54
+ const currentTime = Date.now();
55
+ return currentTime >= expiredTime;
56
+ }
29
57
  }
30
58
  export class CuiTokenBase extends CuiToken {
31
59
  constructor() {
@@ -33,43 +61,16 @@ export class CuiTokenBase extends CuiToken {
33
61
  this.exchangeContextApiService = inject(CuiExchangeContextApiService);
34
62
  this.EXCHANGE_TOKEN_VALUE = 'employee_session';
35
63
  }
36
- getAccessTokenData() {
37
- const token = this.getAccessToken();
38
- if (!token) {
39
- throw new Error('No access token found');
40
- }
41
- return this.getTokenDataFromStore(token);
42
- }
43
- checkIsTokenExpired() {
44
- const token = this.getAccessToken();
45
- if (!token) {
46
- return true;
47
- }
48
- const expiredTime = this.getAccessTokenExpiration();
49
- const currentTime = Date.now();
50
- return currentTime >= expiredTime;
51
- }
52
- exchangeToken(params) {
53
- return new Promise((resolve, reject) => this.exchangeContextApiService
54
- .exchange(params)
55
- .pipe(switchMap((tokenResponse) => this.setIdToken(tokenResponse)))
56
- .subscribe({
57
- next: (tokenResponse) => {
58
- this.setTokenResponse(tokenResponse);
59
- resolve(tokenResponse);
60
- },
61
- error: (error) => {
62
- this.logger.error('Error exchanging token', error);
63
- this.eventsSubject.next(new OAuthErrorEvent('token_refresh_error', error));
64
- reject(error);
65
- }
66
- }));
67
- }
68
64
  // TODO: override refreshToken with custom refresh token request to the backend
69
65
  refreshToken() {
70
- const tokenData = this.getAccessTokenData();
71
- if (this.EXCHANGE_TOKEN_VALUE in tokenData) {
72
- return this.refreshExchangedToken();
66
+ try {
67
+ const tokenData = this.getAccessTokenData();
68
+ if (this.EXCHANGE_TOKEN_VALUE in tokenData) {
69
+ return this.refreshExchangedToken();
70
+ }
71
+ }
72
+ catch (error) {
73
+ this.logger.error('Error refreshing token', error);
73
74
  }
74
75
  return super.refreshToken();
75
76
  }
@@ -89,6 +90,13 @@ export class CuiTokenBase extends CuiToken {
89
90
  }
90
91
  }));
91
92
  }
93
+ exchangeToken(params) {
94
+ return this.exchangeContextApiService.exchange(params).pipe(switchMap((tokenResponse) => this.setIdToken(tokenResponse)), tap((tokenResponse) => this.setTokenResponse(tokenResponse)), catchError((error) => {
95
+ this.logger.error('Error exchanging token', error);
96
+ this.eventsSubject.next(new OAuthErrorEvent('token_refresh_error', error));
97
+ return throwError(() => error);
98
+ }));
99
+ }
92
100
  setTokenResponse(tokenResponse) {
93
101
  const expiresIn = tokenResponse.expires_in || this.fallbackAccessTokenExpirationTimeInSec;
94
102
  this.debug('tokenResponse', tokenResponse);
@@ -103,4 +111,4 @@ export class CuiTokenBase extends CuiToken {
103
111
  return from(this.processIdToken(tokenResponse.id_token, tokenResponse.access_token, true)).pipe(tap((result) => this.storeIdToken(result)), map(() => tokenResponse));
104
112
  }
105
113
  }
106
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmUvc2VydmljZXMvdG9rZW4uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvQyxPQUFPLEVBQUUsNEJBQTRCLEVBQStCLE1BQU0sY0FBYyxDQUFDO0FBRXpGLE9BQU8sRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLGlCQUFpQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFdkYsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFckQsTUFBZSxRQUFTLFNBQVEsWUFBWTtJQUE1Qzs7UUFDcUIsY0FBUyxHQUFHLE1BQU0sQ0FBbUMsRUFBRSxDQUFDLENBQUM7SUEwQjlFLENBQUM7SUF4QmEscUJBQXFCLENBQUMsS0FBYTtRQUN6QyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFMUMsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNaLE9BQU8sU0FBUyxDQUFDO1FBQ3JCLENBQUM7UUFFRCxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFaEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLGdCQUFnQixFQUFFLENBQUMsQ0FBQztRQUVsRCxPQUFPLGdCQUFnQixDQUFDO0lBQzVCLENBQUM7SUFFTyxVQUFVLENBQUMsS0FBYTtRQUM1QixJQUFJLENBQUM7WUFDRCxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RDLE1B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SSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDeEMsT0FBTyxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDN0IsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRSxhQUFhLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUMzRixHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsRUFDMUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLGFBQWEsQ0FBQyxDQUMzQixDQUFDO0lBQ04sQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5qZWN0LCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEN1aUV4Y2hhbmdlQ29udGV4dEFwaVNlcnZpY2UsIEN1aVRva2VuRXhjaGFuZ2VSZXF1ZXN0Qm9keSB9IGZyb20gJ0BjdWJ5LXVpL2FwaSc7XG5pbXBvcnQgdHlwZSB7IFRva2VuUmVzcG9uc2UgfSBmcm9tICdhbmd1bGFyLW9hdXRoMi1vaWRjJztcbmltcG9ydCB7IE9BdXRoRXJyb3JFdmVudCwgT0F1dGhTZXJ2aWNlLCBPQXV0aFN1Y2Nlc3NFdmVudCB9IGZyb20gJ2FuZ3VsYXItb2F1dGgyLW9pZGMnO1xuaW1wb3J0IHR5cGUgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmcm9tLCBtYXAsIG9mLCBzd2l0Y2hNYXAsIHRhcCB9IGZyb20gJ3J4anMnO1xuXG5hYnN0cmFjdCBjbGFzcyBDdWlUb2tlbiBleHRlbmRzIE9BdXRoU2VydmljZSB7XG4gICAgcHJpdmF0ZSByZWFkb25seSB0b2tlbkRhdGEgPSBzaWduYWw8eyBba2V5OiBzdHJpbmddOiBUb2tlblJlc3BvbnNlIH0+KHt9KTtcblxuICAgIHByb3RlY3RlZCBnZXRUb2tlbkRhdGFGcm9tU3RvcmUodG9rZW46IHN0cmluZyk6IFRva2VuUmVzcG9uc2Uge1xuICAgICAgICBjb25zdCB0b2tlbkRhdGEgPSB0aGlzLnRva2VuRGF0YSgpW3Rva2VuXTtcblxuICAgICAgICBpZiAodG9rZW5EYXRhKSB7XG4gICAgICAgICAgICByZXR1cm4gdG9rZW5EYXRhO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY3VycmVudFRva2VuRGF0YSA9IHRoaXMucGFyc2VUb2tlbih0b2tlbik7XG5cbiAgICAgICAgdGhpcy50b2tlbkRhdGEuc2V0KHsgW3Rva2VuXTogY3VycmVudFRva2VuRGF0YSB9KTtcblxuICAgICAgICByZXR1cm4gY3VycmVudFRva2VuRGF0YTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHBhcnNlVG9rZW4odG9rZW46IHN0cmluZyk6IFRva2VuUmVzcG9uc2Uge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgYmFzZTY0VXJsID0gdG9rZW4uc3BsaXQoJy4nKVsxXTtcbiAgICAgICAgICAgIGNvbnN0IGJhc2U2NCA9IGJhc2U2NFVybC5yZXBsYWNlKC8tL2csICcrJykucmVwbGFjZSgvXy9nLCAnLycpO1xuXG4gICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShhdG9iKGJhc2U2NCkpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB0b2tlbicpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ3VpVG9rZW5CYXNlIGV4dGVuZHMgQ3VpVG9rZW4ge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZXhjaGFuZ2VDb250ZXh0QXBpU2VydmljZSA9IGluamVjdChDdWlFeGNoYW5nZUNvbnRleHRBcGlTZXJ2aWNlKTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgRVhDSEFOR0VfVE9LRU5fVkFMVUUgPSAnZW1wbG95ZWVfc2Vzc2lvbic7XG5cbiAgICBwdWJsaWMgZ2V0QWNjZXNzVG9rZW5EYXRhPFQgZXh0ZW5kcyBUb2tlblJlc3BvbnNlID0gVG9rZW5SZXNwb25zZT4oKTogVCB7XG4gICAgICAgIGNvbnN0IHRva2VuID0gdGhpcy5nZXRBY2Nlc3NUb2tlbigpO1xuXG4gICAgICAgIGlmICghdG9rZW4pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gYWNjZXNzIHRva2VuIGZvdW5kJyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5nZXRUb2tlbkRhdGFGcm9tU3RvcmUodG9rZW4pIGFzIFQ7XG4gICAgfVxuXG4gICAgcHVibGljIGNoZWNrSXNUb2tlbkV4cGlyZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHRva2VuID0gdGhpcy5nZXRBY2Nlc3NUb2tlbigpO1xuXG4gICAgICAgIGlmICghdG9rZW4pIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZXhwaXJlZFRpbWUgPSB0aGlzLmdldEFjY2Vzc1Rva2VuRXhwaXJhdGlvbigpO1xuICAgICAgICBjb25zdCBjdXJyZW50VGltZSA9IERhdGUubm93KCk7XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnRUaW1lID49IGV4cGlyZWRUaW1lO1xuICAgIH1cblxuICAgIHB1YmxpYyBleGNoYW5nZVRva2VuKHBhcmFtczogQ3VpVG9rZW5FeGNoYW5nZVJlcXVlc3RCb2R5KTogUHJvbWlzZTxUb2tlblJlc3BvbnNlPiB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PlxuICAgICAgICAgICAgdGhpcy5leGNoYW5nZUNvbnRleHRBcGlTZXJ2aWNlXG4gICAgICAgICAgICAgICAgLmV4Y2hhbmdlKHBhcmFtcylcbiAgICAgICAgICAgICAgICAucGlwZShzd2l0Y2hNYXAoKHRva2VuUmVzcG9uc2UpID0+IHRoaXMuc2V0SWRUb2tlbih0b2tlblJlc3BvbnNlKSkpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgICAgICAgICAgICAgIG5leHQ6ICh0b2tlblJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFRva2VuUmVzcG9uc2UodG9rZW5SZXNwb25zZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodG9rZW5SZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdFcnJvciBleGNoYW5naW5nIHRva2VuJywgZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ldmVudHNTdWJqZWN0Lm5leHQobmV3IE9BdXRoRXJyb3JFdmVudCgndG9rZW5fcmVmcmVzaF9lcnJvcicsIGVycm9yKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8vIFRPRE86IG92ZXJyaWRlIHJlZnJlc2hUb2tlbiB3aXRoIGN1c3RvbSByZWZyZXNoIHRva2VuIHJlcXVlc3QgdG8gdGhlIGJhY2tlbmRcbiAgICBwdWJsaWMgb3ZlcnJpZGUgcmVmcmVzaFRva2VuKCk6IFByb21pc2U8VG9rZW5SZXNwb25zZT4ge1xuICAgICAgICBjb25zdCB0b2tlbkRhdGEgPSB0aGlzLmdldEFjY2Vzc1Rva2VuRGF0YSgpO1xuXG4gICAgICAgIGlmICh0aGlzLkVYQ0hBTkdFX1RPS0VOX1ZBTFVFIGluIHRva2VuRGF0YSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVmcmVzaEV4Y2hhbmdlZFRva2VuKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3VwZXIucmVmcmVzaFRva2VuKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlZnJlc2hFeGNoYW5nZWRUb2tlbigpOiBQcm9taXNlPFRva2VuUmVzcG9uc2U+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+XG4gICAgICAgICAgICB0aGlzLmV4Y2hhbmdlQ29udGV4dEFwaVNlcnZpY2VcbiAgICAgICAgICAgICAgICAucmVmcmVzaCh0aGlzLmdldFJlZnJlc2hUb2tlbigpKVxuICAgICAgICAgICAgICAgIC5waXBlKHN3aXRjaE1hcCgodG9rZW5SZXNwb25zZSkgPT4gdGhpcy5zZXRJZFRva2VuKHRva2VuUmVzcG9uc2UpKSlcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgICAgICAgICAgbmV4dDogKHRva2VuUmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0VG9rZW5SZXNwb25zZSh0b2tlblJlc3BvbnNlKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0b2tlblJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0Vycm9yIHJlZnJlc2hpbmcgdG9rZW4nLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmV2ZW50c1N1YmplY3QubmV4dChuZXcgT0F1dGhFcnJvckV2ZW50KCd0b2tlbl9yZWZyZXNoX2Vycm9yJywgZXJyb3IpKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRUb2tlblJlc3BvbnNlKHRva2VuUmVzcG9uc2U6IFRva2VuUmVzcG9uc2UpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZXhwaXJlc0luID0gdG9rZW5SZXNwb25zZS5leHBpcmVzX2luIHx8IHRoaXMuZmFsbGJhY2tBY2Nlc3NUb2tlbkV4cGlyYXRpb25UaW1lSW5TZWMhO1xuXG4gICAgICAgIHRoaXMuZGVidWcoJ3Rva2VuUmVzcG9uc2UnLCB0b2tlblJlc3BvbnNlKTtcbiAgICAgICAgdGhpcy5zdG9yZUFjY2Vzc1Rva2VuUmVzcG9uc2UoXG4gICAgICAgICAgICB0b2tlblJlc3BvbnNlLmFjY2Vzc190b2tlbixcbiAgICAgICAgICAgIHRva2VuUmVzcG9uc2UucmVmcmVzaF90b2tlbixcbiAgICAgICAgICAgIGV4cGlyZXNJbixcbiAgICAgICAgICAgIHRva2VuUmVzcG9uc2Uuc2NvcGVcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLmV2ZW50c1N1YmplY3QubmV4dChuZXcgT0F1dGhTdWNjZXNzRXZlbnQoJ3Rva2VuX3JlY2VpdmVkJykpO1xuICAgICAgICB0aGlzLmV2ZW50c1N1YmplY3QubmV4dChuZXcgT0F1dGhTdWNjZXNzRXZlbnQoJ3Rva2VuX3JlZnJlc2hlZCcpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldElkVG9rZW4odG9rZW5SZXNwb25zZTogVG9rZW5SZXNwb25zZSk6IE9ic2VydmFibGU8VG9rZW5SZXNwb25zZT4ge1xuICAgICAgICBpZiAoIXRoaXMub2lkYyB8fCAhdG9rZW5SZXNwb25zZS5pZF90b2tlbikge1xuICAgICAgICAgICAgcmV0dXJuIG9mKHRva2VuUmVzcG9uc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZyb20odGhpcy5wcm9jZXNzSWRUb2tlbih0b2tlblJlc3BvbnNlLmlkX3Rva2VuLCB0b2tlblJlc3BvbnNlLmFjY2Vzc190b2tlbiwgdHJ1ZSkpLnBpcGUoXG4gICAgICAgICAgICB0YXAoKHJlc3VsdCkgPT4gdGhpcy5zdG9yZUlkVG9rZW4ocmVzdWx0KSksXG4gICAgICAgICAgICBtYXAoKCkgPT4gdG9rZW5SZXNwb25zZSlcbiAgICAgICAgKTtcbiAgICB9XG59XG4iXX0=
114
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmUvc2VydmljZXMvdG9rZW4uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUvQyxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFNUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUV2RixPQUFPLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTdFLE1BQWUsUUFBUyxTQUFRLFlBQVk7SUFBNUM7O1FBQ3FCLGNBQVMsR0FBRyxNQUFNLENBQW1DLEVBQUUsQ0FBQyxDQUFDO0lBa0U5RSxDQUFDO0lBaEVVLHlCQUF5QjtRQUM1QixPQUFPLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQyxVQUFVLENBQUM7SUFDekUsQ0FBQztJQUVNLGtCQUFrQjtRQUNyQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFFcEMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ1QsTUFBTSxJQUFJLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQU0sQ0FBQztJQUNsRCxDQUFDO0lBRU0sbUJBQW1CO1FBQ3RCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUVwQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDVCxPQUFPLElBQUksQ0FBQztRQUNo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RU8sZ0JBQWdCLENBQUMsYUFBNEI7UUFDakQsTUFBTSxTQUFTLEdBQUcsYUFBYSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsc0NBQXVDLENBQUM7UUFFM0YsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLHdCQUF3QixDQUN6QixhQUFhLENBQUMsWUFBWSxFQUMxQixhQUFhLENBQUMsYUFBYSxFQUMzQixTQUFTLEVBQ1QsYUFBYSxDQUFDLEtBQUssQ0FDdEIsQ0FBQztRQUVGLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksaUJBQWlCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO1FBQ2pFLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFFTyxVQUFVLENBQUMsYUFBNEI7UUFDM0MsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDeEMsT0FBTyxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDN0IsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRSxhQUFhLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUMzRixHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsRUFDMUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLGFBQWEsQ0FBQyxDQUMzQixDQUFDO0lBQ04sQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5qZWN0LCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB0eXBlIHsgQ3VpVG9rZW5FeGNoYW5nZVJlcXVlc3RCb2R5IH0gZnJvbSAnQGN1YnktdWkvYXBpJztcbmltcG9ydCB7IEN1aUV4Y2hhbmdlQ29udGV4dEFwaVNlcnZpY2UgfSBmcm9tICdAY3VieS11aS9hcGknO1xuaW1wb3J0IHR5cGUgeyBUb2tlblJlc3BvbnNlIH0gZnJvbSAnYW5ndWxhci1vYXV0aDItb2lkYyc7XG5pbXBvcnQgeyBPQXV0aEVycm9yRXZlbnQsIE9BdXRoU2VydmljZSwgT0F1dGhTdWNjZXNzRXZlbnQgfSBmcm9tICdhbmd1bGFyLW9hdXRoMi1vaWRjJztcbmltcG9ydCB0eXBlIHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgZnJvbSwgbWFwLCBvZiwgc3dpdGNoTWFwLCB0YXAsIHRocm93RXJyb3IgfSBmcm9tICdyeGpzJztcblxuYWJzdHJhY3QgY2xhc3MgQ3VpVG9rZW4gZXh0ZW5kcyBPQXV0aFNlcnZpY2Uge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdG9rZW5EYXRhID0gc2lnbmFsPHsgW2tleTogc3RyaW5nXTogVG9rZW5SZXNwb25zZSB9Pih7fSk7XG5cbiAgICBwdWJsaWMgZ2V0UmVmcmVzaFRva2VuRXhwaXJhdGlvbigpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRUb2tlbkRhdGFGcm9tU3RvcmUodGhpcy5nZXRSZWZyZXNoVG9rZW4oKSkuZXhwaXJlc19pbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0QWNjZXNzVG9rZW5EYXRhPFQgZXh0ZW5kcyBUb2tlblJlc3BvbnNlID0gVG9rZW5SZXNwb25zZT4oKTogVCB7XG4gICAgICAgIGNvbnN0IHRva2VuID0gdGhpcy5nZXRBY2Nlc3NUb2tlbigpO1xuXG4gICAgICAgIGlmICghdG9rZW4pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gYWNjZXNzIHRva2VuIGZvdW5kJyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5nZXRUb2tlbkRhdGFGcm9tU3RvcmUodG9rZW4pIGFzIFQ7XG4gICAgfVxuXG4gICAgcHVibGljIGNoZWNrSXNUb2tlbkV4cGlyZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHRva2VuID0gdGhpcy5nZXRBY2Nlc3NUb2tlbigpO1xuXG4gICAgICAgIGlmICghdG9rZW4pIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuY2hlY2tUb2tlbkV4cGlyZWQodGhpcy5nZXRBY2Nlc3NUb2tlbkV4cGlyYXRpb24oKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGNoZWNrSXNSZWZyZXNoVG9rZW5FeHBpcmVkKCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCB0b2tlbiA9IHRoaXMuZ2V0UmVmcmVzaFRva2VuKCk7XG5cbiAgICAgICAgaWYgKCF0b2tlbikge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5jaGVja1Rva2VuRXhwaXJlZCh0aGlzLmdldFJlZnJlc2hUb2tlbkV4cGlyYXRpb24oKSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldFRva2VuRGF0YUZyb21TdG9yZSh0b2tlbjogc3RyaW5nKTogVG9rZW5SZXNwb25zZSB7XG4gICAgICAgIGNvbnN0IHRva2VuRGF0YSA9IHRoaXMudG9rZW5EYXRhKClbdG9rZW5dO1xuXG4gICAgICAgIGlmICh0b2tlbkRhdGEpIHtcbiAgICAgICAgICAgIHJldHVybiB0b2tlbkRhdGE7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjdXJyZW50VG9rZW5EYXRhID0gdGhpcy5wYXJzZVRva2VuKHRva2VuKTtcblxuICAgICAgICB0aGlzLnRva2VuRGF0YS51cGRhdGUoKHByZXYpID0+ICh7IC4uLnByZXYsIFt0b2tlbl06IGN1cnJlbnRUb2tlbkRhdGEgfSkpO1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50VG9rZW5EYXRhO1xuICAgIH1cblxuICAgIHByaXZhdGUgcGFyc2VUb2tlbih0b2tlbjogc3RyaW5nKTogVG9rZW5SZXNwb25zZSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBiYXNlNjRVcmwgPSB0b2tlbi5zcGxpdCgnLicpWzFdO1xuICAgICAgICAgICAgY29uc3QgYmFzZTY0ID0gYmFzZTY0VXJsLnJlcGxhY2UoLy0vZywgJysnKS5yZXBsYWNlKC9fL2csICcvJyk7XG5cbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKGF0b2IoYmFzZTY0KSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHRva2VuJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGNoZWNrVG9rZW5FeHBpcmVkKGV4cGlyZWRUaW1lOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgY3VycmVudFRpbWUgPSBEYXRlLm5vdygpO1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50VGltZSA+PSBleHBpcmVkVGltZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDdWlUb2tlbkJhc2UgZXh0ZW5kcyBDdWlUb2tlbiB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBleGNoYW5nZUNvbnRleHRBcGlTZXJ2aWNlID0gaW5qZWN0KEN1aUV4Y2hhbmdlQ29udGV4dEFwaVNlcnZpY2UpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgRVhDSEFOR0VfVE9LRU5fVkFMVUUgPSAnZW1wbG95ZWVfc2Vzc2lvbic7XG5cbiAgICAvLyBUT0RPOiBvdmVycmlkZSByZWZyZXNoVG9rZW4gd2l0aCBjdXN0b20gcmVmcmVzaCB0b2tlbiByZXF1ZXN0IHRvIHRoZSBiYWNrZW5kXG4gICAgcHVibGljIG92ZXJyaWRlIHJlZnJlc2hUb2tlbigpOiBQcm9taXNlPFRva2VuUmVzcG9uc2U+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHRva2VuRGF0YSA9IHRoaXMuZ2V0QWNjZXNzVG9rZW5EYXRhKCk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLkVYQ0hBTkdFX1RPS0VOX1ZBTFVFIGluIHRva2VuRGF0YSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlZnJlc2hFeGNoYW5nZWRUb2tlbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0Vycm9yIHJlZnJlc2hpbmcgdG9rZW4nLCBlcnJvcik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3VwZXIucmVmcmVzaFRva2VuKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlZnJlc2hFeGNoYW5nZWRUb2tlbigpOiBQcm9taXNlPFRva2VuUmVzcG9uc2U+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+XG4gICAgICAgICAgICB0aGlzLmV4Y2hhbmdlQ29udGV4dEFwaVNlcnZpY2VcbiAgICAgICAgICAgICAgICAucmVmcmVzaCh0aGlzLmdldFJlZnJlc2hUb2tlbigpKVxuICAgICAgICAgICAgICAgIC5waXBlKHN3aXRjaE1hcCgodG9rZW5SZXNwb25zZSkgPT4gdGhpcy5zZXRJZFRva2VuKHRva2VuUmVzcG9uc2UpKSlcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgICAgICAgICAgbmV4dDogKHRva2VuUmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0VG9rZW5SZXNwb25zZSh0b2tlblJlc3BvbnNlKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0b2tlblJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0Vycm9yIHJlZnJlc2hpbmcgdG9rZW4nLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmV2ZW50c1N1YmplY3QubmV4dChuZXcgT0F1dGhFcnJvckV2ZW50KCd0b2tlbl9yZWZyZXNoX2Vycm9yJywgZXJyb3IpKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGV4Y2hhbmdlVG9rZW4ocGFyYW1zOiBDdWlUb2tlbkV4Y2hhbmdlUmVxdWVzdEJvZHkpOiBPYnNlcnZhYmxlPFRva2VuUmVzcG9uc2U+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXhjaGFuZ2VDb250ZXh0QXBpU2VydmljZS5leGNoYW5nZShwYXJhbXMpLnBpcGUoXG4gICAgICAgICAgICBzd2l0Y2hNYXAoKHRva2VuUmVzcG9uc2UpID0+IHRoaXMuc2V0SWRUb2tlbih0b2tlblJlc3BvbnNlKSksXG4gICAgICAgICAgICB0YXAoKHRva2VuUmVzcG9uc2UpID0+IHRoaXMuc2V0VG9rZW5SZXNwb25zZSh0b2tlblJlc3BvbnNlKSksXG4gICAgICAgICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdFcnJvciBleGNoYW5naW5nIHRva2VuJywgZXJyb3IpO1xuICAgICAgICAgICAgICAgIHRoaXMuZXZlbnRzU3ViamVjdC5uZXh0KG5ldyBPQXV0aEVycm9yRXZlbnQoJ3Rva2VuX3JlZnJlc2hfZXJyb3InLCBlcnJvcikpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gZXJyb3IpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldFRva2VuUmVzcG9uc2UodG9rZW5SZXNwb25zZTogVG9rZW5SZXNwb25zZSk6IHZvaWQge1xuICAgICAgICBjb25zdCBleHBpcmVzSW4gPSB0b2tlblJlc3BvbnNlLmV4cGlyZXNfaW4gfHwgdGhpcy5mYWxsYmFja0FjY2Vzc1Rva2VuRXhwaXJhdGlvblRpbWVJblNlYyE7XG5cbiAgICAgICAgdGhpcy5kZWJ1ZygndG9rZW5SZXNwb25zZScsIHRva2VuUmVzcG9uc2UpO1xuICAgICAgICB0aGlzLnN0b3JlQWNjZXNzVG9rZW5SZXNwb25zZShcbiAgICAgICAgICAgIHRva2VuUmVzcG9uc2UuYWNjZXNzX3Rva2VuLFxuICAgICAgICAgICAgdG9rZW5SZXNwb25zZS5yZWZyZXNoX3Rva2VuLFxuICAgICAgICAgICAgZXhwaXJlc0luLFxuICAgICAgICAgICAgdG9rZW5SZXNwb25zZS5zY29wZVxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMuZXZlbnRzU3ViamVjdC5uZXh0KG5ldyBPQXV0aFN1Y2Nlc3NFdmVudCgndG9rZW5fcmVjZWl2ZWQnKSk7XG4gICAgICAgIHRoaXMuZXZlbnRzU3ViamVjdC5uZXh0KG5ldyBPQXV0aFN1Y2Nlc3NFdmVudCgndG9rZW5fcmVmcmVzaGVkJykpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0SWRUb2tlbih0b2tlblJlc3BvbnNlOiBUb2tlblJlc3BvbnNlKTogT2JzZXJ2YWJsZTxUb2tlblJlc3BvbnNlPiB7XG4gICAgICAgIGlmICghdGhpcy5vaWRjIHx8ICF0b2tlblJlc3BvbnNlLmlkX3Rva2VuKSB7XG4gICAgICAgICAgICByZXR1cm4gb2YodG9rZW5SZXNwb25zZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZnJvbSh0aGlzLnByb2Nlc3NJZFRva2VuKHRva2VuUmVzcG9uc2UuaWRfdG9rZW4sIHRva2VuUmVzcG9uc2UuYWNjZXNzX3Rva2VuLCB0cnVlKSkucGlwZShcbiAgICAgICAgICAgIHRhcCgocmVzdWx0KSA9PiB0aGlzLnN0b3JlSWRUb2tlbihyZXN1bHQpKSxcbiAgICAgICAgICAgIG1hcCgoKSA9PiB0b2tlblJlc3BvbnNlKVxuICAgICAgICApO1xuICAgIH1cbn1cbiJdfQ==
@@ -12,10 +12,10 @@ export class CuiGeneralControlErrorHintComponent {
12
12
  return this.isVisible() ?? (this.control().invalid && this.control().dirty);
13
13
  }
14
14
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CuiGeneralControlErrorHintComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
15
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: CuiGeneralControlErrorHintComponent, isStandalone: true, selector: "cui-general-control-error-hint", inputs: { control: { classPropertyName: "control", publicName: "control", isSignal: true, isRequired: true, transformFunction: null }, isVisible: { classPropertyName: "isVisible", publicName: "isVisible", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<ng-container *transloco=\"let t\">\n @if (isInvalid) {\n @if (control().errors; as errors) {\n <cui-hint hintType=\"error\">\n @if (errors['required']) {\n {{ t('FIELD_IS_REQUIRED') }}\n } @else if (errors['maxlength']) {\n {{ t('PLEASE_KEEP_FIELD_UNDER_CHARACTERS', { value: errors['maxlength'].requiredLength }) }}\n } @else if (errors['extraSpaces']) {\n {{ t('MUST_BE_WITHOUT_EXTRA_SPACES') }}\n } @else if (errors['min']) {\n {{ t('MIN_VALUE_MUST_BE_MORE_THAN', { value: errors['min'].min }) }}\n } @else if (errors['max']) {\n {{ t('MAX_VALUE_MUST_BE_LESS_THAN', { value: errors['max'].max }) }}\n } @else if (errors['email']) {\n {{ t('INVALID_EMAIL_ADDRESS') }}\n }\n </cui-hint>\n }\n }\n</ng-container>\n", styles: [":host{display:inline-block}:host:empty{display:none}\n"], dependencies: [{ kind: "ngmodule", type: CuiHintModule }, { kind: "component", type: i1.CuiHintComponent, selector: "cui-hint", inputs: ["hintType"] }, { kind: "directive", type: TranslocoDirective, selector: "[transloco]", inputs: ["transloco", "translocoParams", "translocoScope", "translocoRead", "translocoPrefix", "translocoLang", "translocoLoadingTpl"] }], changeDetection: i0.ChangeDetectionStrategy.Default }); }
15
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: CuiGeneralControlErrorHintComponent, isStandalone: true, selector: "cui-general-control-error-hint", inputs: { control: { classPropertyName: "control", publicName: "control", isSignal: true, isRequired: true, transformFunction: null }, isVisible: { classPropertyName: "isVisible", publicName: "isVisible", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<ng-container *transloco=\"let t\">\n @if (isInvalid) {\n @if (control().errors; as errors) {\n <cui-hint hintType=\"error\">\n @if (errors['required']) {\n {{ t('FIELD_IS_REQUIRED') }}\n } @else if (errors['minlength']) {\n {{ t('PLEASE_KEEP_FIELD_AT_LEAST_CHARACTERS', { value: errors['minlength'].requiredLength }) }}\n } @else if (errors['maxlength']) {\n {{ t('PLEASE_KEEP_FIELD_UNDER_CHARACTERS', { value: errors['maxlength'].requiredLength }) }}\n } @else if (errors['extraSpaces']) {\n {{ t('MUST_BE_WITHOUT_EXTRA_SPACES') }}\n } @else if (errors['min']) {\n {{ t('MIN_VALUE_MUST_BE_MORE_THAN', { value: errors['min'].min }) }}\n } @else if (errors['max']) {\n {{ t('MAX_VALUE_MUST_BE_LESS_THAN', { value: errors['max'].max }) }}\n } @else if (errors['email']) {\n {{ t('INVALID_EMAIL_ADDRESS') }}\n }\n </cui-hint>\n }\n }\n</ng-container>\n", styles: [":host{display:inline-block}:host:empty{display:none}\n"], dependencies: [{ kind: "ngmodule", type: CuiHintModule }, { kind: "component", type: i1.CuiHintComponent, selector: "cui-hint", inputs: ["hintType"] }, { kind: "directive", type: TranslocoDirective, selector: "[transloco]", inputs: ["transloco", "translocoParams", "translocoScope", "translocoRead", "translocoPrefix", "translocoLang", "translocoLoadingTpl"] }], changeDetection: i0.ChangeDetectionStrategy.Default }); }
16
16
  }
17
17
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CuiGeneralControlErrorHintComponent, decorators: [{
18
18
  type: Component,
19
- args: [{ selector: 'cui-general-control-error-hint', imports: [CuiHintModule, TranslocoDirective], standalone: true, changeDetection: ChangeDetectionStrategy.Default, template: "<ng-container *transloco=\"let t\">\n @if (isInvalid) {\n @if (control().errors; as errors) {\n <cui-hint hintType=\"error\">\n @if (errors['required']) {\n {{ t('FIELD_IS_REQUIRED') }}\n } @else if (errors['maxlength']) {\n {{ t('PLEASE_KEEP_FIELD_UNDER_CHARACTERS', { value: errors['maxlength'].requiredLength }) }}\n } @else if (errors['extraSpaces']) {\n {{ t('MUST_BE_WITHOUT_EXTRA_SPACES') }}\n } @else if (errors['min']) {\n {{ t('MIN_VALUE_MUST_BE_MORE_THAN', { value: errors['min'].min }) }}\n } @else if (errors['max']) {\n {{ t('MAX_VALUE_MUST_BE_LESS_THAN', { value: errors['max'].max }) }}\n } @else if (errors['email']) {\n {{ t('INVALID_EMAIL_ADDRESS') }}\n }\n </cui-hint>\n }\n }\n</ng-container>\n", styles: [":host{display:inline-block}:host:empty{display:none}\n"] }]
19
+ args: [{ selector: 'cui-general-control-error-hint', imports: [CuiHintModule, TranslocoDirective], standalone: true, changeDetection: ChangeDetectionStrategy.Default, template: "<ng-container *transloco=\"let t\">\n @if (isInvalid) {\n @if (control().errors; as errors) {\n <cui-hint hintType=\"error\">\n @if (errors['required']) {\n {{ t('FIELD_IS_REQUIRED') }}\n } @else if (errors['minlength']) {\n {{ t('PLEASE_KEEP_FIELD_AT_LEAST_CHARACTERS', { value: errors['minlength'].requiredLength }) }}\n } @else if (errors['maxlength']) {\n {{ t('PLEASE_KEEP_FIELD_UNDER_CHARACTERS', { value: errors['maxlength'].requiredLength }) }}\n } @else if (errors['extraSpaces']) {\n {{ t('MUST_BE_WITHOUT_EXTRA_SPACES') }}\n } @else if (errors['min']) {\n {{ t('MIN_VALUE_MUST_BE_MORE_THAN', { value: errors['min'].min }) }}\n } @else if (errors['max']) {\n {{ t('MAX_VALUE_MUST_BE_LESS_THAN', { value: errors['max'].max }) }}\n } @else if (errors['email']) {\n {{ t('INVALID_EMAIL_ADDRESS') }}\n }\n </cui-hint>\n }\n }\n</ng-container>\n", styles: [":host{display:inline-block}:host:empty{display:none}\n"] }]
20
20
  }] });
21
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhbC1jb250cm9sLWVycm9yLWhpbnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZS93aWRnZXRzL2dlbmVyYWwtY29udHJvbC1lcnJvci1oaW50L2dlbmVyYWwtY29udHJvbC1lcnJvci1oaW50LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmUvd2lkZ2V0cy9nZW5lcmFsLWNvbnRyb2wtZXJyb3ItaGludC9nZW5lcmFsLWNvbnRyb2wtZXJyb3ItaGludC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUxRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUV4RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7OztBQVVqRCxNQUFNLE9BQU8sbUNBQW1DO0lBUmhEO1FBU29CLFlBQU8sR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFtQixDQUFDO1FBQzVDLGNBQVMsR0FBRyxLQUFLLEVBQVcsQ0FBQztLQUtoRDtJQUhHLElBQWMsU0FBUztRQUNuQixPQUFPLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2hGLENBQUM7K0dBTlEsbUNBQW1DO21HQUFuQyxtQ0FBbUMsdVdDZGhELGs5QkFxQkEsK0dEYmMsYUFBYSw2SEFBRSxrQkFBa0I7OzRGQU1sQyxtQ0FBbUM7a0JBUi9DLFNBQVM7K0JBQ0ksZ0NBQWdDLFdBQ2pDLENBQUMsYUFBYSxFQUFFLGtCQUFrQixDQUFDLGNBQ2hDLElBQUksbUJBR0MsdUJBQXVCLENBQUMsT0FBTyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGlucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgdHlwZSB7IEFic3RyYWN0Q29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFRyYW5zbG9jb0RpcmVjdGl2ZSB9IGZyb20gJ0Bqc3ZlcnNlL3RyYW5zbG9jbyc7XG5cbmltcG9ydCB7IEN1aUhpbnRNb2R1bGUgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdjdWktZ2VuZXJhbC1jb250cm9sLWVycm9yLWhpbnQnLFxuICAgIGltcG9ydHM6IFtDdWlIaW50TW9kdWxlLCBUcmFuc2xvY29EaXJlY3RpdmVdLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2dlbmVyYWwtY29udHJvbC1lcnJvci1oaW50LmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybDogJy4vZ2VuZXJhbC1jb250cm9sLWVycm9yLWhpbnQuY29tcG9uZW50LnNjc3MnLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuRGVmYXVsdFxufSlcbmV4cG9ydCBjbGFzcyBDdWlHZW5lcmFsQ29udHJvbEVycm9ySGludENvbXBvbmVudCB7XG4gICAgcHVibGljIHJlYWRvbmx5IGNvbnRyb2wgPSBpbnB1dC5yZXF1aXJlZDxBYnN0cmFjdENvbnRyb2w+KCk7XG4gICAgcHVibGljIHJlYWRvbmx5IGlzVmlzaWJsZSA9IGlucHV0PGJvb2xlYW4+KCk7XG5cbiAgICBwcm90ZWN0ZWQgZ2V0IGlzSW52YWxpZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNWaXNpYmxlKCkgPz8gKHRoaXMuY29udHJvbCgpLmludmFsaWQgJiYgdGhpcy5jb250cm9sKCkuZGlydHkpO1xuICAgIH1cbn1cbiIsIjxuZy1jb250YWluZXIgKnRyYW5zbG9jbz1cImxldCB0XCI+XG4gICAgQGlmIChpc0ludmFsaWQpIHtcbiAgICAgICAgQGlmIChjb250cm9sKCkuZXJyb3JzOyBhcyBlcnJvcnMpIHtcbiAgICAgICAgICAgIDxjdWktaGludCBoaW50VHlwZT1cImVycm9yXCI+XG4gICAgICAgICAgICAgICAgQGlmIChlcnJvcnNbJ3JlcXVpcmVkJ10pIHtcbiAgICAgICAgICAgICAgICAgICAge3sgdCgnRklFTERfSVNfUkVRVUlSRUQnKSB9fVxuICAgICAgICAgICAgICAgIH0gQGVsc2UgaWYgKGVycm9yc1snbWF4bGVuZ3RoJ10pIHtcbiAgICAgICAgICAgICAgICAgICAge3sgdCgnUExFQVNFX0tFRVBfRklFTERfVU5ERVJfQ0hBUkFDVEVSUycsIHsgdmFsdWU6IGVycm9yc1snbWF4bGVuZ3RoJ10ucmVxdWlyZWRMZW5ndGggfSkgfX1cbiAgICAgICAgICAgICAgICB9IEBlbHNlIGlmIChlcnJvcnNbJ2V4dHJhU3BhY2VzJ10pIHtcbiAgICAgICAgICAgICAgICAgICAge3sgdCgnTVVTVF9CRV9XSVRIT1VUX0VYVFJBX1NQQUNFUycpIH19XG4gICAgICAgICAgICAgICAgfSBAZWxzZSBpZiAoZXJyb3JzWydtaW4nXSkge1xuICAgICAgICAgICAgICAgICAgICB7eyB0KCdNSU5fVkFMVUVfTVVTVF9CRV9NT1JFX1RIQU4nLCB7IHZhbHVlOiBlcnJvcnNbJ21pbiddLm1pbiB9KSB9fVxuICAgICAgICAgICAgICAgIH0gQGVsc2UgaWYgKGVycm9yc1snbWF4J10pIHtcbiAgICAgICAgICAgICAgICAgICAge3sgdCgnTUFYX1ZBTFVFX01VU1RfQkVfTEVTU19USEFOJywgeyB2YWx1ZTogZXJyb3JzWydtYXgnXS5tYXggfSkgfX1cbiAgICAgICAgICAgICAgICB9IEBlbHNlIGlmIChlcnJvcnNbJ2VtYWlsJ10pIHtcbiAgICAgICAgICAgICAgICAgICAge3sgdCgnSU5WQUxJRF9FTUFJTF9BRERSRVNTJykgfX1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2N1aS1oaW50PlxuICAgICAgICB9XG4gICAgfVxuPC9uZy1jb250YWluZXI+XG4iXX0=
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhbC1jb250cm9sLWVycm9yLWhpbnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZS93aWRnZXRzL2dlbmVyYWwtY29udHJvbC1lcnJvci1oaW50L2dlbmVyYWwtY29udHJvbC1lcnJvci1oaW50LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmUvd2lkZ2V0cy9nZW5lcmFsLWNvbnRyb2wtZXJyb3ItaGludC9nZW5lcmFsLWNvbnRyb2wtZXJyb3ItaGludC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUxRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUV4RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7OztBQVVqRCxNQUFNLE9BQU8sbUNBQW1DO0lBUmhEO1FBU29CLFlBQU8sR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFtQixDQUFDO1FBQzVDLGNBQVMsR0FBRyxLQUFLLEVBQVcsQ0FBQztLQUtoRDtJQUhHLElBQWMsU0FBUztRQUNuQixPQUFPLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2hGLENBQUM7K0dBTlEsbUNBQW1DO21HQUFuQyxtQ0FBbUMsdVdDZGhELDJuQ0F1QkEsK0dEZmMsYUFBYSw2SEFBRSxrQkFBa0I7OzRGQU1sQyxtQ0FBbUM7a0JBUi9DLFNBQVM7K0JBQ0ksZ0NBQWdDLFdBQ2pDLENBQUMsYUFBYSxFQUFFLGtCQUFrQixDQUFDLGNBQ2hDLElBQUksbUJBR0MsdUJBQXVCLENBQUMsT0FBTyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGlucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgdHlwZSB7IEFic3RyYWN0Q29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFRyYW5zbG9jb0RpcmVjdGl2ZSB9IGZyb20gJ0Bqc3ZlcnNlL3RyYW5zbG9jbyc7XG5cbmltcG9ydCB7IEN1aUhpbnRNb2R1bGUgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdjdWktZ2VuZXJhbC1jb250cm9sLWVycm9yLWhpbnQnLFxuICAgIGltcG9ydHM6IFtDdWlIaW50TW9kdWxlLCBUcmFuc2xvY29EaXJlY3RpdmVdLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2dlbmVyYWwtY29udHJvbC1lcnJvci1oaW50LmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybDogJy4vZ2VuZXJhbC1jb250cm9sLWVycm9yLWhpbnQuY29tcG9uZW50LnNjc3MnLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuRGVmYXVsdFxufSlcbmV4cG9ydCBjbGFzcyBDdWlHZW5lcmFsQ29udHJvbEVycm9ySGludENvbXBvbmVudCB7XG4gICAgcHVibGljIHJlYWRvbmx5IGNvbnRyb2wgPSBpbnB1dC5yZXF1aXJlZDxBYnN0cmFjdENvbnRyb2w+KCk7XG4gICAgcHVibGljIHJlYWRvbmx5IGlzVmlzaWJsZSA9IGlucHV0PGJvb2xlYW4+KCk7XG5cbiAgICBwcm90ZWN0ZWQgZ2V0IGlzSW52YWxpZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNWaXNpYmxlKCkgPz8gKHRoaXMuY29udHJvbCgpLmludmFsaWQgJiYgdGhpcy5jb250cm9sKCkuZGlydHkpO1xuICAgIH1cbn1cbiIsIjxuZy1jb250YWluZXIgKnRyYW5zbG9jbz1cImxldCB0XCI+XG4gICAgQGlmIChpc0ludmFsaWQpIHtcbiAgICAgICAgQGlmIChjb250cm9sKCkuZXJyb3JzOyBhcyBlcnJvcnMpIHtcbiAgICAgICAgICAgIDxjdWktaGludCBoaW50VHlwZT1cImVycm9yXCI+XG4gICAgICAgICAgICAgICAgQGlmIChlcnJvcnNbJ3JlcXVpcmVkJ10pIHtcbiAgICAgICAgICAgICAgICAgICAge3sgdCgnRklFTERfSVNfUkVRVUlSRUQnKSB9fVxuICAgICAgICAgICAgICAgIH0gQGVsc2UgaWYgKGVycm9yc1snbWlubGVuZ3RoJ10pIHtcbiAgICAgICAgICAgICAgICAgICAge3sgdCgnUExFQVNFX0tFRVBfRklFTERfQVRfTEVBU1RfQ0hBUkFDVEVSUycsIHsgdmFsdWU6IGVycm9yc1snbWlubGVuZ3RoJ10ucmVxdWlyZWRMZW5ndGggfSkgfX1cbiAgICAgICAgICAgICAgICB9IEBlbHNlIGlmIChlcnJvcnNbJ21heGxlbmd0aCddKSB7XG4gICAgICAgICAgICAgICAgICAgIHt7IHQoJ1BMRUFTRV9LRUVQX0ZJRUxEX1VOREVSX0NIQVJBQ1RFUlMnLCB7IHZhbHVlOiBlcnJvcnNbJ21heGxlbmd0aCddLnJlcXVpcmVkTGVuZ3RoIH0pIH19XG4gICAgICAgICAgICAgICAgfSBAZWxzZSBpZiAoZXJyb3JzWydleHRyYVNwYWNlcyddKSB7XG4gICAgICAgICAgICAgICAgICAgIHt7IHQoJ01VU1RfQkVfV0lUSE9VVF9FWFRSQV9TUEFDRVMnKSB9fVxuICAgICAgICAgICAgICAgIH0gQGVsc2UgaWYgKGVycm9yc1snbWluJ10pIHtcbiAgICAgICAgICAgICAgICAgICAge3sgdCgnTUlOX1ZBTFVFX01VU1RfQkVfTU9SRV9USEFOJywgeyB2YWx1ZTogZXJyb3JzWydtaW4nXS5taW4gfSkgfX1cbiAgICAgICAgICAgICAgICB9IEBlbHNlIGlmIChlcnJvcnNbJ21heCddKSB7XG4gICAgICAgICAgICAgICAgICAgIHt7IHQoJ01BWF9WQUxVRV9NVVNUX0JFX0xFU1NfVEhBTicsIHsgdmFsdWU6IGVycm9yc1snbWF4J10ubWF4IH0pIH19XG4gICAgICAgICAgICAgICAgfSBAZWxzZSBpZiAoZXJyb3JzWydlbWFpbCddKSB7XG4gICAgICAgICAgICAgICAgICAgIHt7IHQoJ0lOVkFMSURfRU1BSUxfQUREUkVTUycpIH19XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9jdWktaGludD5cbiAgICAgICAgfVxuICAgIH1cbjwvbmctY29udGFpbmVyPlxuIl19
@@ -6,7 +6,7 @@ import * as i1$1 from '@cuby-ui/cdk';
6
6
  import { CUI_WINDOW, cuiCreateToken, cuiCreateTokenFromFactory, CuiDestroyService, CuiFilterPipe, CuiLetDirective, CuiPopoverService, cuiProvide, CUI_ANIMATION_FRAME, cuiZonefree, EMPTY_CLIENT_RECT, cuiInjectElement, CUI_LOCAL_STORAGE, CUI_IS_WEBKIT, CuiItemDirective, CuiActiveZone, CuiFocusTrapDirective, cuiGetElementObscures, CUI_IS_MOBILE, CuiHoveredService, cuiPure, cuiPointToClientRect, cuiClamp, cuiPx, cuiIfMap, cuiIsPresent, cuiTypedFromEvent, cuiZonefreeScheduler, cuiZoneOptimized, cuiIsNativeFocused, CuiClickOutsideDirective, CuiTargetDirective, cuiGetClosestFocusable, CuiTime, CuiDimensionsObserverDirective, CuiAutoResizingDirective, CuiIdService, CuiElementDirective, CuiDragPointerDirective, CuiDragDropDirective, CuiDragListDirective, CuiHandleScrollDirective } from '@cuby-ui/cdk';
7
7
  import { DomSanitizer } from '@angular/platform-browser';
8
8
  import { cuiIsIcon, CUI_ICONS } from '@cuby-ui/icons';
9
- import { BehaviorSubject, takeUntil, Observable, merge, distinctUntilChanged, startWith, map, finalize, switchMap, of, from, tap, filter, timer, Subject, delay, repeat, takeWhile, fromEvent, debounce, skip, take, forkJoin, throttleTime, concatMap, toArray, catchError, throwError, pairwise, debounceTime } from 'rxjs';
9
+ import { BehaviorSubject, takeUntil, Observable, merge, distinctUntilChanged, startWith, map, finalize, switchMap, tap, catchError, throwError, of, from, filter, timer, Subject, delay, repeat, takeWhile, fromEvent, debounce, skip, take, forkJoin, throttleTime, concatMap, toArray, pairwise, debounceTime } from 'rxjs';
10
10
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
11
11
  import { OAuthService, OAuthErrorEvent, OAuthSuccessEvent, OAuthInfoEvent, provideOAuthClient } from 'angular-oauth2-oidc';
12
12
  import { CuiExchangeContextApiService, CuiTreeStructNavigatorApiService, CuiFrameApiService, CuiNodeChecklistApiService, CuiTreeStructApiService } from '@cuby-ui/api';
@@ -866,13 +866,37 @@ class CuiToken extends OAuthService {
866
866
  super(...arguments);
867
867
  this.tokenData = signal({});
868
868
  }
869
+ getRefreshTokenExpiration() {
870
+ return this.getTokenDataFromStore(this.getRefreshToken()).expires_in;
871
+ }
872
+ getAccessTokenData() {
873
+ const token = this.getAccessToken();
874
+ if (!token) {
875
+ throw new Error('No access token found');
876
+ }
877
+ return this.getTokenDataFromStore(token);
878
+ }
879
+ checkIsTokenExpired() {
880
+ const token = this.getAccessToken();
881
+ if (!token) {
882
+ return true;
883
+ }
884
+ return this.checkTokenExpired(this.getAccessTokenExpiration());
885
+ }
886
+ checkIsRefreshTokenExpired() {
887
+ const token = this.getRefreshToken();
888
+ if (!token) {
889
+ return true;
890
+ }
891
+ return this.checkTokenExpired(this.getRefreshTokenExpiration());
892
+ }
869
893
  getTokenDataFromStore(token) {
870
894
  const tokenData = this.tokenData()[token];
871
895
  if (tokenData) {
872
896
  return tokenData;
873
897
  }
874
898
  const currentTokenData = this.parseToken(token);
875
- this.tokenData.set({ [token]: currentTokenData });
899
+ this.tokenData.update((prev) => ({ ...prev, [token]: currentTokenData }));
876
900
  return currentTokenData;
877
901
  }
878
902
  parseToken(token) {
@@ -885,6 +909,10 @@ class CuiToken extends OAuthService {
885
909
  throw new Error('Invalid token');
886
910
  }
887
911
  }
912
+ checkTokenExpired(expiredTime) {
913
+ const currentTime = Date.now();
914
+ return currentTime >= expiredTime;
915
+ }
888
916
  }
889
917
  class CuiTokenBase extends CuiToken {
890
918
  constructor() {
@@ -892,43 +920,16 @@ class CuiTokenBase extends CuiToken {
892
920
  this.exchangeContextApiService = inject(CuiExchangeContextApiService);
893
921
  this.EXCHANGE_TOKEN_VALUE = 'employee_session';
894
922
  }
895
- getAccessTokenData() {
896
- const token = this.getAccessToken();
897
- if (!token) {
898
- throw new Error('No access token found');
899
- }
900
- return this.getTokenDataFromStore(token);
901
- }
902
- checkIsTokenExpired() {
903
- const token = this.getAccessToken();
904
- if (!token) {
905
- return true;
906
- }
907
- const expiredTime = this.getAccessTokenExpiration();
908
- const currentTime = Date.now();
909
- return currentTime >= expiredTime;
910
- }
911
- exchangeToken(params) {
912
- return new Promise((resolve, reject) => this.exchangeContextApiService
913
- .exchange(params)
914
- .pipe(switchMap((tokenResponse) => this.setIdToken(tokenResponse)))
915
- .subscribe({
916
- next: (tokenResponse) => {
917
- this.setTokenResponse(tokenResponse);
918
- resolve(tokenResponse);
919
- },
920
- error: (error) => {
921
- this.logger.error('Error exchanging token', error);
922
- this.eventsSubject.next(new OAuthErrorEvent('token_refresh_error', error));
923
- reject(error);
924
- }
925
- }));
926
- }
927
923
  // TODO: override refreshToken with custom refresh token request to the backend
928
924
  refreshToken() {
929
- const tokenData = this.getAccessTokenData();
930
- if (this.EXCHANGE_TOKEN_VALUE in tokenData) {
931
- return this.refreshExchangedToken();
925
+ try {
926
+ const tokenData = this.getAccessTokenData();
927
+ if (this.EXCHANGE_TOKEN_VALUE in tokenData) {
928
+ return this.refreshExchangedToken();
929
+ }
930
+ }
931
+ catch (error) {
932
+ this.logger.error('Error refreshing token', error);
932
933
  }
933
934
  return super.refreshToken();
934
935
  }
@@ -948,6 +949,13 @@ class CuiTokenBase extends CuiToken {
948
949
  }
949
950
  }));
950
951
  }
952
+ exchangeToken(params) {
953
+ return this.exchangeContextApiService.exchange(params).pipe(switchMap((tokenResponse) => this.setIdToken(tokenResponse)), tap((tokenResponse) => this.setTokenResponse(tokenResponse)), catchError((error) => {
954
+ this.logger.error('Error exchanging token', error);
955
+ this.eventsSubject.next(new OAuthErrorEvent('token_refresh_error', error));
956
+ return throwError(() => error);
957
+ }));
958
+ }
951
959
  setTokenResponse(tokenResponse) {
952
960
  const expiresIn = tokenResponse.expires_in || this.fallbackAccessTokenExpirationTimeInSec;
953
961
  this.debug('tokenResponse', tokenResponse);
@@ -968,12 +976,12 @@ class CuiAuthBase extends CuiTokenBase {
968
976
  return super.createLoginUrl(state, loginHint, customRedirectUri, noPrompt, params);
969
977
  }
970
978
  async useCheckTokenFlow(loginCallback) {
971
- const isExpired = this.checkIsTokenExpired();
972
- const isRefreshTokenExist = this.getRefreshToken();
973
- if (!isRefreshTokenExist) {
979
+ const isAccessTokenExpired = this.checkIsTokenExpired();
980
+ const isRefreshTokenExpired = this.checkIsRefreshTokenExpired();
981
+ if (isRefreshTokenExpired) {
974
982
  return loginCallback();
975
983
  }
976
- if (!isExpired) {
984
+ if (!isAccessTokenExpired) {
977
985
  return;
978
986
  }
979
987
  return await this.refreshToken();
@@ -7819,11 +7827,11 @@ class CuiGeneralControlErrorHintComponent {
7819
7827
  return this.isVisible() ?? (this.control().invalid && this.control().dirty);
7820
7828
  }
7821
7829
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CuiGeneralControlErrorHintComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
7822
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: CuiGeneralControlErrorHintComponent, isStandalone: true, selector: "cui-general-control-error-hint", inputs: { control: { classPropertyName: "control", publicName: "control", isSignal: true, isRequired: true, transformFunction: null }, isVisible: { classPropertyName: "isVisible", publicName: "isVisible", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<ng-container *transloco=\"let t\">\n @if (isInvalid) {\n @if (control().errors; as errors) {\n <cui-hint hintType=\"error\">\n @if (errors['required']) {\n {{ t('FIELD_IS_REQUIRED') }}\n } @else if (errors['maxlength']) {\n {{ t('PLEASE_KEEP_FIELD_UNDER_CHARACTERS', { value: errors['maxlength'].requiredLength }) }}\n } @else if (errors['extraSpaces']) {\n {{ t('MUST_BE_WITHOUT_EXTRA_SPACES') }}\n } @else if (errors['min']) {\n {{ t('MIN_VALUE_MUST_BE_MORE_THAN', { value: errors['min'].min }) }}\n } @else if (errors['max']) {\n {{ t('MAX_VALUE_MUST_BE_LESS_THAN', { value: errors['max'].max }) }}\n } @else if (errors['email']) {\n {{ t('INVALID_EMAIL_ADDRESS') }}\n }\n </cui-hint>\n }\n }\n</ng-container>\n", styles: [":host{display:inline-block}:host:empty{display:none}\n"], dependencies: [{ kind: "ngmodule", type: CuiHintModule }, { kind: "component", type: CuiHintComponent, selector: "cui-hint", inputs: ["hintType"] }, { kind: "directive", type: TranslocoDirective, selector: "[transloco]", inputs: ["transloco", "translocoParams", "translocoScope", "translocoRead", "translocoPrefix", "translocoLang", "translocoLoadingTpl"] }], changeDetection: i0.ChangeDetectionStrategy.Default }); }
7830
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: CuiGeneralControlErrorHintComponent, isStandalone: true, selector: "cui-general-control-error-hint", inputs: { control: { classPropertyName: "control", publicName: "control", isSignal: true, isRequired: true, transformFunction: null }, isVisible: { classPropertyName: "isVisible", publicName: "isVisible", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<ng-container *transloco=\"let t\">\n @if (isInvalid) {\n @if (control().errors; as errors) {\n <cui-hint hintType=\"error\">\n @if (errors['required']) {\n {{ t('FIELD_IS_REQUIRED') }}\n } @else if (errors['minlength']) {\n {{ t('PLEASE_KEEP_FIELD_AT_LEAST_CHARACTERS', { value: errors['minlength'].requiredLength }) }}\n } @else if (errors['maxlength']) {\n {{ t('PLEASE_KEEP_FIELD_UNDER_CHARACTERS', { value: errors['maxlength'].requiredLength }) }}\n } @else if (errors['extraSpaces']) {\n {{ t('MUST_BE_WITHOUT_EXTRA_SPACES') }}\n } @else if (errors['min']) {\n {{ t('MIN_VALUE_MUST_BE_MORE_THAN', { value: errors['min'].min }) }}\n } @else if (errors['max']) {\n {{ t('MAX_VALUE_MUST_BE_LESS_THAN', { value: errors['max'].max }) }}\n } @else if (errors['email']) {\n {{ t('INVALID_EMAIL_ADDRESS') }}\n }\n </cui-hint>\n }\n }\n</ng-container>\n", styles: [":host{display:inline-block}:host:empty{display:none}\n"], dependencies: [{ kind: "ngmodule", type: CuiHintModule }, { kind: "component", type: CuiHintComponent, selector: "cui-hint", inputs: ["hintType"] }, { kind: "directive", type: TranslocoDirective, selector: "[transloco]", inputs: ["transloco", "translocoParams", "translocoScope", "translocoRead", "translocoPrefix", "translocoLang", "translocoLoadingTpl"] }], changeDetection: i0.ChangeDetectionStrategy.Default }); }
7823
7831
  }
7824
7832
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CuiGeneralControlErrorHintComponent, decorators: [{
7825
7833
  type: Component,
7826
- args: [{ selector: 'cui-general-control-error-hint', imports: [CuiHintModule, TranslocoDirective], standalone: true, changeDetection: ChangeDetectionStrategy.Default, template: "<ng-container *transloco=\"let t\">\n @if (isInvalid) {\n @if (control().errors; as errors) {\n <cui-hint hintType=\"error\">\n @if (errors['required']) {\n {{ t('FIELD_IS_REQUIRED') }}\n } @else if (errors['maxlength']) {\n {{ t('PLEASE_KEEP_FIELD_UNDER_CHARACTERS', { value: errors['maxlength'].requiredLength }) }}\n } @else if (errors['extraSpaces']) {\n {{ t('MUST_BE_WITHOUT_EXTRA_SPACES') }}\n } @else if (errors['min']) {\n {{ t('MIN_VALUE_MUST_BE_MORE_THAN', { value: errors['min'].min }) }}\n } @else if (errors['max']) {\n {{ t('MAX_VALUE_MUST_BE_LESS_THAN', { value: errors['max'].max }) }}\n } @else if (errors['email']) {\n {{ t('INVALID_EMAIL_ADDRESS') }}\n }\n </cui-hint>\n }\n }\n</ng-container>\n", styles: [":host{display:inline-block}:host:empty{display:none}\n"] }]
7834
+ args: [{ selector: 'cui-general-control-error-hint', imports: [CuiHintModule, TranslocoDirective], standalone: true, changeDetection: ChangeDetectionStrategy.Default, template: "<ng-container *transloco=\"let t\">\n @if (isInvalid) {\n @if (control().errors; as errors) {\n <cui-hint hintType=\"error\">\n @if (errors['required']) {\n {{ t('FIELD_IS_REQUIRED') }}\n } @else if (errors['minlength']) {\n {{ t('PLEASE_KEEP_FIELD_AT_LEAST_CHARACTERS', { value: errors['minlength'].requiredLength }) }}\n } @else if (errors['maxlength']) {\n {{ t('PLEASE_KEEP_FIELD_UNDER_CHARACTERS', { value: errors['maxlength'].requiredLength }) }}\n } @else if (errors['extraSpaces']) {\n {{ t('MUST_BE_WITHOUT_EXTRA_SPACES') }}\n } @else if (errors['min']) {\n {{ t('MIN_VALUE_MUST_BE_MORE_THAN', { value: errors['min'].min }) }}\n } @else if (errors['max']) {\n {{ t('MAX_VALUE_MUST_BE_LESS_THAN', { value: errors['max'].max }) }}\n } @else if (errors['email']) {\n {{ t('INVALID_EMAIL_ADDRESS') }}\n }\n </cui-hint>\n }\n }\n</ng-container>\n", styles: [":host{display:inline-block}:host:empty{display:none}\n"] }]
7827
7835
  }] });
7828
7836
 
7829
7837
  class CuiCategoryFormComponent {