@alauda-fe/common 1.4.1 → 1.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (26) hide show
  1. package/authorization/authorization.d.ts +27 -0
  2. package/authorization/constants.d.ts +11 -0
  3. package/authorization/public-api.d.ts +2 -0
  4. package/authorization/state.service.d.ts +3 -28
  5. package/business/resource-select/exports/project-selector/component.d.ts +1 -0
  6. package/core/directives/scroll-to-first-invalid.directive.d.ts +1 -1
  7. package/core/services/feature-gate.service.d.ts +1 -1
  8. package/core/types/resource-definitions.d.ts +1 -1
  9. package/core/utils/cache-store.d.ts +3 -3
  10. package/esm2022/authorization/authorization.mjs +157 -0
  11. package/esm2022/authorization/constants.mjs +15 -0
  12. package/esm2022/authorization/public-api.mjs +3 -1
  13. package/esm2022/authorization/state.service.mjs +25 -147
  14. package/esm2022/authorization/storage-token.mjs +2 -2
  15. package/esm2022/business/resource-select/exports/project-selector/component.mjs +14 -6
  16. package/esm2022/business/resource-select/internals/data-grid/component.mjs +2 -2
  17. package/esm2022/core/utils/cache-store.mjs +16 -11
  18. package/esm2022/page-scaffold/navigation/navconfig-loader/navconfig-loader.service.mjs +2 -2
  19. package/esm2022/page-scaffold/page-header/account-menu/component/component.mjs +2 -2
  20. package/esm2022/page-scaffold/page-header/common-layout/product-select/component.mjs +2 -2
  21. package/esm2022/widget/date-range-picker/component.mjs +1 -2
  22. package/esm2022/widget/status-icon/status-icon.component.mjs +1 -1
  23. package/k8s-resource-list/k8s-resource-paged-list.d.ts +2 -2
  24. package/package.json +1 -1
  25. package/page-scaffold/page/notices/notice.component.d.ts +1 -1
  26. package/table/component.d.ts +1 -1
@@ -0,0 +1,27 @@
1
+ import { AccountInfo } from '../page-scaffold/public-api';
2
+ export interface AuthorizationState {
3
+ expireAt?: string;
4
+ issuedAt?: string;
5
+ state?: string;
6
+ authUrl?: string;
7
+ logoutUrl?: string;
8
+ info?: AccountInfo;
9
+ }
10
+ export interface TokenResponse {
11
+ token_storage: string;
12
+ token_type: string;
13
+ expire_at: string;
14
+ issued_at: string;
15
+ id_token?: string;
16
+ }
17
+ export declare function fetchAuthorizationState(): Promise<AuthorizationState>;
18
+ export declare function getAuthorizationState(): AuthorizationState;
19
+ export declare function initAuthorizationState(state: AuthorizationState): void;
20
+ export declare function attachAuthorizationHeader(): {
21
+ Authorization?: string;
22
+ };
23
+ export declare function logoutAudit(): Promise<{
24
+ logout_redirect_url?: string;
25
+ }>;
26
+ export declare function logout(returnCurrentPage?: boolean | string): void;
27
+ export declare function redirectSSOEntry(entry: string): string;
@@ -0,0 +1,11 @@
1
+ export declare const STORAGE_TYPE_KEY = "token_storage";
2
+ export declare const CODE_KEY = "code";
3
+ export declare const ID_TOKEN_KEY = "id_token";
4
+ export declare const LOADING_CACHE = 15000;
5
+ export declare const LOGIN_API = "/console/api/v2/token/login";
6
+ export declare const LOGOUT_API = "/console/api/v2/token/logout";
7
+ export declare const CALLBACK_API = "/console/api/v2/token/callback";
8
+ export declare const TOKEN_REFRESH_API = "/console/api/v2/token/refresh";
9
+ export declare const TOKEN_INFO_API = "/console/api/v2/token/info";
10
+ export declare const EXTERNAL_REDIRECT_API = "/console/api/v2/token/redirect";
11
+ export declare const REDIRECT_URIS: Set<string>;
@@ -10,3 +10,5 @@ export * from './app-init-url';
10
10
  export * from './session-manage.service';
11
11
  export * from './state.service';
12
12
  export * from './storage-token';
13
+ export * from './authorization';
14
+ export * from './constants';
@@ -1,46 +1,21 @@
1
1
  import { Observable } from 'rxjs';
2
2
  import { AccountInfo } from '../page-scaffold/public-api';
3
+ import { logout, TokenResponse } from './authorization';
3
4
  import * as i0 from "@angular/core";
4
- export interface AuthorizationState {
5
- expireAt?: string;
6
- issuedAt?: string;
7
- state?: string;
8
- authUrl?: string;
9
- logoutUrl?: string;
10
- info?: AccountInfo;
11
- }
12
- export interface TokenResponse {
13
- token_storage: string;
14
- token_type: string;
15
- expire_at: string;
16
- issued_at: string;
17
- id_token?: string;
18
- }
19
- export declare const STORAGE_TYPE_KEY = "token_storage";
20
- export declare const CODE_KEY = "code";
21
- export declare const ID_TOKEN_KEY = "id_token";
22
5
  export declare class AuthorizationStateService {
23
6
  private readonly http;
24
7
  private readonly state$;
25
8
  private checkTokenCache$;
26
9
  private refreshTokenCache$;
27
- stateSnapshot: AuthorizationState;
28
10
  payloadSnapshot: AccountInfo;
11
+ logout: typeof logout;
29
12
  constructor();
30
- logout(specificUrl?: boolean): void;
31
- private redirectToDex;
13
+ logoutWithAudit(): void;
32
14
  refreshToken(): Observable<TokenResponse>;
33
15
  checkToken(): Observable<unknown>;
34
16
  getTokenPayload<T>(): Observable<T>;
35
17
  getAccountInfo(): Observable<any>;
36
18
  getTokenByStorage(): string;
37
- private getAuthConfiguration;
38
- private getExistedToken;
39
- private getTokenFromLocal;
40
- private setCookieByCode;
41
- private setCookieByToken;
42
- private getParams;
43
19
  static ɵfac: i0.ɵɵFactoryDeclaration<AuthorizationStateService, never>;
44
20
  static ɵprov: i0.ɵɵInjectableDeclaration<AuthorizationStateService>;
45
21
  }
46
- export declare function redirectSSOEntry(entry: string): string;
@@ -17,6 +17,7 @@ export declare class ProjectSelectorComponent implements AfterViewInit {
17
17
  displayFields: ConfigurableField[];
18
18
  isActive: boolean;
19
19
  popupRef: ResourceSelectorPopupRef;
20
+ destroy$: import("rxjs").Observable<void>;
20
21
  constructor(popupService: ResourceSelectorPopupService, cdr: ChangeDetectorRef, elementRef: ElementRef, auth: AuthorizationStateService);
21
22
  ngAfterViewInit(): void;
22
23
  openPopup(): void;
@@ -13,7 +13,7 @@ export declare class ScrollToFirstInvalidDirective {
13
13
  private readonly cdkScrollable;
14
14
  labelOffset: number;
15
15
  aclScrollToFirstInvalid: boolean | '';
16
- get containerEl(): HTMLElement | (Window & typeof globalThis);
16
+ get containerEl(): (Window & typeof globalThis) | HTMLElement;
17
17
  onSubmit(): void;
18
18
  constructor(elRef: ElementRef<HTMLElement>, controlContainer: ControlContainer, cdkScrollable: CdkScrollable);
19
19
  scrollToFirstInvalid(): void;
@@ -9,7 +9,7 @@ export declare class FeatureGateService {
9
9
  private readonly http;
10
10
  private readonly cacheStore;
11
11
  constructor(http: HttpClient);
12
- loadState(cluster?: string): Observable<"loaded" | "loadFailed" | "loading">;
12
+ loadState(cluster?: string): Observable<"loading" | "loaded" | "loadFailed">;
13
13
  /**
14
14
  * check gate status
15
15
  * @param gate - specified feature gate
@@ -455,7 +455,7 @@ export declare const RESOURCE_TYPES: {
455
455
  readonly ARGOCD_APPLICATION_SET: "ARGOCD_APPLICATION_SET";
456
456
  readonly ARGOCD_APPLICATION: "ARGOCD_APPLICATION";
457
457
  };
458
- export declare const getYamlApiVersion: (definition: "ALAUDA_LOADBALANCER2" | "ALB2" | "HELM_REQUEST" | "HELM_REQUEST_V1" | "DEPLOYMENT" | "FRONTEND" | "RULE" | "POD" | "PODS_EXEC" | "PODS_ROOT_EXEC" | "CONFIG_MAP" | "ALERT_TEMPLATE" | "APPLICATION" | "APPLICATION_HISTORY" | "CLUSTER" | "CLUSTER_VIEW" | "DAEMON_SET" | "STATEFUL_SET" | "DOMAIN" | "FEATURE" | "ALAUDA_FEATURE_GATE" | "CLUSTER_ALAUDA_FEATURE_GATE" | "HORIZONTAL_POD_AUTOSCALER" | "LOG" | "PROJECT" | "PROMETHEUS_RULE" | "ALERT_HISTORY" | "SELF_SUBJECT_ACCESS_REVIEW" | "VIEW" | "SERVICE" | "LIMIT_RANGE" | "SECRET" | "PRODUCT" | "CRON_JOB" | "ADVANCED_CRON_JOB" | "JOB" | "INGRESS" | "PERSISTENT_VOLUME_CLAIM" | "NAMESPACE" | "NODE" | "NODE_METRICS" | "PV" | "CRD" | "CHART_REPO" | "CHART" | "NETWORK_POLICY" | "SERVICE_ACCOUNT" | "REPLICA_SET" | "POD_SECURITY_POLICY" | "NAMESPACE_OVERVIEW" | "CSP" | "RESOURCE_QUOTA" | "CLUSTER_NETWORK_POLICY" | "VIRTUAL_MACHINE" | "VIRTUAL_MACHINE_INSTANCE" | "VIRTUAL_MACHINE_POOL" | "PROJECT_QUOTA" | "TKE_CLUSTER" | "TKE_MACHINE" | "MACHINE" | "NODE_GROUP" | "CLUSTERSERVICEVERSION" | "TENANT" | "SUBSCRIPTION" | "PACKAGE_MANIFEST" | "BUCKET_CLASS" | "PRODUCT_CONFIG" | "STORAGE_CLASS" | "VOLUME_SNAPSHOT_CLASS" | "PRODUCT_BASE" | "MODULE_INFO" | "PRODUCT_ENTRY" | "PRODUCT_DOCS_ENTRY" | "SERVICEMESH_GROUP" | "CLUSTER_MODULE" | "USER_BINDING" | "BATCH_ACTION" | "EVENT" | "SERVICE_MONITOR" | "OAM_APPLICATION" | "ARGOCD_APPLICATION_SET" | "ARGOCD_APPLICATION" | {
458
+ export declare const getYamlApiVersion: (definition: "PROJECT" | "ALAUDA_LOADBALANCER2" | "ALB2" | "HELM_REQUEST" | "HELM_REQUEST_V1" | "DEPLOYMENT" | "FRONTEND" | "RULE" | "POD" | "PODS_EXEC" | "PODS_ROOT_EXEC" | "CONFIG_MAP" | "ALERT_TEMPLATE" | "APPLICATION" | "APPLICATION_HISTORY" | "CLUSTER" | "CLUSTER_VIEW" | "DAEMON_SET" | "STATEFUL_SET" | "DOMAIN" | "FEATURE" | "ALAUDA_FEATURE_GATE" | "CLUSTER_ALAUDA_FEATURE_GATE" | "HORIZONTAL_POD_AUTOSCALER" | "LOG" | "PROMETHEUS_RULE" | "ALERT_HISTORY" | "SELF_SUBJECT_ACCESS_REVIEW" | "VIEW" | "SERVICE" | "LIMIT_RANGE" | "SECRET" | "PRODUCT" | "CRON_JOB" | "ADVANCED_CRON_JOB" | "JOB" | "INGRESS" | "PERSISTENT_VOLUME_CLAIM" | "NAMESPACE" | "NODE" | "NODE_METRICS" | "PV" | "CRD" | "CHART_REPO" | "CHART" | "NETWORK_POLICY" | "SERVICE_ACCOUNT" | "REPLICA_SET" | "POD_SECURITY_POLICY" | "NAMESPACE_OVERVIEW" | "CSP" | "RESOURCE_QUOTA" | "CLUSTER_NETWORK_POLICY" | "VIRTUAL_MACHINE" | "VIRTUAL_MACHINE_INSTANCE" | "VIRTUAL_MACHINE_POOL" | "PROJECT_QUOTA" | "TKE_CLUSTER" | "TKE_MACHINE" | "MACHINE" | "NODE_GROUP" | "CLUSTERSERVICEVERSION" | "TENANT" | "SUBSCRIPTION" | "PACKAGE_MANIFEST" | "BUCKET_CLASS" | "PRODUCT_CONFIG" | "STORAGE_CLASS" | "VOLUME_SNAPSHOT_CLASS" | "PRODUCT_BASE" | "MODULE_INFO" | "PRODUCT_ENTRY" | "PRODUCT_DOCS_ENTRY" | "SERVICEMESH_GROUP" | "CLUSTER_MODULE" | "USER_BINDING" | "BATCH_ACTION" | "EVENT" | "SERVICE_MONITOR" | "OAM_APPLICATION" | "ARGOCD_APPLICATION_SET" | "ARGOCD_APPLICATION" | {
459
459
  apiGroup: string;
460
460
  type: string;
461
461
  } | {
@@ -4,7 +4,7 @@ export declare class CacheStore<P, V> {
4
4
  private readonly share;
5
5
  private readonly validator;
6
6
  private readonly store;
7
- constructor({ fetcher, share, validator }: CacheStoreOptions<V, P>);
7
+ constructor({ fetcher, share, validator }: CacheStoreOptions<P, V>);
8
8
  fetchState(params: P): Observable<CacheLoadState<V>>;
9
9
  fetch(params: P): Observable<V>;
10
10
  refetch(params: P): void;
@@ -18,10 +18,10 @@ export declare class CacheStore<P, V> {
18
18
  values: () => IterableIterator<Cache<V>>;
19
19
  keys: () => IterableIterator<P>;
20
20
  }
21
- export interface CacheStoreOptions<V, P> {
21
+ export interface CacheStoreOptions<P, V> {
22
22
  fetcher: (params: P) => Observable<V>;
23
23
  share?: <T>() => MonoTypeOperatorFunction<T>;
24
- validator?: (value: V) => boolean;
24
+ validator?: (loadState: CacheLoadState<V>) => boolean;
25
25
  }
26
26
  export interface CacheLoadState<V> {
27
27
  state: 'loading' | 'loaded' | 'loadFailed';
@@ -0,0 +1,157 @@
1
+ import { getTopWindow, NOT_NOTIFY_ON_ERROR_HEADERS, } from '../core/public-api';
2
+ import { getInitUrl, recordInitUrl } from './app-init-url';
3
+ import { CALLBACK_API, CODE_KEY, EXTERNAL_REDIRECT_API, ID_TOKEN_KEY, LOGIN_API, LOGOUT_API, REDIRECT_URIS, } from './constants';
4
+ import { cleanStorageToken, readStorageToken, refreshStorageAliveRecord, writeStorageToken, } from './storage-token';
5
+ let AUTHORIZATION_STATE;
6
+ export async function fetchAuthorizationState() {
7
+ if (AUTHORIZATION_STATE !== undefined) {
8
+ return AUTHORIZATION_STATE;
9
+ }
10
+ recordInitUrl();
11
+ const config = await getAuthConfiguration();
12
+ const state = await getExistedToken(config);
13
+ const authorizationState = { ...config, ...state };
14
+ initAuthorizationState(authorizationState);
15
+ return authorizationState;
16
+ }
17
+ export function getAuthorizationState() {
18
+ if (AUTHORIZATION_STATE === undefined) {
19
+ throw new Error('AuthorizationState have not been initialized');
20
+ }
21
+ return AUTHORIZATION_STATE;
22
+ }
23
+ export function initAuthorizationState(state) {
24
+ if (AUTHORIZATION_STATE !== undefined &&
25
+ // @ts-expect-error -- webpack specific
26
+ !module.hot) {
27
+ throw new Error('authorizationState have been initialized');
28
+ }
29
+ AUTHORIZATION_STATE = state;
30
+ }
31
+ export function attachAuthorizationHeader() {
32
+ const idToken = readStorageToken();
33
+ return idToken
34
+ ? {
35
+ Authorization: `Bearer ${idToken}`,
36
+ }
37
+ : {};
38
+ }
39
+ export async function logoutAudit() {
40
+ return fetch(LOGOUT_API, {
41
+ headers: {
42
+ ...attachAuthorizationHeader(),
43
+ ...NOT_NOTIFY_ON_ERROR_HEADERS,
44
+ },
45
+ })
46
+ .then(res => res?.json())
47
+ .catch(() => null); // logout API 未指定 logout_redirect_url 时 res?.json() 会失败
48
+ }
49
+ export function logout(returnCurrentPage = false) {
50
+ cleanStorageToken();
51
+ const logoutUrl = typeof returnCurrentPage === 'string' && returnCurrentPage !== ''
52
+ ? returnCurrentPage
53
+ : dexLogoutUrl(!!returnCurrentPage);
54
+ try {
55
+ getTopWindow().location.href = logoutUrl;
56
+ }
57
+ catch {
58
+ // should never happen, just for robustness in case of cross-origin iframe
59
+ location.href = logoutUrl;
60
+ }
61
+ }
62
+ export function redirectSSOEntry(entry) {
63
+ const hasQuery = entry.includes('?');
64
+ if (hasQuery) {
65
+ const [url, query] = entry.split('?');
66
+ return `${EXTERNAL_REDIRECT_API}?redirect_url=${url}&${query}`;
67
+ }
68
+ return `${EXTERNAL_REDIRECT_API}?redirect_url=${entry}`;
69
+ }
70
+ function dexLogoutUrl(returnCurrentPage = false) {
71
+ const { authUrl } = getAuthorizationState();
72
+ return replaceRedirectUrl(authUrl,
73
+ // authUrl 中的 redirectUrl 是根路由,根路由二次重定向回 portal 时会丢失 code 导致登录失败
74
+ // 如果后期有定制化要求默认首页不是 portal,可以改回之前的方案,使用浏览器导航打开 logoutUrl,然后 dex 重定向到根路由,根路由重定向到默认首页,首页再将 authUrl 中的 redirectUrl 替换为当前 url 跳转到 dex 进行登录;
75
+ // 最好环境变量增加默认首页地址或者 dex redirectUrl 直接是正确地址
76
+ returnCurrentPage ? location.href : location.origin + '/console-portal');
77
+ }
78
+ function replaceRedirectUrl(dexUrl, redirectUrl) {
79
+ const [path, queryParams] = dexUrl.split('?');
80
+ const replacedQueryParams = queryParams
81
+ .split('&')
82
+ .map(pair => {
83
+ const [key, value] = pair.split('=');
84
+ return REDIRECT_URIS.has(key)
85
+ ? `${key}=${encodeURIComponent(redirectUrl)}`
86
+ : `${key}=${value}`;
87
+ })
88
+ .join('&');
89
+ return `${path}?${replacedQueryParams}`;
90
+ }
91
+ async function getAuthConfiguration() {
92
+ return fetch(LOGIN_API)
93
+ .then(res => res.json())
94
+ .then(({ auth_url: authUrl, state, logout_url: logoutUrl, }) => ({
95
+ authUrl,
96
+ state,
97
+ logoutUrl,
98
+ }));
99
+ }
100
+ async function getExistedToken(config) {
101
+ try {
102
+ return getTokenFromLocal(config);
103
+ }
104
+ catch {
105
+ return {};
106
+ }
107
+ }
108
+ async function getTokenFromLocal(config) {
109
+ const { queryParams, hashParams } = getParams();
110
+ const code = queryParams[CODE_KEY] || hashParams[CODE_KEY];
111
+ const idToken = queryParams[ID_TOKEN_KEY] || hashParams[ID_TOKEN_KEY];
112
+ if (!code && !idToken) {
113
+ return null;
114
+ }
115
+ refreshStorageAliveRecord();
116
+ return code ? setCookieByCode(code, config.state) : setCookieByToken(idToken);
117
+ }
118
+ async function setCookieByCode(code, state) {
119
+ const queryParams = new URLSearchParams({ code, state });
120
+ const tokenResponse = await fetch(`${CALLBACK_API}?${queryParams.toString()}`).then(res => res.json());
121
+ return mapTokenResponse(tokenResponse);
122
+ }
123
+ async function setCookieByToken(idToken) {
124
+ const queryParams = new URLSearchParams({ id_token: idToken });
125
+ const tokenResponse = await fetch(`${CALLBACK_API}?${queryParams.toString()}`).then(res => res.json());
126
+ return mapTokenResponse(tokenResponse);
127
+ }
128
+ function mapTokenResponse(response) {
129
+ const { id_token: idToken, token_type, token_storage, expire_at, issued_at, } = response;
130
+ writeStorageToken(idToken);
131
+ return {
132
+ storageType: token_storage,
133
+ tokenType: token_type,
134
+ expireAt: expire_at,
135
+ issuedAt: issued_at,
136
+ };
137
+ }
138
+ function getParams() {
139
+ const initUrl = getInitUrl();
140
+ const initLocation = new URL(initUrl);
141
+ const queryParams = parseParams(initLocation.search ? initLocation.search.slice(1) : '');
142
+ const hashParams = parseParams(initLocation.hash ? initLocation.hash.slice(1) : '');
143
+ return { queryParams, hashParams };
144
+ }
145
+ function parseParams(query) {
146
+ if (!query) {
147
+ return {};
148
+ }
149
+ return query.split('&').reduce((acc, param) => {
150
+ const [key, value] = param.split('=');
151
+ return {
152
+ ...acc,
153
+ [key]: value,
154
+ };
155
+ }, {});
156
+ }
157
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aG9yaXphdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvY29tbW9uL3NyYy9hdXRob3JpemF0aW9uL2F1dGhvcml6YXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFlBQVksRUFDWiwyQkFBMkIsR0FFNUIsTUFBTSxvQkFBb0IsQ0FBQztBQUc1QixPQUFPLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNELE9BQU8sRUFDTCxZQUFZLEVBQ1osUUFBUSxFQUNSLHFCQUFxQixFQUNyQixZQUFZLEVBQ1osU0FBUyxFQUNULFVBQVUsRUFDVixhQUFhLEdBQ2QsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixnQkFBZ0IsRUFDaEIseUJBQXlCLEVBQ3pCLGlCQUFpQixHQUNsQixNQUFNLGlCQUFpQixDQUFDO0FBbUJ6QixJQUFJLG1CQUF1QyxDQUFDO0FBRTVDLE1BQU0sQ0FBQyxLQUFLLFVBQVUsdUJBQXVCO0lBQzNDLElBQUksbUJBQW1CLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDdEMsT0FBTyxtQkFBbUIsQ0FBQztJQUM3QixDQUFDO0lBRUQsYUFBYSxFQUFFLENBQUM7SUFFaEIsTUFBTSxNQUFNLEdBQUcsTUFBTSxvQkFBb0IsRUFBRSxDQUFDO0lBRTVDLE1BQU0sS0FBSyxHQUFHLE1BQU0sZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRTVDLE1BQU0sa0JBQWtCLEdBQUcsRUFBRSxHQUFHLE1BQU0sRUFBRSxHQUFHLEtBQUssRUFBRSxDQUFDO0lBRW5ELHNCQUFzQixDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFFM0MsT0FBTyxrQkFBa0IsQ0FBQztBQUM1QixDQUFDO0FBRUQsTUFBTSxVQUFVLHFCQUFxQjtJQUNuQyxJQUFJLG1CQUFtQixLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ3RDLE1BQU0sSUFB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LENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFdEMsT0FBTztZQUNMLEdBQUcsR0FBRztZQUNOLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSztTQUNiLENBQUM7SUFDSixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDVCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgZ2V0VG9wV2luZG93LFxuICBOT1RfTk9USUZZX09OX0VSUk9SX0hFQURFUlMsXG4gIFN0cmluZ01hcCxcbn0gZnJvbSAnLi4vY29yZS9wdWJsaWMtYXBpJztcbmltcG9ydCB7IEFjY291bnRJbmZvIH0gZnJvbSAnLi4vcGFnZS1zY2FmZm9sZC9wdWJsaWMtYXBpJztcblxuaW1wb3J0IHsgZ2V0SW5pdFVybCwgcmVjb3JkSW5pdFVybCB9IGZyb20gJy4vYXBwLWluaXQtdXJsJztcbmltcG9ydCB7XG4gIENBTExCQUNLX0FQSSxcbiAgQ09ERV9LRVksXG4gIEVYVEVSTkFMX1JFRElSRUNUX0FQSSxcbiAgSURfVE9LRU5fS0VZLFxuICBMT0dJTl9BUEksXG4gIExPR09VVF9BUEksXG4gIFJFRElSRUNUX1VSSVMsXG59IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7XG4gIGNsZWFuU3RvcmFnZVRva2VuLFxuICByZWFkU3RvcmFnZVRva2VuLFxuICByZWZyZXNoU3RvcmFnZUFsaXZlUmVjb3JkLFxuICB3cml0ZVN0b3JhZ2VUb2tlbixcbn0gZnJvbSAnLi9zdG9yYWdlLXRva2VuJztcblxuZXhwb3J0IGludGVyZmFjZSBBdXRob3JpemF0aW9uU3RhdGUge1xuICBleHBpcmVBdD86IHN0cmluZztcbiAgaXNzdWVkQXQ/OiBzdHJpbmc7XG4gIHN0YXRlPzogc3RyaW5nO1xuICBhdXRoVXJsPzogc3RyaW5nO1xuICBsb2dvdXRVcmw/OiBzdHJpbmc7XG4gIGluZm8/OiBBY2NvdW50SW5mbztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUb2tlblJlc3BvbnNlIHtcbiAgdG9rZW5fc3RvcmFnZTogc3RyaW5nO1xuICB0b2tlbl90eXBlOiBzdHJpbmc7XG4gIGV4cGlyZV9hdDogc3RyaW5nO1xuICBpc3N1ZWRfYXQ6IHN0cmluZztcbiAgaWRfdG9rZW4/OiBzdHJpbmc7XG59XG5cbmxldCBBVVRIT1JJWkFUSU9OX1NUQVRFOiBBdXRob3JpemF0aW9uU3RhdGU7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmZXRjaEF1dGhvcml6YXRpb25TdGF0ZSgpIHtcbiAgaWYgKEFVVEhPUklaQVRJT05fU1RBVEUgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBBVVRIT1JJWkFUSU9OX1NUQVRFO1xuICB9XG5cbiAgcmVjb3JkSW5pdFVybCgpO1xuXG4gIGNvbnN0IGNvbmZpZyA9IGF3YWl0IGdldEF1dGhDb25maWd1cmF0aW9uKCk7XG5cbiAgY29uc3Qgc3RhdGUgPSBhd2FpdCBnZXRFeGlzdGVkVG9rZW4oY29uZmlnKTtcblxuICBjb25zdCBhdXRob3JpemF0aW9uU3RhdGUgPSB7IC4uLmNvbmZpZywgLi4uc3RhdGUgfTtcblxuICBpbml0QXV0aG9yaXphdGlvblN0YXRlKGF1dGhvcml6YXRpb25TdGF0ZSk7XG5cbiAgcmV0dXJuIGF1dGhvcml6YXRpb25TdGF0ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEF1dGhvcml6YXRpb25TdGF0ZSgpIHtcbiAgaWYgKEFVVEhPUklaQVRJT05fU1RBVEUgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignQXV0aG9yaXphdGlvblN0YXRlIGhhdmUgbm90IGJlZW4gaW5pdGlhbGl6ZWQnKTtcbiAgfVxuXG4gIHJldHVybiBBVVRIT1JJWkFUSU9OX1NUQVRFO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5pdEF1dGhvcml6YXRpb25TdGF0ZShzdGF0ZTogQXV0aG9yaXphdGlvblN0YXRlKTogdm9pZCB7XG4gIGlmIChcbiAgICBBVVRIT1JJWkFUSU9OX1NUQVRFICE9PSB1bmRlZmluZWQgJiZcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0tIHdlYnBhY2sgc3BlY2lmaWNcbiAgICAhbW9kdWxlLmhvdFxuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2F1dGhvcml6YXRpb25TdGF0ZSBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQnKTtcbiAgfVxuXG4gIEFVVEhPUklaQVRJT05fU1RBVEUgPSBzdGF0ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGF0dGFjaEF1dGhvcml6YXRpb25IZWFkZXIoKTogeyBBdXRob3JpemF0aW9uPzogc3RyaW5nIH0ge1xuICBjb25zdCBpZFRva2VuID0gcmVhZFN0b3JhZ2VUb2tlbigpO1xuICByZXR1cm4gaWRUb2tlblxuICAgID8ge1xuICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7aWRUb2tlbn1gLFxuICAgICAgfVxuICAgIDoge307XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2dvdXRBdWRpdCgpOiBQcm9taXNlPHsgbG9nb3V0X3JlZGlyZWN0X3VybD86IHN0cmluZyB9PiB7XG4gIHJldHVybiBmZXRjaChMT0dPVVRfQVBJLCB7XG4gICAgaGVhZGVyczoge1xuICAgICAgLi4uYXR0YWNoQXV0aG9yaXphdGlvbkhlYWRlcigpLFxuICAgICAgLi4uTk9UX05PVElGWV9PTl9FUlJPUl9IRUFERVJTLFxuICAgIH0sXG4gIH0pXG4gICAgLnRoZW4ocmVzID0+IHJlcz8uanNvbigpKVxuICAgIC5jYXRjaCgoKSA9PiBudWxsKTsgLy8gbG9nb3V0IEFQSSDmnKrmjIflrpogbG9nb3V0X3JlZGlyZWN0X3VybCDml7YgcmVzPy5qc29uKCkg5Lya5aSx6LSlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBsb2dvdXQocmV0dXJuQ3VycmVudFBhZ2U6IGJvb2xlYW4gfCBzdHJpbmcgPSBmYWxzZSkge1xuICBjbGVhblN0b3JhZ2VUb2tlbigpO1xuXG4gIGNvbnN0IGxvZ291dFVybCA9XG4gICAgdHlwZW9mIHJldHVybkN1cnJlbnRQYWdlID09PSAnc3RyaW5nJyAmJiByZXR1cm5DdXJyZW50UGFnZSAhPT0gJydcbiAgICAgID8gcmV0dXJuQ3VycmVudFBhZ2VcbiAgICAgIDogZGV4TG9nb3V0VXJsKCEhcmV0dXJuQ3VycmVudFBhZ2UpO1xuXG4gIHRyeSB7XG4gICAgZ2V0VG9wV2luZG93KCkubG9jYXRpb24uaHJlZiA9IGxvZ291dFVybDtcbiAgfSBjYXRjaCB7XG4gICAgLy8gc2hvdWxkIG5ldmVyIGhhcHBlbiwganVzdCBmb3Igcm9idXN0bmVzcyBpbiBjYXNlIG9mIGNyb3NzLW9yaWdpbiBpZnJhbWVcbiAgICBsb2NhdGlvbi5ocmVmID0gbG9nb3V0VXJsO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWRpcmVjdFNTT0VudHJ5KGVudHJ5OiBzdHJpbmcpIHtcbiAgY29uc3QgaGFzUXVlcnkgPSBlbnRyeS5pbmNsdWRlcygnPycpO1xuXG4gIGlmIChoYXNRdWVyeSkge1xuICAgIGNvbnN0IFt1cmwsIHF1ZXJ5XSA9IGVudHJ5LnNwbGl0KCc/Jyk7XG4gICAgcmV0dXJuIGAke0VYVEVSTkFMX1JFRElSRUNUX0FQSX0/cmVkaXJlY3RfdXJsPSR7dXJsfSYke3F1ZXJ5fWA7XG4gIH1cblxuICByZXR1cm4gYCR7RVhURVJOQUxfUkVESVJFQ1RfQVBJfT9yZWRpcmVjdF91cmw9JHtlbnRyeX1gO1xufVxuXG5mdW5jdGlvbiBkZXhMb2dvdXRVcmwocmV0dXJuQ3VycmVudFBhZ2UgPSBmYWxzZSkge1xuICBjb25zdCB7IGF1dGhVcmwgfSA9IGdldEF1dGhvcml6YXRpb25TdGF0ZSgpO1xuICByZXR1cm4gcmVwbGFjZVJlZGlyZWN0VXJsKFxuICAgIGF1dGhVcmwsXG4gICAgLy8gYXV0aFVybCDkuK3nmoQgcmVkaXJlY3RVcmwg5piv5qC56Lev55Sx77yM5qC56Lev55Sx5LqM5qyh6YeN5a6a5ZCR5ZueIHBvcnRhbCDml7bkvJrkuKLlpLEgY29kZSDlr7zoh7TnmbvlvZXlpLHotKVcbiAgICAvLyDlpoLmnpzlkI7mnJ/mnInlrprliLbljJbopoHmsYLpu5jorqTpppbpobXkuI3mmK8gcG9ydGFs77yM5Y+v5Lul5pS55Zue5LmL5YmN55qE5pa55qGI77yM5L2/55So5rWP6KeI5Zmo5a+86Iiq5omT5byAIGxvZ291dFVybO+8jOeEtuWQjiBkZXgg6YeN5a6a5ZCR5Yiw5qC56Lev55Sx77yM5qC56Lev55Sx6YeN5a6a5ZCR5Yiw6buY6K6k6aaW6aG177yM6aaW6aG15YaN5bCGIGF1dGhVcmwg5Lit55qEIHJlZGlyZWN0VXJsIOabv+aNouS4uuW9k+WJjSB1cmwg6Lez6L2s5YiwIGRleCDov5vooYznmbvlvZXvvJtcbiAgICAvLyDmnIDlpb3njq/looPlj5jph4/lop7liqDpu5jorqTpppbpobXlnLDlnYDmiJbogIUgZGV4IHJlZGlyZWN0VXJsIOebtOaOpeaYr+ato+ehruWcsOWdgFxuICAgIHJldHVybkN1cnJlbnRQYWdlID8gbG9jYXRpb24uaHJlZiA6IGxvY2F0aW9uLm9yaWdpbiArICcvY29uc29sZS1wb3J0YWwnLFxuICApO1xufVxuXG5mdW5jdGlvbiByZXBsYWNlUmVkaXJlY3RVcmwoZGV4VXJsOiBzdHJpbmcsIHJlZGlyZWN0VXJsOiBzdHJpbmcpIHtcbiAgY29uc3QgW3BhdGgsIHF1ZXJ5UGFyYW1zXSA9IGRleFVybC5zcGxpdCgnPycpO1xuXG4gIGNvbnN0IHJlcGxhY2VkUXVlcnlQYXJhbXMgPSBxdWVyeVBhcmFtc1xuICAgIC5zcGxpdCgnJicpXG4gICAgLm1hcChwYWlyID0+IHtcbiAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IHBhaXIuc3BsaXQoJz0nKTtcbiAgICAgIHJldHVybiBSRURJUkVDVF9VUklTLmhhcyhrZXkpXG4gICAgICAgID8gYCR7a2V5fT0ke2VuY29kZVVSSUNvbXBvbmVudChyZWRpcmVjdFVybCl9YFxuICAgICAgICA6IGAke2tleX09JHt2YWx1ZX1gO1xuICAgIH0pXG4gICAgLmpvaW4oJyYnKTtcblxuICByZXR1cm4gYCR7cGF0aH0/JHtyZXBsYWNlZFF1ZXJ5UGFyYW1zfWA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEF1dGhDb25maWd1cmF0aW9uKCkge1xuICByZXR1cm4gZmV0Y2goTE9HSU5fQVBJKVxuICAgIC50aGVuKHJlcyA9PiByZXMuanNvbigpKVxuICAgIC50aGVuKFxuICAgICAgKHtcbiAgICAgICAgYXV0aF91cmw6IGF1dGhVcmwsXG4gICAgICAgIHN0YXRlLFxuICAgICAgICBsb2dvdXRfdXJsOiBsb2dvdXRVcmwsXG4gICAgICB9OiB7XG4gICAgICAgIGF1dGhfdXJsOiBzdHJpbmc7XG4gICAgICAgIHN0YXRlOiBzdHJpbmc7XG4gICAgICAgIGxvZ291dF91cmw6IHN0cmluZztcbiAgICAgIH0pID0+ICh7XG4gICAgICAgIGF1dGhVcmwsXG4gICAgICAgIHN0YXRlLFxuICAgICAgICBsb2dvdXRVcmwsXG4gICAgICB9KSxcbiAgICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRFeGlzdGVkVG9rZW4oY29uZmlnOiBBdXRob3JpemF0aW9uU3RhdGUpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZ2V0VG9rZW5Gcm9tTG9jYWwoY29uZmlnKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHt9IGFzIEF1dGhvcml6YXRpb25TdGF0ZTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRUb2tlbkZyb21Mb2NhbChcbiAgY29uZmlnOiBBdXRob3JpemF0aW9uU3RhdGUsXG4pOiBQcm9taXNlPEF1dGhvcml6YXRpb25TdGF0ZT4ge1xuICBjb25zdCB7IHF1ZXJ5UGFyYW1zLCBoYXNoUGFyYW1zIH0gPSBnZXRQYXJhbXMoKTtcblxuICBjb25zdCBjb2RlID0gcXVlcnlQYXJhbXNbQ09ERV9LRVldIHx8IGhhc2hQYXJhbXNbQ09ERV9LRVldO1xuICBjb25zdCBpZFRva2VuID0gcXVlcnlQYXJhbXNbSURfVE9LRU5fS0VZXSB8fCBoYXNoUGFyYW1zW0lEX1RPS0VOX0tFWV07XG5cbiAgaWYgKCFjb2RlICYmICFpZFRva2VuKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZWZyZXNoU3RvcmFnZUFsaXZlUmVjb3JkKCk7XG5cbiAgcmV0dXJuIGNvZGUgPyBzZXRDb29raWVCeUNvZGUoY29kZSwgY29uZmlnLnN0YXRlKSA6IHNldENvb2tpZUJ5VG9rZW4oaWRUb2tlbik7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNldENvb2tpZUJ5Q29kZShjb2RlOiBzdHJpbmcsIHN0YXRlOiBzdHJpbmcpIHtcbiAgY29uc3QgcXVlcnlQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHsgY29kZSwgc3RhdGUgfSk7XG5cbiAgY29uc3QgdG9rZW5SZXNwb25zZTogVG9rZW5SZXNwb25zZSA9IGF3YWl0IGZldGNoKFxuICAgIGAke0NBTExCQUNLX0FQSX0/JHtxdWVyeVBhcmFtcy50b1N0cmluZygpfWAsXG4gICkudGhlbihyZXMgPT4gcmVzLmpzb24oKSk7XG5cbiAgcmV0dXJuIG1hcFRva2VuUmVzcG9uc2UodG9rZW5SZXNwb25zZSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNldENvb2tpZUJ5VG9rZW4oaWRUb2tlbjogc3RyaW5nKSB7XG4gIGNvbnN0IHF1ZXJ5UGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh7IGlkX3Rva2VuOiBpZFRva2VuIH0pO1xuXG4gIGNvbnN0IHRva2VuUmVzcG9uc2U6IFRva2VuUmVzcG9uc2UgPSBhd2FpdCBmZXRjaChcbiAgICBgJHtDQUxMQkFDS19BUEl9PyR7cXVlcnlQYXJhbXMudG9TdHJpbmcoKX1gLFxuICApLnRoZW4ocmVzID0+IHJlcy5qc29uKCkpO1xuXG4gIHJldHVybiBtYXBUb2tlblJlc3BvbnNlKHRva2VuUmVzcG9uc2UpO1xufVxuXG5mdW5jdGlvbiBtYXBUb2tlblJlc3BvbnNlKHJlc3BvbnNlOiBUb2tlblJlc3BvbnNlKSB7XG4gIGNvbnN0IHtcbiAgICBpZF90b2tlbjogaWRUb2tlbixcbiAgICB0b2tlbl90eXBlLFxuICAgIHRva2VuX3N0b3JhZ2UsXG4gICAgZXhwaXJlX2F0LFxuICAgIGlzc3VlZF9hdCxcbiAgfSA9IHJlc3BvbnNlO1xuXG4gIHdyaXRlU3RvcmFnZVRva2VuKGlkVG9rZW4pO1xuXG4gIHJldHVybiB7XG4gICAgc3RvcmFnZVR5cGU6IHRva2VuX3N0b3JhZ2UsXG4gICAgdG9rZW5UeXBlOiB0b2tlbl90eXBlLFxuICAgIGV4cGlyZUF0OiBleHBpcmVfYXQsXG4gICAgaXNzdWVkQXQ6IGlzc3VlZF9hdCxcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0UGFyYW1zKCkge1xuICBjb25zdCBpbml0VXJsID0gZ2V0SW5pdFVybCgpO1xuXG4gIGNvbnN0IGluaXRMb2NhdGlvbiA9IG5ldyBVUkwoaW5pdFVybCk7XG5cbiAgY29uc3QgcXVlcnlQYXJhbXMgPSBwYXJzZVBhcmFtcyhcbiAgICBpbml0TG9jYXRpb24uc2VhcmNoID8gaW5pdExvY2F0aW9uLnNlYXJjaC5zbGljZSgxKSA6ICcnLFxuICApO1xuXG4gIGNvbnN0IGhhc2hQYXJhbXMgPSBwYXJzZVBhcmFtcyhcbiAgICBpbml0TG9jYXRpb24uaGFzaCA/IGluaXRMb2NhdGlvbi5oYXNoLnNsaWNlKDEpIDogJycsXG4gICk7XG5cbiAgcmV0dXJuIHsgcXVlcnlQYXJhbXMsIGhhc2hQYXJhbXMgfTtcbn1cblxuZnVuY3Rpb24gcGFyc2VQYXJhbXMocXVlcnk6IHN0cmluZyk6IFN0cmluZ01hcCB7XG4gIGlmICghcXVlcnkpIHtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICByZXR1cm4gcXVlcnkuc3BsaXQoJyYnKS5yZWR1Y2UoKGFjYywgcGFyYW0pID0+IHtcbiAgICBjb25zdCBba2V5LCB2YWx1ZV0gPSBwYXJhbS5zcGxpdCgnPScpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmFjYyxcbiAgICAgIFtrZXldOiB2YWx1ZSxcbiAgICB9O1xuICB9LCB7fSk7XG59XG4iXX0=
@@ -0,0 +1,15 @@
1
+ export const STORAGE_TYPE_KEY = 'token_storage';
2
+ export const CODE_KEY = 'code';
3
+ export const ID_TOKEN_KEY = 'id_token';
4
+ export const LOADING_CACHE = 15_000;
5
+ export const LOGIN_API = '/console/api/v2/token/login';
6
+ export const LOGOUT_API = '/console/api/v2/token/logout';
7
+ export const CALLBACK_API = '/console/api/v2/token/callback';
8
+ export const TOKEN_REFRESH_API = '/console/api/v2/token/refresh';
9
+ export const TOKEN_INFO_API = '/console/api/v2/token/info';
10
+ export const EXTERNAL_REDIRECT_API = '/console/api/v2/token/redirect';
11
+ export const REDIRECT_URIS = new Set([
12
+ 'redirect_uri',
13
+ 'post_logout_redirect_uri',
14
+ ]);
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9jb21tb24vc3JjL2F1dGhvcml6YXRpb24vY29uc3RhbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLGVBQWUsQ0FBQztBQUNoRCxNQUFNLENBQUMsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDO0FBQy9CLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxVQUFVLENBQUM7QUFFdkMsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQztBQUVwQyxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcsNkJBQTZCLENBQUM7QUFDdkQsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLDhCQUE4QixDQUFDO0FBQ3pELE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxnQ0FBZ0MsQ0FBQztBQUM3RCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRywrQkFBK0IsQ0FBQztBQUNqRSxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsNEJBQTRCLENBQUM7QUFDM0QsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsZ0NBQWdDLENBQUM7QUFFdEUsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLElBQUksR0FBRyxDQUFDO0lBQ25DLGNBQWM7SUFDZCwwQkFBMEI7Q0FDM0IsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IFNUT1JBR0VfVFlQRV9LRVkgPSAndG9rZW5fc3RvcmFnZSc7XG5leHBvcnQgY29uc3QgQ09ERV9LRVkgPSAnY29kZSc7XG5leHBvcnQgY29uc3QgSURfVE9LRU5fS0VZID0gJ2lkX3Rva2VuJztcblxuZXhwb3J0IGNvbnN0IExPQURJTkdfQ0FDSEUgPSAxNV8wMDA7XG5cbmV4cG9ydCBjb25zdCBMT0dJTl9BUEkgPSAnL2NvbnNvbGUvYXBpL3YyL3Rva2VuL2xvZ2luJztcbmV4cG9ydCBjb25zdCBMT0dPVVRfQVBJID0gJy9jb25zb2xlL2FwaS92Mi90b2tlbi9sb2dvdXQnO1xuZXhwb3J0IGNvbnN0IENBTExCQUNLX0FQSSA9ICcvY29uc29sZS9hcGkvdjIvdG9rZW4vY2FsbGJhY2snO1xuZXhwb3J0IGNvbnN0IFRPS0VOX1JFRlJFU0hfQVBJID0gJy9jb25zb2xlL2FwaS92Mi90b2tlbi9yZWZyZXNoJztcbmV4cG9ydCBjb25zdCBUT0tFTl9JTkZPX0FQSSA9ICcvY29uc29sZS9hcGkvdjIvdG9rZW4vaW5mbyc7XG5leHBvcnQgY29uc3QgRVhURVJOQUxfUkVESVJFQ1RfQVBJID0gJy9jb25zb2xlL2FwaS92Mi90b2tlbi9yZWRpcmVjdCc7XG5cbmV4cG9ydCBjb25zdCBSRURJUkVDVF9VUklTID0gbmV3IFNldChbXG4gICdyZWRpcmVjdF91cmknLFxuICAncG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpJyxcbl0pO1xuIl19
@@ -10,4 +10,6 @@ export * from './app-init-url';
10
10
  export * from './session-manage.service';
11
11
  export * from './state.service';
12
12
  export * from './storage-token';
13
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvY29tbW9uL3NyYy9hdXRob3JpemF0aW9uL3B1YmxpYy1hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUVILGNBQWM7QUFDZCxjQUFjLGlCQUFpQixDQUFDO0FBQ2hDLGNBQWMsdUJBQXVCLENBQUM7QUFDdEMsY0FBYyxnQkFBZ0IsQ0FBQztBQUMvQixjQUFjLDBCQUEwQixDQUFDO0FBQ3pDLGNBQWMsaUJBQWlCLENBQUM7QUFDaEMsY0FBYyxpQkFBaUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogW1tpbmNsdWRlOmF1dGhvcml6YXRpb24vUkVBRE1FLm1kXV1cbiAqIEBtb2R1bGUgYXV0aG9yaXphdGlvblxuICogQHByZWZlcnJlZFxuICovXG5cbi8qKiBpbXBvcnRzICovXG5leHBvcnQgKiBmcm9tICcuL2d1YXJkLnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9pbnRlcmNlcHRvci5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vYXBwLWluaXQtdXJsJztcbmV4cG9ydCAqIGZyb20gJy4vc2Vzc2lvbi1tYW5hZ2Uuc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL3N0YXRlLnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9zdG9yYWdlLXRva2VuJztcbiJdfQ==
13
+ export * from './authorization';
14
+ export * from './constants';
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvY29tbW9uL3NyYy9hdXRob3JpemF0aW9uL3B1YmxpYy1hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUVILGNBQWM7QUFDZCxjQUFjLGlCQUFpQixDQUFDO0FBQ2hDLGNBQWMsdUJBQXVCLENBQUM7QUFDdEMsY0FBYyxnQkFBZ0IsQ0FBQztBQUMvQixjQUFjLDBCQUEwQixDQUFDO0FBQ3pDLGNBQWMsaUJBQWlCLENBQUM7QUFDaEMsY0FBYyxpQkFBaUIsQ0FBQztBQUNoQyxjQUFjLGlCQUFpQixDQUFDO0FBQ2hDLGNBQWMsYUFBYSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBbW2luY2x1ZGU6YXV0aG9yaXphdGlvbi9SRUFETUUubWRdXVxuICogQG1vZHVsZSBhdXRob3JpemF0aW9uXG4gKiBAcHJlZmVycmVkXG4gKi9cblxuLyoqIGltcG9ydHMgKi9cbmV4cG9ydCAqIGZyb20gJy4vZ3VhcmQuc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL2ludGVyY2VwdG9yLnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9hcHAtaW5pdC11cmwnO1xuZXhwb3J0ICogZnJvbSAnLi9zZXNzaW9uLW1hbmFnZS5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vc3RhdGUuc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL3N0b3JhZ2UtdG9rZW4nO1xuZXhwb3J0ICogZnJvbSAnLi9hdXRob3JpemF0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vY29uc3RhbnRzJztcbiJdfQ==