@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.
- package/esm2022/services/auth.service.mjs +5 -5
- package/esm2022/services/token.service.mjs +46 -38
- package/esm2022/widgets/general-control-error-hint/general-control-error-hint.component.mjs +3 -3
- package/fesm2022/cuby-ui-core.mjs +51 -43
- package/fesm2022/cuby-ui-core.mjs.map +1 -1
- package/package.json +4 -4
- package/services/token.service.d.ts +8 -4
|
@@ -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
|
|
10
|
-
const
|
|
11
|
-
if (
|
|
9
|
+
const isAccessTokenExpired = this.checkIsTokenExpired();
|
|
10
|
+
const isRefreshTokenExpired = this.checkIsRefreshTokenExpired();
|
|
11
|
+
if (isRefreshTokenExpired) {
|
|
12
12
|
return loginCallback();
|
|
13
13
|
}
|
|
14
|
-
if (!
|
|
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,
|
|
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.
|
|
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
|
-
|
|
71
|
-
|
|
72
|
-
|
|
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,
|
|
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,
|
|
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.
|
|
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
|
-
|
|
930
|
-
|
|
931
|
-
|
|
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
|
|
972
|
-
const
|
|
973
|
-
if (
|
|
979
|
+
const isAccessTokenExpired = this.checkIsTokenExpired();
|
|
980
|
+
const isRefreshTokenExpired = this.checkIsRefreshTokenExpired();
|
|
981
|
+
if (isRefreshTokenExpired) {
|
|
974
982
|
return loginCallback();
|
|
975
983
|
}
|
|
976
|
-
if (!
|
|
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 {
|