@verisoft/security-core 20.1.1 → 20.1.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.
- package/fesm2022/verisoft-security-core.mjs +380 -0
- package/fesm2022/verisoft-security-core.mjs.map +1 -0
- package/index.d.ts +153 -0
- package/package.json +17 -3
- package/.eslintrc.json +0 -48
- package/jest.config.ts +0 -21
- package/ng-package.json +0 -7
- package/project.json +0 -36
- package/src/index.ts +0 -1
- package/src/lib/directives/has-permission.directive.ts +0 -54
- package/src/lib/directives/has-role.directive.ts +0 -54
- package/src/lib/directives/index.ts +0 -2
- package/src/lib/guards/auth.guard.ts +0 -55
- package/src/lib/guards/index.ts +0 -1
- package/src/lib/index.ts +0 -6
- package/src/lib/models/authenticated-user.model.ts +0 -8
- package/src/lib/models/config.model.ts +0 -9
- package/src/lib/models/functions.spec.ts +0 -159
- package/src/lib/models/functions.ts +0 -103
- package/src/lib/models/index.ts +0 -3
- package/src/lib/provider.ts +0 -52
- package/src/lib/services/auth-context.service.ts +0 -38
- package/src/lib/services/index.ts +0 -7
- package/src/lib/services/local-storage-token-provider.ts +0 -23
- package/src/lib/services/local-token-provider.ts +0 -15
- package/src/lib/services/login.service.ts +0 -23
- package/src/lib/services/logout.service.ts +0 -15
- package/src/lib/services/security-initializer.ts +0 -26
- package/src/lib/services/session-token-provider.ts +0 -15
- package/src/lib/services/token-provider.ts +0 -5
- package/src/lib/state/actions.ts +0 -7
- package/src/lib/state/feature.ts +0 -10
- package/src/lib/state/index.ts +0 -4
- package/src/lib/state/reducers.ts +0 -11
- package/src/lib/state/selectors.ts +0 -9
- package/src/lib/state/state.ts +0 -9
- package/src/test-setup.ts +0 -8
- package/tsconfig.json +0 -28
- package/tsconfig.lib.json +0 -17
- package/tsconfig.lib.prod.json +0 -9
- package/tsconfig.spec.json +0 -16
|
@@ -0,0 +1,380 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { Injectable, inject, InjectionToken, provideAppInitializer, NgModule, Input, Directive } from '@angular/core';
|
|
3
|
+
import { map, switchMap, of, from, firstValueFrom, distinctUntilChanged } from 'rxjs';
|
|
4
|
+
import * as i1 from '@ngrx/store';
|
|
5
|
+
import { createAction, props, createReducer, on, createFeature, createSelector, StoreModule } from '@ngrx/store';
|
|
6
|
+
import { Router } from '@angular/router';
|
|
7
|
+
|
|
8
|
+
function hasRequiredPermission(user, permission) {
|
|
9
|
+
return hasItems(user?.permissions, permission);
|
|
10
|
+
}
|
|
11
|
+
function hasRequiredRole(user, role) {
|
|
12
|
+
return hasItems(user?.roles, role);
|
|
13
|
+
}
|
|
14
|
+
function hasItems(userItems, neededItems) {
|
|
15
|
+
if (!neededItems || !neededItems.length) {
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
18
|
+
if (!userItems || !userItems.length) {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
const userItemsSet = new Set(userItems);
|
|
22
|
+
if (Array.isArray(neededItems)) {
|
|
23
|
+
return neededItems.some((item) => hasItems(userItems, item));
|
|
24
|
+
}
|
|
25
|
+
if (neededItems.includes(',')) {
|
|
26
|
+
const splitItems = neededItems.split(',').map((i) => i.trim());
|
|
27
|
+
return splitItems.every((i) => userItemsSet.has(i));
|
|
28
|
+
}
|
|
29
|
+
return userItemsSet.has(neededItems);
|
|
30
|
+
}
|
|
31
|
+
function convertJWTToUser(base64Token) {
|
|
32
|
+
if (!base64Token) {
|
|
33
|
+
return undefined;
|
|
34
|
+
}
|
|
35
|
+
try {
|
|
36
|
+
const parts = base64Token.split('.');
|
|
37
|
+
if (parts.length < 2) {
|
|
38
|
+
return undefined;
|
|
39
|
+
}
|
|
40
|
+
const payload = decodeJwtPayload(parts[1]);
|
|
41
|
+
const userName = payload['unique_name'] ?? payload['nameid'];
|
|
42
|
+
if (!userName) {
|
|
43
|
+
return undefined;
|
|
44
|
+
}
|
|
45
|
+
const user = {
|
|
46
|
+
userName,
|
|
47
|
+
userId: payload['nameid'],
|
|
48
|
+
email: payload['email'],
|
|
49
|
+
displayName: payload['name'],
|
|
50
|
+
roles: convertToArray(payload, 'role'),
|
|
51
|
+
permissions: convertToArray(payload, 'permission'),
|
|
52
|
+
};
|
|
53
|
+
return user;
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
return undefined;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
function decodeJwtPayload(jwt) {
|
|
60
|
+
const base64 = jwt.replace(/-/g, '+').replace(/_/g, '/');
|
|
61
|
+
const jsonPayload = decodeURIComponent(atob(base64)
|
|
62
|
+
.split('')
|
|
63
|
+
.map(c => '%' + c.charCodeAt(0).toString(16).padStart(2, '0'))
|
|
64
|
+
.join(''));
|
|
65
|
+
return JSON.parse(jsonPayload);
|
|
66
|
+
}
|
|
67
|
+
function convertToArray(item, propertyName) {
|
|
68
|
+
const rawValue = item[propertyName];
|
|
69
|
+
if (!rawValue) {
|
|
70
|
+
return undefined;
|
|
71
|
+
}
|
|
72
|
+
if (Array.isArray(rawValue)) {
|
|
73
|
+
return rawValue;
|
|
74
|
+
}
|
|
75
|
+
return [rawValue];
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
const setUser = createAction('[Auth] Set User', props());
|
|
79
|
+
|
|
80
|
+
const initialState = {
|
|
81
|
+
user: undefined,
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
const authReducer = createReducer(initialState, on(setUser, (state, action) => ({
|
|
85
|
+
...state,
|
|
86
|
+
user: action.user
|
|
87
|
+
})));
|
|
88
|
+
|
|
89
|
+
const SECURITY_FEATURE_NAME = 'SECURITY';
|
|
90
|
+
const SecurityFeature = createFeature({
|
|
91
|
+
name: SECURITY_FEATURE_NAME,
|
|
92
|
+
reducer: authReducer
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
const selectIsAuthenticated = createSelector(SecurityFeature.selectUser, (user) => !!user);
|
|
96
|
+
const selectUser = SecurityFeature.selectUser;
|
|
97
|
+
|
|
98
|
+
class AuthContextService {
|
|
99
|
+
store;
|
|
100
|
+
user$;
|
|
101
|
+
isAuthenticated$;
|
|
102
|
+
constructor(store) {
|
|
103
|
+
this.store = store;
|
|
104
|
+
this.user$ = this.store.select(selectUser);
|
|
105
|
+
this.isAuthenticated$ = this.store.select(selectIsAuthenticated);
|
|
106
|
+
}
|
|
107
|
+
setUser(user) {
|
|
108
|
+
this.store.dispatch(setUser({ user }));
|
|
109
|
+
}
|
|
110
|
+
hasRequiredPermission(requiredPermissions) {
|
|
111
|
+
return this.user$.pipe(map((user) => hasRequiredPermission(user, requiredPermissions)));
|
|
112
|
+
}
|
|
113
|
+
hasRequiredRole(requiredPermissions) {
|
|
114
|
+
return this.user$.pipe(map((user) => hasRequiredRole(user, requiredPermissions)));
|
|
115
|
+
}
|
|
116
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.1", ngImport: i0, type: AuthContextService, deps: [{ token: i1.Store }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
117
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.2.1", ngImport: i0, type: AuthContextService, providedIn: 'root' });
|
|
118
|
+
}
|
|
119
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.1", ngImport: i0, type: AuthContextService, decorators: [{
|
|
120
|
+
type: Injectable,
|
|
121
|
+
args: [{
|
|
122
|
+
providedIn: 'root',
|
|
123
|
+
}]
|
|
124
|
+
}], ctorParameters: () => [{ type: i1.Store }] });
|
|
125
|
+
|
|
126
|
+
class AuthGuard {
|
|
127
|
+
config = inject(SECURITY_CONFIG);
|
|
128
|
+
router = inject(Router);
|
|
129
|
+
authContext = inject(AuthContextService);
|
|
130
|
+
canActivate(route) {
|
|
131
|
+
return this.checkPermissionsAndRolesAndNavigate(route, this.config.notAuthorizedPage);
|
|
132
|
+
}
|
|
133
|
+
canActivateChild(childRoute) {
|
|
134
|
+
return this.checkPermissionsAndRolesAndNavigate(childRoute, this.config.notAuthorizedPage);
|
|
135
|
+
}
|
|
136
|
+
checkPermissionsAndRolesAndNavigate(route, notAuthorizedUrl) {
|
|
137
|
+
const requiredPermissions = route.data['permissions'];
|
|
138
|
+
const requiredRoles = route.data['roles'];
|
|
139
|
+
return this.authContext.user$.pipe(map((user) => user &&
|
|
140
|
+
(!requiredPermissions ||
|
|
141
|
+
hasRequiredPermission(user, requiredPermissions)) &&
|
|
142
|
+
(!requiredRoles || hasRequiredPermission(user, requiredRoles))), switchMap((hasPermission) => {
|
|
143
|
+
if (!hasPermission && notAuthorizedUrl) {
|
|
144
|
+
return of(this.router.parseUrl(notAuthorizedUrl));
|
|
145
|
+
}
|
|
146
|
+
return of(!!hasPermission);
|
|
147
|
+
}));
|
|
148
|
+
}
|
|
149
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.1", ngImport: i0, type: AuthGuard, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
150
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.2.1", ngImport: i0, type: AuthGuard, providedIn: 'root' });
|
|
151
|
+
}
|
|
152
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.1", ngImport: i0, type: AuthGuard, decorators: [{
|
|
153
|
+
type: Injectable,
|
|
154
|
+
args: [{
|
|
155
|
+
providedIn: 'root',
|
|
156
|
+
}]
|
|
157
|
+
}] });
|
|
158
|
+
|
|
159
|
+
function provideSecurity(config = undefined) {
|
|
160
|
+
const securityConfig = {
|
|
161
|
+
tokenStorageKey: 'APP_TOKEN',
|
|
162
|
+
notAuthorizedPage: '/not-authorized',
|
|
163
|
+
...(config ?? {}),
|
|
164
|
+
};
|
|
165
|
+
return [
|
|
166
|
+
AuthGuard,
|
|
167
|
+
SECURITY_INITIALIZER_PROVIDER,
|
|
168
|
+
{ provide: SECURITY_CONTEXT_TOKEN_PROVIDER, useClass: LocalStorageTokenProvider },
|
|
169
|
+
{ provide: SECURITY_CONFIG, useValue: securityConfig },
|
|
170
|
+
];
|
|
171
|
+
}
|
|
172
|
+
class SecurityModule {
|
|
173
|
+
static forRoot(config) {
|
|
174
|
+
return {
|
|
175
|
+
ngModule: SecurityModule,
|
|
176
|
+
providers: [...provideSecurity(config)],
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.1", ngImport: i0, type: SecurityModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
180
|
+
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.2.1", ngImport: i0, type: SecurityModule, imports: [i1.StoreFeatureModule] });
|
|
181
|
+
static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.2.1", ngImport: i0, type: SecurityModule, imports: [StoreModule.forFeature(SecurityFeature)] });
|
|
182
|
+
}
|
|
183
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.1", ngImport: i0, type: SecurityModule, decorators: [{
|
|
184
|
+
type: NgModule,
|
|
185
|
+
args: [{
|
|
186
|
+
imports: [StoreModule.forFeature(SecurityFeature)],
|
|
187
|
+
}]
|
|
188
|
+
}] });
|
|
189
|
+
const SECURITY_CONTEXT_TOKEN_PROVIDER = new InjectionToken('SECURITY_CONTEXT_TOKEN_PROVIDER');
|
|
190
|
+
const SECURITY_CONFIG = new InjectionToken('SECURITY_CONFIG');
|
|
191
|
+
const SECURITY_INITIALIZER_PROVIDER = provideAppInitializer(() => {
|
|
192
|
+
const initializerFn = (securityInitializerFactory)(inject(SECURITY_CONTEXT_TOKEN_PROVIDER), inject(AuthContextService), inject(SECURITY_CONFIG), inject(Router));
|
|
193
|
+
return initializerFn();
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
class LocalStorageTokenProvider {
|
|
197
|
+
config = inject(SECURITY_CONFIG);
|
|
198
|
+
getToken() {
|
|
199
|
+
const token = localStorage.getItem(this.config.tokenStorageKey);
|
|
200
|
+
return of(token ?? undefined);
|
|
201
|
+
}
|
|
202
|
+
setToken(token) {
|
|
203
|
+
localStorage.setItem(this.config.tokenStorageKey, token);
|
|
204
|
+
}
|
|
205
|
+
removeToken() {
|
|
206
|
+
localStorage.clear();
|
|
207
|
+
}
|
|
208
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.1", ngImport: i0, type: LocalStorageTokenProvider, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
209
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.2.1", ngImport: i0, type: LocalStorageTokenProvider });
|
|
210
|
+
}
|
|
211
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.1", ngImport: i0, type: LocalStorageTokenProvider, decorators: [{
|
|
212
|
+
type: Injectable
|
|
213
|
+
}] });
|
|
214
|
+
|
|
215
|
+
function securityInitializerFactory(tokenProvider, authService, config, router) {
|
|
216
|
+
const initializationFn = tokenProvider.getToken().pipe(switchMap((token) => {
|
|
217
|
+
const user = convertJWTToUser(token);
|
|
218
|
+
if (config.loginPage && !user) {
|
|
219
|
+
return from(router.navigate([config.loginPage]));
|
|
220
|
+
}
|
|
221
|
+
authService.setUser(user);
|
|
222
|
+
return of({});
|
|
223
|
+
}));
|
|
224
|
+
return () => firstValueFrom(initializationFn);
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
class SessionStorageTokenProvider {
|
|
228
|
+
config = inject(SECURITY_CONFIG);
|
|
229
|
+
getToken() {
|
|
230
|
+
const token = sessionStorage.getItem(this.config.tokenStorageKey);
|
|
231
|
+
return of(token ?? undefined);
|
|
232
|
+
}
|
|
233
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.1", ngImport: i0, type: SessionStorageTokenProvider, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
234
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.2.1", ngImport: i0, type: SessionStorageTokenProvider });
|
|
235
|
+
}
|
|
236
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.1", ngImport: i0, type: SessionStorageTokenProvider, decorators: [{
|
|
237
|
+
type: Injectable
|
|
238
|
+
}] });
|
|
239
|
+
|
|
240
|
+
class LoginService {
|
|
241
|
+
config = inject(SECURITY_CONFIG);
|
|
242
|
+
tokenProvider = inject(SECURITY_CONTEXT_TOKEN_PROVIDER);
|
|
243
|
+
authService = inject(AuthContextService);
|
|
244
|
+
router = inject(Router);
|
|
245
|
+
login(token) {
|
|
246
|
+
if (token) {
|
|
247
|
+
this.tokenProvider.setToken(token);
|
|
248
|
+
this.authService.setUser(convertJWTToUser(token));
|
|
249
|
+
}
|
|
250
|
+
else {
|
|
251
|
+
this.router.navigate([this.config.loginPage]);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.1", ngImport: i0, type: LoginService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
255
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.2.1", ngImport: i0, type: LoginService });
|
|
256
|
+
}
|
|
257
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.1", ngImport: i0, type: LoginService, decorators: [{
|
|
258
|
+
type: Injectable
|
|
259
|
+
}] });
|
|
260
|
+
|
|
261
|
+
class LogoutService {
|
|
262
|
+
tokenProvider = inject(SECURITY_CONTEXT_TOKEN_PROVIDER);
|
|
263
|
+
authService = inject(AuthContextService);
|
|
264
|
+
logout() {
|
|
265
|
+
this.tokenProvider.removeToken();
|
|
266
|
+
this.authService.setUser(undefined);
|
|
267
|
+
}
|
|
268
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.1", ngImport: i0, type: LogoutService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
269
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.2.1", ngImport: i0, type: LogoutService });
|
|
270
|
+
}
|
|
271
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.1", ngImport: i0, type: LogoutService, decorators: [{
|
|
272
|
+
type: Injectable
|
|
273
|
+
}] });
|
|
274
|
+
|
|
275
|
+
class HasPermissionDirective {
|
|
276
|
+
templateRef;
|
|
277
|
+
viewContainer;
|
|
278
|
+
authContext;
|
|
279
|
+
requiredPermissions = '';
|
|
280
|
+
sub;
|
|
281
|
+
constructor(templateRef, viewContainer, authContext) {
|
|
282
|
+
this.templateRef = templateRef;
|
|
283
|
+
this.viewContainer = viewContainer;
|
|
284
|
+
this.authContext = authContext;
|
|
285
|
+
}
|
|
286
|
+
set hasPermission(value) {
|
|
287
|
+
this.requiredPermissions = value;
|
|
288
|
+
this.updateView();
|
|
289
|
+
}
|
|
290
|
+
ngOnDestroy() {
|
|
291
|
+
this.unregister();
|
|
292
|
+
}
|
|
293
|
+
unregister() {
|
|
294
|
+
this.sub?.unsubscribe();
|
|
295
|
+
}
|
|
296
|
+
updateView() {
|
|
297
|
+
this.unregister();
|
|
298
|
+
if (this.requiredPermissions || this.requiredPermissions.length) {
|
|
299
|
+
this.sub = this.authContext
|
|
300
|
+
.hasRequiredPermission(this.requiredPermissions)
|
|
301
|
+
.pipe(distinctUntilChanged())
|
|
302
|
+
.subscribe((hasPerm) => {
|
|
303
|
+
if (hasPerm) {
|
|
304
|
+
this.viewContainer.createEmbeddedView(this.templateRef);
|
|
305
|
+
}
|
|
306
|
+
else {
|
|
307
|
+
this.viewContainer.clear();
|
|
308
|
+
}
|
|
309
|
+
});
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.1", ngImport: i0, type: HasPermissionDirective, deps: [{ token: i0.TemplateRef }, { token: i0.ViewContainerRef }, { token: AuthContextService }], target: i0.ɵɵFactoryTarget.Directive });
|
|
313
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.2.1", type: HasPermissionDirective, isStandalone: true, selector: "[hasPermission]", inputs: { hasPermission: "hasPermission" }, ngImport: i0 });
|
|
314
|
+
}
|
|
315
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.1", ngImport: i0, type: HasPermissionDirective, decorators: [{
|
|
316
|
+
type: Directive,
|
|
317
|
+
args: [{
|
|
318
|
+
standalone: true,
|
|
319
|
+
selector: '[hasPermission]',
|
|
320
|
+
}]
|
|
321
|
+
}], ctorParameters: () => [{ type: i0.TemplateRef }, { type: i0.ViewContainerRef }, { type: AuthContextService }], propDecorators: { hasPermission: [{
|
|
322
|
+
type: Input
|
|
323
|
+
}] } });
|
|
324
|
+
|
|
325
|
+
class HasRoleDirective {
|
|
326
|
+
templateRef;
|
|
327
|
+
viewContainer;
|
|
328
|
+
authContext;
|
|
329
|
+
requiredRoles;
|
|
330
|
+
sub;
|
|
331
|
+
constructor(templateRef, viewContainer, authContext) {
|
|
332
|
+
this.templateRef = templateRef;
|
|
333
|
+
this.viewContainer = viewContainer;
|
|
334
|
+
this.authContext = authContext;
|
|
335
|
+
}
|
|
336
|
+
set hasRole(value) {
|
|
337
|
+
this.requiredRoles = value;
|
|
338
|
+
this.updateView();
|
|
339
|
+
}
|
|
340
|
+
ngOnDestroy() {
|
|
341
|
+
this.unregister();
|
|
342
|
+
}
|
|
343
|
+
unregister() {
|
|
344
|
+
this.sub?.unsubscribe();
|
|
345
|
+
}
|
|
346
|
+
updateView() {
|
|
347
|
+
this.unregister();
|
|
348
|
+
if (this.requiredRoles || this.requiredRoles?.length) {
|
|
349
|
+
this.sub = this.authContext
|
|
350
|
+
.hasRequiredRole(this.requiredRoles)
|
|
351
|
+
.pipe(distinctUntilChanged())
|
|
352
|
+
.subscribe((hasRole) => {
|
|
353
|
+
if (hasRole) {
|
|
354
|
+
this.viewContainer.createEmbeddedView(this.templateRef);
|
|
355
|
+
}
|
|
356
|
+
else {
|
|
357
|
+
this.viewContainer.clear();
|
|
358
|
+
}
|
|
359
|
+
});
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.1", ngImport: i0, type: HasRoleDirective, deps: [{ token: i0.TemplateRef }, { token: i0.ViewContainerRef }, { token: AuthContextService }], target: i0.ɵɵFactoryTarget.Directive });
|
|
363
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.2.1", type: HasRoleDirective, isStandalone: true, selector: "[hasRole]", inputs: { hasRole: "hasRole" }, ngImport: i0 });
|
|
364
|
+
}
|
|
365
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.1", ngImport: i0, type: HasRoleDirective, decorators: [{
|
|
366
|
+
type: Directive,
|
|
367
|
+
args: [{
|
|
368
|
+
standalone: true,
|
|
369
|
+
selector: '[hasRole]',
|
|
370
|
+
}]
|
|
371
|
+
}], ctorParameters: () => [{ type: i0.TemplateRef }, { type: i0.ViewContainerRef }, { type: AuthContextService }], propDecorators: { hasRole: [{
|
|
372
|
+
type: Input
|
|
373
|
+
}] } });
|
|
374
|
+
|
|
375
|
+
/**
|
|
376
|
+
* Generated bundle index. Do not edit.
|
|
377
|
+
*/
|
|
378
|
+
|
|
379
|
+
export { AuthContextService, AuthGuard, HasPermissionDirective, HasRoleDirective, LocalStorageTokenProvider, LoginService, LogoutService, SECURITY_CONFIG, SECURITY_CONTEXT_TOKEN_PROVIDER, SECURITY_INITIALIZER_PROVIDER, SecurityModule, SessionStorageTokenProvider, authReducer, convertJWTToUser, decodeJwtPayload, hasRequiredPermission, hasRequiredRole, initialState, provideSecurity, securityInitializerFactory, selectIsAuthenticated, selectUser, setUser };
|
|
380
|
+
//# sourceMappingURL=verisoft-security-core.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verisoft-security-core.mjs","sources":["../tmp-esm2022/lib/models/functions.js","../tmp-esm2022/lib/state/actions.js","../tmp-esm2022/lib/state/state.js","../tmp-esm2022/lib/state/reducers.js","../tmp-esm2022/lib/state/feature.js","../tmp-esm2022/lib/state/selectors.js","../tmp-esm2022/lib/services/auth-context.service.js","../tmp-esm2022/lib/guards/auth.guard.js","../tmp-esm2022/lib/provider.js","../tmp-esm2022/lib/services/local-storage-token-provider.js","../tmp-esm2022/lib/services/security-initializer.js","../tmp-esm2022/lib/services/session-token-provider.js","../tmp-esm2022/lib/services/login.service.js","../tmp-esm2022/lib/services/logout.service.js","../tmp-esm2022/lib/directives/has-permission.directive.js","../tmp-esm2022/lib/directives/has-role.directive.js","../tmp-esm2022/verisoft-security-core.js"],"sourcesContent":["export function hasRequiredPermission(user, permission) {\n return hasItems(user?.permissions, permission);\n}\nexport function hasRequiredRole(user, role) {\n return hasItems(user?.roles, role);\n}\nfunction hasItems(userItems, neededItems) {\n if (!neededItems || !neededItems.length) {\n return true;\n }\n if (!userItems || !userItems.length) {\n return false;\n }\n const userItemsSet = new Set(userItems);\n if (Array.isArray(neededItems)) {\n return neededItems.some((item) => hasItems(userItems, item));\n }\n if (neededItems.includes(',')) {\n const splitItems = neededItems.split(',').map((i) => i.trim());\n return splitItems.every((i) => userItemsSet.has(i));\n }\n return userItemsSet.has(neededItems);\n}\nexport function convertJWTToUser(base64Token) {\n if (!base64Token) {\n return undefined;\n }\n try {\n const parts = base64Token.split('.');\n if (parts.length < 2) {\n return undefined;\n }\n const payload = decodeJwtPayload(parts[1]);\n const userName = payload['unique_name'] ?? payload['nameid'];\n if (!userName) {\n return undefined;\n }\n const user = {\n userName,\n userId: payload['nameid'],\n email: payload['email'],\n displayName: payload['name'],\n roles: convertToArray(payload, 'role'),\n permissions: convertToArray(payload, 'permission'),\n };\n return user;\n }\n catch (error) {\n return undefined;\n }\n}\nexport function decodeJwtPayload(jwt) {\n const base64 = jwt.replace(/-/g, '+').replace(/_/g, '/');\n const jsonPayload = decodeURIComponent(atob(base64)\n .split('')\n .map(c => '%' + c.charCodeAt(0).toString(16).padStart(2, '0'))\n .join(''));\n return JSON.parse(jsonPayload);\n}\nfunction convertToArray(item, propertyName) {\n const rawValue = item[propertyName];\n if (!rawValue) {\n return undefined;\n }\n if (Array.isArray(rawValue)) {\n return rawValue;\n }\n return [rawValue];\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVuY3Rpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYnMvc2VjdXJpdHkvY29yZS9zcmMvbGliL21vZGVscy9mdW5jdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsTUFBTSxVQUFVLHFCQUFxQixDQUNuQyxJQUFtQyxFQUNuQyxVQUE2QjtJQUU3QixPQUFPLFFBQVEsQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQ2pELENBQUM7QUFFRCxNQUFNLFVBQVUsZUFBZSxDQUM3QixJQUFtQyxFQUNuQyxJQUF1QjtJQUV2QixPQUFPLFFBQVEsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3JDLENBQUM7QUFFRCxTQUFTLFFBQVEsQ0FDZixTQUErQixFQUMvQixXQUE4QjtJQUU5QixJQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3hDLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDcEMsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsTUFBTSxZQUFZLEdBQUcsSUFBSSxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDeEMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7UUFDL0IsT0FBTyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVELElBQUksV0FBVyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQzlCLE1BQU0sVUFBVSxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsR0FB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ZWQtdXNlci5tb2RlbCc7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaGFzUmVxdWlyZWRQZXJtaXNzaW9uKFxyXG4gIHVzZXI6IEF1dGhlbnRpY2F0ZWRVc2VyIHwgdW5kZWZpbmVkLFxyXG4gIHBlcm1pc3Npb246IHN0cmluZyB8IHN0cmluZ1tdXHJcbik6IGJvb2xlYW4ge1xyXG4gIHJldHVybiBoYXNJdGVtcyh1c2VyPy5wZXJtaXNzaW9ucywgcGVybWlzc2lvbik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBoYXNSZXF1aXJlZFJvbGUoXHJcbiAgdXNlcjogQXV0aGVudGljYXRlZFVzZXIgfCB1bmRlZmluZWQsXHJcbiAgcm9sZTogc3RyaW5nIHwgc3RyaW5nW11cclxuKTogYm9vbGVhbiB7XHJcbiAgcmV0dXJuIGhhc0l0ZW1zKHVzZXI/LnJvbGVzLCByb2xlKTtcclxufVxyXG5cclxuZnVuY3Rpb24gaGFzSXRlbXMoXHJcbiAgdXNlckl0ZW1zOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCxcclxuICBuZWVkZWRJdGVtczogc3RyaW5nIHwgc3RyaW5nW11cclxuKTogYm9vbGVhbiB7XHJcbiAgaWYgKCFuZWVkZWRJdGVtcyB8fCAhbmVlZGVkSXRlbXMubGVuZ3RoKSB7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIGlmICghdXNlckl0ZW1zIHx8ICF1c2VySXRlbXMubGVuZ3RoKSB7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBjb25zdCB1c2VySXRlbXNTZXQgPSBuZXcgU2V0KHVzZXJJdGVtcyk7XHJcbiAgaWYgKEFycmF5LmlzQXJyYXkobmVlZGVkSXRlbXMpKSB7XHJcbiAgICByZXR1cm4gbmVlZGVkSXRlbXMuc29tZSgoaXRlbSkgPT4gaGFzSXRlbXModXNlckl0ZW1zLCBpdGVtKSk7XHJcbiAgfVxyXG5cclxuICBpZiAobmVlZGVkSXRlbXMuaW5jbHVkZXMoJywnKSkge1xyXG4gICAgY29uc3Qgc3BsaXRJdGVtcyA9IG5lZWRlZEl0ZW1zLnNwbGl0KCcsJykubWFwKChpKSA9PiBpLnRyaW0oKSk7XHJcbiAgICByZXR1cm4gc3BsaXRJdGVtcy5ldmVyeSgoaSkgPT4gdXNlckl0ZW1zU2V0LmhhcyhpKSk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gdXNlckl0ZW1zU2V0LmhhcyhuZWVkZWRJdGVtcyk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0SldUVG9Vc2VyKFxyXG4gIGJhc2U2NFRva2VuPzogc3RyaW5nXHJcbik6IEF1dGhlbnRpY2F0ZWRVc2VyIHwgdW5kZWZpbmVkIHtcclxuICBpZiAoIWJhc2U2NFRva2VuKSB7XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgdHJ5IHtcclxuICAgIGNvbnN0IHBhcnRzID0gYmFzZTY0VG9rZW4uc3BsaXQoJy4nKTtcclxuICAgIGlmIChwYXJ0cy5sZW5ndGggPCAyKSB7XHJcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcbiAgICBjb25zdCBwYXlsb2FkID0gZGVjb2RlSnd0UGF5bG9hZChwYXJ0c1sxXSk7XHJcblxyXG4gICAgY29uc3QgdXNlck5hbWUgPSBwYXlsb2FkWyd1bmlxdWVfbmFtZSddID8/IHBheWxvYWRbJ25hbWVpZCddO1xyXG4gICAgaWYgKCF1c2VyTmFtZSkge1xyXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHVzZXI6IEF1dGhlbnRpY2F0ZWRVc2VyID0ge1xyXG4gICAgICB1c2VyTmFtZSxcclxuICAgICAgdXNlcklkOiBwYXlsb2FkWyduYW1laWQnXSxcclxuICAgICAgZW1haWw6IHBheWxvYWRbJ2VtYWlsJ10sXHJcbiAgICAgIGRpc3BsYXlOYW1lOiBwYXlsb2FkWyduYW1lJ10sXHJcbiAgICAgIHJvbGVzOiBjb252ZXJ0VG9BcnJheShwYXlsb2FkLCAncm9sZScpLFxyXG4gICAgICBwZXJtaXNzaW9uczogY29udmVydFRvQXJyYXkocGF5bG9hZCwgJ3Blcm1pc3Npb24nKSxcclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIHVzZXI7XHJcbiAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlSnd0UGF5bG9hZChqd3Q6IHN0cmluZyk6IGFueSB7XHJcbiAgY29uc3QgYmFzZTY0ID0gand0LnJlcGxhY2UoLy0vZywgJysnKS5yZXBsYWNlKC9fL2csICcvJyk7XHJcblxyXG4gIGNvbnN0IGpzb25QYXlsb2FkID0gZGVjb2RlVVJJQ29tcG9uZW50KFxyXG4gICAgYXRvYihiYXNlNjQpXHJcbiAgICAgIC5zcGxpdCgnJylcclxuICAgICAgLm1hcChjID0+ICclJyArIGMuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKSlcclxuICAgICAgLmpvaW4oJycpXHJcbiAgKTtcclxuXHJcbiAgcmV0dXJuIEpTT04ucGFyc2UoanNvblBheWxvYWQpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBjb252ZXJ0VG9BcnJheShcclxuICBpdGVtOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB8IHN0cmluZ1tdIH0sXHJcbiAgcHJvcGVydHlOYW1lOiBzdHJpbmdcclxuKTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xyXG4gIGNvbnN0IHJhd1ZhbHVlID0gaXRlbVtwcm9wZXJ0eU5hbWVdO1xyXG4gIGlmICghcmF3VmFsdWUpIHtcclxuICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICBpZiAoQXJyYXkuaXNBcnJheShyYXdWYWx1ZSkpIHtcclxuICAgIHJldHVybiByYXdWYWx1ZTtcclxuICB9XHJcblxyXG4gIHJldHVybiBbcmF3VmFsdWVdO1xyXG59XHJcbiJdfQ==","import { createAction, props } from '@ngrx/store';\nexport const setUser = createAction('[Auth] Set User', props());\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWJzL3NlY3VyaXR5L2NvcmUvc3JjL2xpYi9zdGF0ZS9hY3Rpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBR2xELE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxZQUFZLENBQ2pDLGlCQUFpQixFQUNqQixLQUFLLEVBQTJDLENBQ2pELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVBY3Rpb24sIHByb3BzIH0gZnJvbSAnQG5ncngvc3RvcmUnO1xyXG5pbXBvcnQgeyBBdXRoZW50aWNhdGVkVXNlciB9IGZyb20gJy4uL21vZGVscyc7XHJcblxyXG5leHBvcnQgY29uc3Qgc2V0VXNlciA9IGNyZWF0ZUFjdGlvbihcclxuICAnW0F1dGhdIFNldCBVc2VyJyxcclxuICBwcm9wczx7IHVzZXI6IEF1dGhlbnRpY2F0ZWRVc2VyIHwgdW5kZWZpbmVkIH0+KClcclxuKTtcclxuIl19","export const initialState = {\n user: undefined,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGlicy9zZWN1cml0eS9jb3JlL3NyYy9saWIvc3RhdGUvc3RhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBTUEsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFjO0lBQ3JDLElBQUksRUFBRSxTQUFTO0NBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBdXRoZW50aWNhdGVkVXNlciB9IGZyb20gJy4uL21vZGVscyc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhTdGF0ZSB7XHJcbiAgdXNlcjogQXV0aGVudGljYXRlZFVzZXIgfCB1bmRlZmluZWQ7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBpbml0aWFsU3RhdGU6IEF1dGhTdGF0ZSA9IHtcclxuICB1c2VyOiB1bmRlZmluZWQsXHJcbn07XHJcbiJdfQ==","import { createReducer, on } from '@ngrx/store';\nimport { setUser } from './actions';\nimport { initialState } from './state';\nexport const authReducer = createReducer(initialState, on(setUser, (state, action) => ({\n ...state,\n user: action.user\n})));\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkdWNlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGlicy9zZWN1cml0eS9jb3JlL3NyYy9saWIvc3RhdGUvcmVkdWNlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGFBQWEsRUFBRSxFQUFFLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDaEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNwQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRXZDLE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBRyxhQUFhLENBQ3RDLFlBQVksRUFDWixFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztJQUM5QixHQUFHLEtBQUs7SUFDUixJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7Q0FDbEIsQ0FBQyxDQUFDLENBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNyZWF0ZVJlZHVjZXIsIG9uIH0gZnJvbSAnQG5ncngvc3RvcmUnO1xyXG5pbXBvcnQgeyBzZXRVc2VyIH0gZnJvbSAnLi9hY3Rpb25zJztcclxuaW1wb3J0IHsgaW5pdGlhbFN0YXRlIH0gZnJvbSAnLi9zdGF0ZSc7XHJcblxyXG5leHBvcnQgY29uc3QgYXV0aFJlZHVjZXIgPSBjcmVhdGVSZWR1Y2VyKFxyXG4gIGluaXRpYWxTdGF0ZSxcclxuICBvbihzZXRVc2VyLCAoc3RhdGUsIGFjdGlvbikgPT4gKHtcclxuICAgIC4uLnN0YXRlLFxyXG4gICAgdXNlcjogYWN0aW9uLnVzZXJcclxuICB9KSlcclxuKTsiXX0=","import { createFeature } from \"@ngrx/store\";\nimport { authReducer } from \"./reducers\";\nexport const SECURITY_FEATURE_NAME = 'SECURITY';\nexport const SecurityFeature = createFeature({\n name: SECURITY_FEATURE_NAME,\n reducer: authReducer\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmVhdHVyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWJzL3NlY3VyaXR5L2NvcmUvc3JjL2xpYi9zdGF0ZS9mZWF0dXJlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFDM0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUV4QyxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxVQUFVLENBQUM7QUFFaEQsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLGFBQWEsQ0FBQztJQUN6QyxJQUFJLEVBQUUscUJBQXFCO0lBQzNCLE9BQU8sRUFBRSxXQUFXO0NBQ3ZCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNyZWF0ZUZlYXR1cmUgfSBmcm9tIFwiQG5ncngvc3RvcmVcIlxyXG5pbXBvcnQgeyBhdXRoUmVkdWNlciB9IGZyb20gXCIuL3JlZHVjZXJzXCJcclxuXHJcbmV4cG9ydCBjb25zdCBTRUNVUklUWV9GRUFUVVJFX05BTUUgPSAnU0VDVVJJVFknO1xyXG5cclxuZXhwb3J0IGNvbnN0IFNlY3VyaXR5RmVhdHVyZSA9IGNyZWF0ZUZlYXR1cmUoe1xyXG4gICAgbmFtZTogU0VDVVJJVFlfRkVBVFVSRV9OQU1FLFxyXG4gICAgcmVkdWNlcjogYXV0aFJlZHVjZXJcclxufSk7XHJcblxyXG4iXX0=","import { createSelector } from '@ngrx/store';\nimport { SecurityFeature } from './feature';\nexport const selectIsAuthenticated = createSelector(SecurityFeature.selectUser, (user) => !!user);\nexport const selectUser = SecurityFeature.selectUser;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0b3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYnMvc2VjdXJpdHkvY29yZS9zcmMvbGliL3N0YXRlL3NlbGVjdG9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzdDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFNUMsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsY0FBYyxDQUNqRCxlQUFlLENBQUMsVUFBVSxFQUMxQixDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDakIsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyxlQUFlLENBQUMsVUFBVSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlU2VsZWN0b3IgfSBmcm9tICdAbmdyeC9zdG9yZSc7XHJcbmltcG9ydCB7IFNlY3VyaXR5RmVhdHVyZSB9IGZyb20gJy4vZmVhdHVyZSc7XHJcblxyXG5leHBvcnQgY29uc3Qgc2VsZWN0SXNBdXRoZW50aWNhdGVkID0gY3JlYXRlU2VsZWN0b3IoXHJcbiAgU2VjdXJpdHlGZWF0dXJlLnNlbGVjdFVzZXIsXHJcbiAgKHVzZXIpID0+ICEhdXNlclxyXG4pO1xyXG5cclxuZXhwb3J0IGNvbnN0IHNlbGVjdFVzZXIgPSBTZWN1cml0eUZlYXR1cmUuc2VsZWN0VXNlcjsiXX0=","import { Injectable } from '@angular/core';\nimport { Store } from '@ngrx/store';\nimport { map } from 'rxjs';\nimport { hasRequiredPermission, hasRequiredRole } from '../models/functions';\nimport { setUser } from '../state/actions';\nimport { selectIsAuthenticated, selectUser } from '../state/selectors';\nimport * as i0 from \"@angular/core\";\nimport * as i1 from \"@ngrx/store\";\nexport class AuthContextService {\n store;\n user$;\n isAuthenticated$;\n constructor(store) {\n this.store = store;\n this.user$ = this.store.select(selectUser);\n this.isAuthenticated$ = this.store.select(selectIsAuthenticated);\n }\n setUser(user) {\n this.store.dispatch(setUser({ user }));\n }\n hasRequiredPermission(requiredPermissions) {\n return this.user$.pipe(map((user) => hasRequiredPermission(user, requiredPermissions)));\n }\n hasRequiredRole(requiredPermissions) {\n return this.user$.pipe(map((user) => hasRequiredRole(user, requiredPermissions)));\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.2.1\", ngImport: i0, type: AuthContextService, deps: [{ token: i1.Store }], target: i0.ɵɵFactoryTarget.Injectable });\n static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"20.2.1\", ngImport: i0, type: AuthContextService, providedIn: 'root' });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.2.1\", ngImport: i0, type: AuthContextService, decorators: [{\n type: Injectable,\n args: [{\n providedIn: 'root',\n }]\n }], ctorParameters: () => [{ type: i1.Store }] });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC1jb250ZXh0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGlicy9zZWN1cml0eS9jb3JlL3NyYy9saWIvc2VydmljZXMvYXV0aC1jb250ZXh0LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxHQUFHLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFFdkMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzdFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7OztBQUt2RSxNQUFNLE9BQU8sa0JBQWtCO0lBSVQ7SUFIcEIsS0FBSyxDQUE0QztJQUNqRCxnQkFBZ0IsQ0FBc0I7SUFFdEMsWUFBb0IsS0FBWTtRQUFaLFVBQUssR0FBTCxLQUFLLENBQU87UUFDOUIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMzQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMscUJBQXFCLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRUQsT0FBTyxDQUFDLElBQW1DO1FBQ3pDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQscUJBQXFCLENBQ25CLG1CQUFzQztRQUV0QyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUNwQixHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLHFCQUFxQixDQUFDLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDLENBQ2hFLENBQUM7SUFDSixDQUFDO0lBRUQsZUFBZSxDQUFDLG1CQUFzQztRQUNwRCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUNwQixHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsbUJBQW1CLENBQUMsQ0FBQyxDQUMxRCxDQUFDO0lBQ0osQ0FBQzt1R0F6QlUsa0JBQWtCOzJHQUFsQixrQkFBa0IsY0FGakIsTUFBTTs7MkZBRVAsa0JBQWtCO2tCQUg5QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgU3RvcmUgfSBmcm9tICdAbmdyeC9zdG9yZSc7XHJcbmltcG9ydCB7IG1hcCwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBBdXRoZW50aWNhdGVkVXNlciB9IGZyb20gJy4uL21vZGVscyc7XHJcbmltcG9ydCB7IGhhc1JlcXVpcmVkUGVybWlzc2lvbiwgaGFzUmVxdWlyZWRSb2xlIH0gZnJvbSAnLi4vbW9kZWxzL2Z1bmN0aW9ucyc7XHJcbmltcG9ydCB7IHNldFVzZXIgfSBmcm9tICcuLi9zdGF0ZS9hY3Rpb25zJztcclxuaW1wb3J0IHsgc2VsZWN0SXNBdXRoZW50aWNhdGVkLCBzZWxlY3RVc2VyIH0gZnJvbSAnLi4vc3RhdGUvc2VsZWN0b3JzJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCcsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBdXRoQ29udGV4dFNlcnZpY2Uge1xyXG4gIHVzZXIkOiBPYnNlcnZhYmxlPEF1dGhlbnRpY2F0ZWRVc2VyIHwgdW5kZWZpbmVkPjtcclxuICBpc0F1dGhlbnRpY2F0ZWQkOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHN0b3JlOiBTdG9yZSkge1xyXG4gICAgdGhpcy51c2VyJCA9IHRoaXMuc3RvcmUuc2VsZWN0KHNlbGVjdFVzZXIpO1xyXG4gICAgdGhpcy5pc0F1dGhlbnRpY2F0ZWQkID0gdGhpcy5zdG9yZS5zZWxlY3Qoc2VsZWN0SXNBdXRoZW50aWNhdGVkKTtcclxuICB9XHJcblxyXG4gIHNldFVzZXIodXNlcjogQXV0aGVudGljYXRlZFVzZXIgfCB1bmRlZmluZWQpOiB2b2lkIHtcclxuICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goc2V0VXNlcih7IHVzZXIgfSkpO1xyXG4gIH1cclxuXHJcbiAgaGFzUmVxdWlyZWRQZXJtaXNzaW9uKFxyXG4gICAgcmVxdWlyZWRQZXJtaXNzaW9uczogc3RyaW5nIHwgc3RyaW5nW11cclxuICApOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcclxuICAgIHJldHVybiB0aGlzLnVzZXIkLnBpcGUoXHJcbiAgICAgIG1hcCgodXNlcikgPT4gaGFzUmVxdWlyZWRQZXJtaXNzaW9uKHVzZXIsIHJlcXVpcmVkUGVybWlzc2lvbnMpKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGhhc1JlcXVpcmVkUm9sZShyZXF1aXJlZFBlcm1pc3Npb25zOiBzdHJpbmcgfCBzdHJpbmdbXSk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xyXG4gICAgcmV0dXJuIHRoaXMudXNlciQucGlwZShcclxuICAgICAgbWFwKCh1c2VyKSA9PiBoYXNSZXF1aXJlZFJvbGUodXNlciwgcmVxdWlyZWRQZXJtaXNzaW9ucykpXHJcbiAgICApO1xyXG4gIH1cclxufVxyXG4iXX0=","import { inject, Injectable } from '@angular/core';\nimport { Router, } from '@angular/router';\nimport { map, of, switchMap } from 'rxjs';\nimport { hasRequiredPermission } from '../models/functions';\nimport { SECURITY_CONFIG } from '../provider';\nimport { AuthContextService } from '../services';\nimport * as i0 from \"@angular/core\";\nexport class AuthGuard {\n config = inject(SECURITY_CONFIG);\n router = inject(Router);\n authContext = inject(AuthContextService);\n canActivate(route) {\n return this.checkPermissionsAndRolesAndNavigate(route, this.config.notAuthorizedPage);\n }\n canActivateChild(childRoute) {\n return this.checkPermissionsAndRolesAndNavigate(childRoute, this.config.notAuthorizedPage);\n }\n checkPermissionsAndRolesAndNavigate(route, notAuthorizedUrl) {\n const requiredPermissions = route.data['permissions'];\n const requiredRoles = route.data['roles'];\n return this.authContext.user$.pipe(map((user) => user &&\n (!requiredPermissions ||\n hasRequiredPermission(user, requiredPermissions)) &&\n (!requiredRoles || hasRequiredPermission(user, requiredRoles))), switchMap((hasPermission) => {\n if (!hasPermission && notAuthorizedUrl) {\n return of(this.router.parseUrl(notAuthorizedUrl));\n }\n return of(!!hasPermission);\n }));\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.2.1\", ngImport: i0, type: AuthGuard, deps: [], target: i0.ɵɵFactoryTarget.Injectable });\n static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"20.2.1\", ngImport: i0, type: AuthGuard, providedIn: 'root' });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.2.1\", ngImport: i0, type: AuthGuard, decorators: [{\n type: Injectable,\n args: [{\n providedIn: 'root',\n }]\n }] });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5ndWFyZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWJzL3NlY3VyaXR5L2NvcmUvc3JjL2xpYi9ndWFyZHMvYXV0aC5ndWFyZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBSUwsTUFBTSxHQUVQLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLEdBQUcsRUFBYyxFQUFFLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXRELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzVELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDOUMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sYUFBYSxDQUFDOztBQUtqRCxNQUFNLE9BQU8sU0FBUztJQUNaLE1BQU0sR0FBRyxNQUFNLENBQWlCLGVBQWUsQ0FBQyxDQUFDO0lBQ2pELE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDeEIsV0FBVyxHQUFHLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBRWpELFdBQVcsQ0FBQyxLQUE2QjtRQUN2QyxPQUFPLElBQUksQ0FBQyxtQ0FBbUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3hGLENBQUM7SUFFRCxnQkFBZ0IsQ0FDZCxVQUFrQztRQUVsQyxPQUFPLElBQUksQ0FBQyxtQ0FBbUMsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQzdGLENBQUM7SUFFTyxtQ0FBbUMsQ0FDekMsS0FBNkIsRUFDN0IsZ0JBQW9DO1FBRXBDLE1BQU0sbUJBQW1CLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQW9DLENBQUM7UUFDekYsTUFBTSxhQUFhLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQWtDLENBQUM7UUFFM0UsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQ2hDLEdBQUcsQ0FDRCxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSTtZQUNaLENBQUMsQ0FBQyxtQkFBbUI7Z0JBQ25CLHFCQUFxQixDQUFDLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1lBQ25ELENBQUMsQ0FBQyxhQUFhLElBQUkscUJBQXFCLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQ2pFLEVBQ0QsU0FBUyxDQUFDLENBQUMsYUFBYSxFQUFFLEVBQUU7WUFDMUIsSUFBSSxDQUFDLGFBQWEsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO2dCQUN2QyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7WUFDcEQsQ0FBQztZQUNELE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUM3QixDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQzt1R0FwQ1UsU0FBUzsyR0FBVCxTQUFTLGNBRlIsTUFBTTs7MkZBRVAsU0FBUztrQkFIckIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtcclxuICBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LFxyXG4gIENhbkFjdGl2YXRlLFxyXG4gIENhbkFjdGl2YXRlQ2hpbGQsXHJcbiAgUm91dGVyLFxyXG4gIFVybFRyZWUsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgbWFwLCBPYnNlcnZhYmxlLCBvZiwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IFNlY3VyaXR5Q29uZmlnIH0gZnJvbSAnLi4vbW9kZWxzJztcclxuaW1wb3J0IHsgaGFzUmVxdWlyZWRQZXJtaXNzaW9uIH0gZnJvbSAnLi4vbW9kZWxzL2Z1bmN0aW9ucyc7XHJcbmltcG9ydCB7IFNFQ1VSSVRZX0NPTkZJRyB9IGZyb20gJy4uL3Byb3ZpZGVyJztcclxuaW1wb3J0IHsgQXV0aENvbnRleHRTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290JyxcclxufSlcclxuZXhwb3J0IGNsYXNzIEF1dGhHdWFyZCBpbXBsZW1lbnRzIENhbkFjdGl2YXRlLCBDYW5BY3RpdmF0ZUNoaWxkIHtcclxuICBwcml2YXRlIGNvbmZpZyA9IGluamVjdDxTZWN1cml0eUNvbmZpZz4oU0VDVVJJVFlfQ09ORklHKTtcclxuICBwcml2YXRlIHJvdXRlciA9IGluamVjdChSb3V0ZXIpO1xyXG4gIHByaXZhdGUgYXV0aENvbnRleHQgPSBpbmplY3QoQXV0aENvbnRleHRTZXJ2aWNlKTtcclxuXHJcbiAgY2FuQWN0aXZhdGUocm91dGU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QpOiBPYnNlcnZhYmxlPGJvb2xlYW4gfCBVcmxUcmVlPiB7XHJcbiAgICByZXR1cm4gdGhpcy5jaGVja1Blcm1pc3Npb25zQW5kUm9sZXNBbmROYXZpZ2F0ZShyb3V0ZSwgdGhpcy5jb25maWcubm90QXV0aG9yaXplZFBhZ2UpO1xyXG4gIH1cclxuXHJcbiAgY2FuQWN0aXZhdGVDaGlsZChcclxuICAgIGNoaWxkUm91dGU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3RcclxuICApOiBPYnNlcnZhYmxlPGJvb2xlYW4gfCBVcmxUcmVlPiB7XHJcbiAgICByZXR1cm4gdGhpcy5jaGVja1Blcm1pc3Npb25zQW5kUm9sZXNBbmROYXZpZ2F0ZShjaGlsZFJvdXRlLCB0aGlzLmNvbmZpZy5ub3RBdXRob3JpemVkUGFnZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNoZWNrUGVybWlzc2lvbnNBbmRSb2xlc0FuZE5hdmlnYXRlKFxyXG4gICAgcm91dGU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QsXHJcbiAgICBub3RBdXRob3JpemVkVXJsOiBzdHJpbmcgfCB1bmRlZmluZWRcclxuICApOiBPYnNlcnZhYmxlPGJvb2xlYW4gfCBVcmxUcmVlPiB7XHJcbiAgICBjb25zdCByZXF1aXJlZFBlcm1pc3Npb25zID0gcm91dGUuZGF0YVsncGVybWlzc2lvbnMnXSBhcyB8IHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xyXG4gICAgY29uc3QgcmVxdWlyZWRSb2xlcyA9IHJvdXRlLmRhdGFbJ3JvbGVzJ10gYXMgc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQ7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuYXV0aENvbnRleHQudXNlciQucGlwZShcclxuICAgICAgbWFwKFxyXG4gICAgICAgICh1c2VyKSA9PiB1c2VyICYmXHJcbiAgICAgICAgICAoIXJlcXVpcmVkUGVybWlzc2lvbnMgfHxcclxuICAgICAgICAgICAgaGFzUmVxdWlyZWRQZXJtaXNzaW9uKHVzZXIsIHJlcXVpcmVkUGVybWlzc2lvbnMpKSAmJlxyXG4gICAgICAgICAgKCFyZXF1aXJlZFJvbGVzIHx8IGhhc1JlcXVpcmVkUGVybWlzc2lvbih1c2VyLCByZXF1aXJlZFJvbGVzKSlcclxuICAgICAgKSxcclxuICAgICAgc3dpdGNoTWFwKChoYXNQZXJtaXNzaW9uKSA9PiB7XHJcbiAgICAgICAgaWYgKCFoYXNQZXJtaXNzaW9uICYmIG5vdEF1dGhvcml6ZWRVcmwpIHtcclxuICAgICAgICAgIHJldHVybiBvZih0aGlzLnJvdXRlci5wYXJzZVVybChub3RBdXRob3JpemVkVXJsKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBvZighIWhhc1Blcm1pc3Npb24pO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcbn1cclxuIl19","import { InjectionToken, NgModule, inject, provideAppInitializer } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { StoreModule } from '@ngrx/store';\nimport { AuthGuard } from './guards';\nimport { AuthContextService, LocalStorageTokenProvider, securityInitializerFactory, } from './services';\nimport { SecurityFeature } from './state/feature';\nimport * as i0 from \"@angular/core\";\nimport * as i1 from \"@ngrx/store\";\nexport function provideSecurity(config = undefined) {\n const securityConfig = {\n tokenStorageKey: 'APP_TOKEN',\n notAuthorizedPage: '/not-authorized',\n ...(config ?? {}),\n };\n return [\n AuthGuard,\n SECURITY_INITIALIZER_PROVIDER,\n { provide: SECURITY_CONTEXT_TOKEN_PROVIDER, useClass: LocalStorageTokenProvider },\n { provide: SECURITY_CONFIG, useValue: securityConfig },\n ];\n}\nexport class SecurityModule {\n static forRoot(config) {\n return {\n ngModule: SecurityModule,\n providers: [...provideSecurity(config)],\n };\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.2.1\", ngImport: i0, type: SecurityModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });\n static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: \"14.0.0\", version: \"20.2.1\", ngImport: i0, type: SecurityModule, imports: [i1.StoreFeatureModule] });\n static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: \"12.0.0\", version: \"20.2.1\", ngImport: i0, type: SecurityModule, imports: [StoreModule.forFeature(SecurityFeature)] });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.2.1\", ngImport: i0, type: SecurityModule, decorators: [{\n type: NgModule,\n args: [{\n imports: [StoreModule.forFeature(SecurityFeature)],\n }]\n }] });\nexport const SECURITY_CONTEXT_TOKEN_PROVIDER = new InjectionToken('SECURITY_CONTEXT_TOKEN_PROVIDER');\nexport const SECURITY_CONFIG = new InjectionToken('SECURITY_CONFIG');\nexport const SECURITY_INITIALIZER_PROVIDER = provideAppInitializer(() => {\n const initializerFn = (securityInitializerFactory)(inject(SECURITY_CONTEXT_TOKEN_PROVIDER), inject(AuthContextService), inject(SECURITY_CONFIG), inject(Router));\n return initializerFn();\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGlicy9zZWN1cml0eS9jb3JlL3NyYy9saWIvcHJvdmlkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUF3QixjQUFjLEVBQXVCLFFBQVEsRUFBWSxNQUFNLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0ksT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDMUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUVyQyxPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLHlCQUF5QixFQUN6QiwwQkFBMEIsR0FFM0IsTUFBTSxZQUFZLENBQUM7QUFDcEIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGlCQUFpQixDQUFDOzs7QUFFbEQsTUFBTSxVQUFVLGVBQWUsQ0FDN0IsU0FBOEMsU0FBUztJQUV2RCxNQUFNLGNBQWMsR0FBbUI7UUFDckMsZUFBZSxFQUFFLFdBQVc7UUFDNUIsaUJBQWlCLEVBQUUsaUJBQWlCO1FBQ3BDLEdBQUcsQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDO0tBQ2xCLENBQUM7SUFDRixPQUFPO1FBQ0wsU0FBUztRQUNULDZCQUE2QjtRQUM3QixFQUFFLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxRQUFRLEVBQUUseUJBQXlCLEVBQUU7UUFDakYsRUFBRSxPQUFPLEVBQUUsZUFBZSxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUU7S0FDdkQsQ0FBQztBQUNKLENBQUM7QUFLRCxNQUFNLE9BQU8sY0FBYztJQUN6QixNQUFNLENBQUMsT0FBTyxDQUNaLE1BQWdDO1FBRWhDLE9BQU87WUFDTCxRQUFRLEVBQUUsY0FBYztZQUN4QixTQUFTLEVBQUUsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUN4QyxDQUFDO0lBQ0osQ0FBQzt1R0FSVSxjQUFjO3dHQUFkLGNBQWM7d0dBQWQsY0FBYyxZQUZmLFdBQVcsQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDOzsyRkFFdEMsY0FBYztrQkFIMUIsUUFBUTttQkFBQztvQkFDUixPQUFPLEVBQUUsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxDQUFDO2lCQUNuRDs7QUFZRCxNQUFNLENBQUMsTUFBTSwrQkFBK0IsR0FBRyxJQUFJLGNBQWMsQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO0FBRXJHLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxJQUFJLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0FBR3JFLE1BQU0sQ0FBQyxNQUFNLDZCQUE2QixHQUF5QixxQkFBcUIsQ0FBQyxHQUFHLEVBQUU7SUFDNUYsTUFBTSxhQUFhLEdBQUcsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLE1BQU0sQ0FBZ0IsK0JBQStCLENBQUMsRUFBRSxNQUFNLENBQUMsa0JBQWtCLENBQUMsRUFBRSxNQUFNLENBQWlCLGVBQWUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ2hNLE9BQU8sYUFBYSxFQUFFLENBQUM7QUFDekIsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbnZpcm9ubWVudFByb3ZpZGVycywgSW5qZWN0aW9uVG9rZW4sIE1vZHVsZVdpdGhQcm92aWRlcnMsIE5nTW9kdWxlLCBQcm92aWRlciwgaW5qZWN0LCBwcm92aWRlQXBwSW5pdGlhbGl6ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgU3RvcmVNb2R1bGUgfSBmcm9tICdAbmdyeC9zdG9yZSc7XHJcbmltcG9ydCB7IEF1dGhHdWFyZCB9IGZyb20gJy4vZ3VhcmRzJztcclxuaW1wb3J0IHsgU2VjdXJpdHlDb25maWcgfSBmcm9tICcuL21vZGVscyc7XHJcbmltcG9ydCB7XHJcbiAgQXV0aENvbnRleHRTZXJ2aWNlLFxyXG4gIExvY2FsU3RvcmFnZVRva2VuUHJvdmlkZXIsXHJcbiAgc2VjdXJpdHlJbml0aWFsaXplckZhY3RvcnksXHJcbiAgVG9rZW5Qcm92aWRlcixcclxufSBmcm9tICcuL3NlcnZpY2VzJztcclxuaW1wb3J0IHsgU2VjdXJpdHlGZWF0dXJlIH0gZnJvbSAnLi9zdGF0ZS9mZWF0dXJlJztcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBwcm92aWRlU2VjdXJpdHkoXHJcbiAgY29uZmlnOiBQYXJ0aWFsPFNlY3VyaXR5Q29uZmlnPiB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZFxyXG4pOiAoUHJvdmlkZXIgfCBFbnZpcm9ubWVudFByb3ZpZGVycylbXSB7XHJcbiAgY29uc3Qgc2VjdXJpdHlDb25maWc6IFNlY3VyaXR5Q29uZmlnID0ge1xyXG4gICAgdG9rZW5TdG9yYWdlS2V5OiAnQVBQX1RPS0VOJyxcclxuICAgIG5vdEF1dGhvcml6ZWRQYWdlOiAnL25vdC1hdXRob3JpemVkJyxcclxuICAgIC4uLihjb25maWcgPz8ge30pLFxyXG4gIH07XHJcbiAgcmV0dXJuIFtcclxuICAgIEF1dGhHdWFyZCxcclxuICAgIFNFQ1VSSVRZX0lOSVRJQUxJWkVSX1BST1ZJREVSLFxyXG4gICAgeyBwcm92aWRlOiBTRUNVUklUWV9DT05URVhUX1RPS0VOX1BST1ZJREVSLCB1c2VDbGFzczogTG9jYWxTdG9yYWdlVG9rZW5Qcm92aWRlciB9LFxyXG4gICAgeyBwcm92aWRlOiBTRUNVUklUWV9DT05GSUcsIHVzZVZhbHVlOiBzZWN1cml0eUNvbmZpZyB9LFxyXG4gIF07XHJcbn1cclxuXHJcbkBOZ01vZHVsZSh7XHJcbiAgaW1wb3J0czogW1N0b3JlTW9kdWxlLmZvckZlYXR1cmUoU2VjdXJpdHlGZWF0dXJlKV0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTZWN1cml0eU1vZHVsZSB7XHJcbiAgc3RhdGljIGZvclJvb3QoXHJcbiAgICBjb25maWc/OiBQYXJ0aWFsPFNlY3VyaXR5Q29uZmlnPlxyXG4gICk6IE1vZHVsZVdpdGhQcm92aWRlcnM8U2VjdXJpdHlNb2R1bGU+IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIG5nTW9kdWxlOiBTZWN1cml0eU1vZHVsZSxcclxuICAgICAgcHJvdmlkZXJzOiBbLi4ucHJvdmlkZVNlY3VyaXR5KGNvbmZpZyldLFxyXG4gICAgfTtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBTRUNVUklUWV9DT05URVhUX1RPS0VOX1BST1ZJREVSID0gbmV3IEluamVjdGlvblRva2VuKCdTRUNVUklUWV9DT05URVhUX1RPS0VOX1BST1ZJREVSJyk7XHJcblxyXG5leHBvcnQgY29uc3QgU0VDVVJJVFlfQ09ORklHID0gbmV3IEluamVjdGlvblRva2VuKCdTRUNVUklUWV9DT05GSUcnKTtcclxuXHJcblxyXG5leHBvcnQgY29uc3QgU0VDVVJJVFlfSU5JVElBTElaRVJfUFJPVklERVI6IEVudmlyb25tZW50UHJvdmlkZXJzID0gcHJvdmlkZUFwcEluaXRpYWxpemVyKCgpID0+IHtcclxuICBjb25zdCBpbml0aWFsaXplckZuID0gKHNlY3VyaXR5SW5pdGlhbGl6ZXJGYWN0b3J5KShpbmplY3Q8VG9rZW5Qcm92aWRlcj4oU0VDVVJJVFlfQ09OVEVYVF9UT0tFTl9QUk9WSURFUiksIGluamVjdChBdXRoQ29udGV4dFNlcnZpY2UpLCBpbmplY3Q8U2VjdXJpdHlDb25maWc+KFNFQ1VSSVRZX0NPTkZJRyksIGluamVjdChSb3V0ZXIpKTtcclxuICByZXR1cm4gaW5pdGlhbGl6ZXJGbigpO1xyXG59KTsiXX0=","import { inject, Injectable } from '@angular/core';\nimport { of } from 'rxjs';\nimport { SECURITY_CONFIG } from '../provider';\nimport * as i0 from \"@angular/core\";\nexport class LocalStorageTokenProvider {\n config = inject(SECURITY_CONFIG);\n getToken() {\n const token = localStorage.getItem(this.config.tokenStorageKey);\n return of(token ?? undefined);\n }\n setToken(token) {\n localStorage.setItem(this.config.tokenStorageKey, token);\n }\n removeToken() {\n localStorage.clear();\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.2.1\", ngImport: i0, type: LocalStorageTokenProvider, deps: [], target: i0.ɵɵFactoryTarget.Injectable });\n static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"20.2.1\", ngImport: i0, type: LocalStorageTokenProvider });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.2.1\", ngImport: i0, type: LocalStorageTokenProvider, decorators: [{\n type: Injectable\n }] });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWwtc3RvcmFnZS10b2tlbi1wcm92aWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWJzL3NlY3VyaXR5L2NvcmUvc3JjL2xpYi9zZXJ2aWNlcy9sb2NhbC1zdG9yYWdlLXRva2VuLXByb3ZpZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFdEMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGFBQWEsQ0FBQzs7QUFJOUMsTUFBTSxPQUFPLHlCQUF5QjtJQUM1QixNQUFNLEdBQUcsTUFBTSxDQUFpQixlQUFlLENBQUMsQ0FBQztJQUV6RCxRQUFRO1FBQ04sTUFBTSxLQUFLLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ2hFLE9BQU8sRUFBRSxDQUFDLEtBQUssSUFBSSxTQUFTLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQsUUFBUSxDQUFDLEtBQWE7UUFDcEIsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRUQsV0FBVztRQUNULFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUN2QixDQUFDO3VHQWRVLHlCQUF5QjsyR0FBekIseUJBQXlCOzsyRkFBekIseUJBQXlCO2tCQURyQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgU2VjdXJpdHlDb25maWcgfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgU0VDVVJJVFlfQ09ORklHIH0gZnJvbSAnLi4vcHJvdmlkZXInO1xuaW1wb3J0IHsgVG9rZW5Qcm92aWRlciB9IGZyb20gJy4vdG9rZW4tcHJvdmlkZXInO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgTG9jYWxTdG9yYWdlVG9rZW5Qcm92aWRlciBpbXBsZW1lbnRzIFRva2VuUHJvdmlkZXIge1xuICBwcml2YXRlIGNvbmZpZyA9IGluamVjdDxTZWN1cml0eUNvbmZpZz4oU0VDVVJJVFlfQ09ORklHKTtcblxuICBnZXRUb2tlbigpOiBPYnNlcnZhYmxlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IHRva2VuID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5jb25maWcudG9rZW5TdG9yYWdlS2V5KTtcbiAgICByZXR1cm4gb2YodG9rZW4gPz8gdW5kZWZpbmVkKTtcbiAgfVxuXG4gIHNldFRva2VuKHRva2VuOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLmNvbmZpZy50b2tlblN0b3JhZ2VLZXksIHRva2VuKTtcbiAgfVxuXG4gIHJlbW92ZVRva2VuKCk6IHZvaWQge1xuICAgIGxvY2FsU3RvcmFnZS5jbGVhcigpO1xuICB9XG59XG4iXX0=","import { firstValueFrom, from, of, switchMap } from 'rxjs';\nimport { convertJWTToUser } from '../models';\nexport function securityInitializerFactory(tokenProvider, authService, config, router) {\n const initializationFn = tokenProvider.getToken().pipe(switchMap((token) => {\n const user = convertJWTToUser(token);\n if (config.loginPage && !user) {\n return from(router.navigate([config.loginPage]));\n }\n authService.setUser(user);\n return of({});\n }));\n return () => firstValueFrom(initializationFn);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjdXJpdHktaW5pdGlhbGl6ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGlicy9zZWN1cml0eS9jb3JlL3NyYy9saWIvc2VydmljZXMvc2VjdXJpdHktaW5pdGlhbGl6ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLGNBQWMsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMzRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQWtCLE1BQU0sV0FBVyxDQUFDO0FBSTdELE1BQU0sVUFBVSwwQkFBMEIsQ0FDeEMsYUFBNEIsRUFDNUIsV0FBK0IsRUFDL0IsTUFBc0IsRUFDdEIsTUFBYztJQUVkLE1BQU0sZ0JBQWdCLEdBQUcsYUFBYSxDQUFDLFFBQVEsRUFBRSxDQUFDLElBQUksQ0FDcEQsU0FBUyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7UUFDbEIsTUFBTSxJQUFJLEdBQUcsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDckMsSUFBSSxNQUFNLENBQUMsU0FBUyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDOUIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkQsQ0FBQztRQUVELFdBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUIsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDaEIsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUVGLE9BQU8sR0FBRyxFQUFFLENBQUMsY0FBYyxDQUFDLGdCQUFnQixDQUFDLENBQUE7QUFDL0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IGZpcnN0VmFsdWVGcm9tLCBmcm9tLCBvZiwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGNvbnZlcnRKV1RUb1VzZXIsIFNlY3VyaXR5Q29uZmlnIH0gZnJvbSAnLi4vbW9kZWxzJztcclxuaW1wb3J0IHsgQXV0aENvbnRleHRTZXJ2aWNlIH0gZnJvbSAnLi9hdXRoLWNvbnRleHQuc2VydmljZSc7XHJcbmltcG9ydCB7IFRva2VuUHJvdmlkZXIgfSBmcm9tICcuL3Rva2VuLXByb3ZpZGVyJztcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzZWN1cml0eUluaXRpYWxpemVyRmFjdG9yeShcclxuICB0b2tlblByb3ZpZGVyOiBUb2tlblByb3ZpZGVyLFxyXG4gIGF1dGhTZXJ2aWNlOiBBdXRoQ29udGV4dFNlcnZpY2UsXHJcbiAgY29uZmlnOiBTZWN1cml0eUNvbmZpZyxcclxuICByb3V0ZXI6IFJvdXRlclxyXG4pOiAoKSA9PiBQcm9taXNlPHVua25vd24+IHtcclxuICBjb25zdCBpbml0aWFsaXphdGlvbkZuID0gdG9rZW5Qcm92aWRlci5nZXRUb2tlbigpLnBpcGUoXHJcbiAgICBzd2l0Y2hNYXAoKHRva2VuKSA9PiB7XHJcbiAgICAgIGNvbnN0IHVzZXIgPSBjb252ZXJ0SldUVG9Vc2VyKHRva2VuKTtcclxuICAgICAgaWYgKGNvbmZpZy5sb2dpblBhZ2UgJiYgIXVzZXIpIHtcclxuICAgICAgICByZXR1cm4gZnJvbShyb3V0ZXIubmF2aWdhdGUoW2NvbmZpZy5sb2dpblBhZ2VdKSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGF1dGhTZXJ2aWNlLnNldFVzZXIodXNlcik7XHJcbiAgICAgIHJldHVybiBvZih7fSk7XHJcbiAgICB9KVxyXG4gICk7XHJcblxyXG4gIHJldHVybiAoKSA9PiBmaXJzdFZhbHVlRnJvbShpbml0aWFsaXphdGlvbkZuKVxyXG59XHJcbiJdfQ==","import { inject, Injectable } from '@angular/core';\nimport { of } from 'rxjs';\nimport { SECURITY_CONFIG } from '../provider';\nimport * as i0 from \"@angular/core\";\nexport class SessionStorageTokenProvider {\n config = inject(SECURITY_CONFIG);\n getToken() {\n const token = sessionStorage.getItem(this.config.tokenStorageKey);\n return of(token ?? undefined);\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.2.1\", ngImport: i0, type: SessionStorageTokenProvider, deps: [], target: i0.ɵɵFactoryTarget.Injectable });\n static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"20.2.1\", ngImport: i0, type: SessionStorageTokenProvider });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.2.1\", ngImport: i0, type: SessionStorageTokenProvider, decorators: [{\n type: Injectable\n }] });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Vzc2lvbi10b2tlbi1wcm92aWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWJzL3NlY3VyaXR5L2NvcmUvc3JjL2xpYi9zZXJ2aWNlcy9zZXNzaW9uLXRva2VuLXByb3ZpZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFdEMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGFBQWEsQ0FBQzs7QUFJOUMsTUFBTSxPQUFPLDJCQUEyQjtJQUM5QixNQUFNLEdBQUcsTUFBTSxDQUFpQixlQUFlLENBQUMsQ0FBQztJQUV6RCxRQUFRO1FBQ04sTUFBTSxLQUFLLEdBQUcsY0FBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ2xFLE9BQU8sRUFBRSxDQUFDLEtBQUssSUFBSSxTQUFTLENBQUMsQ0FBQztJQUNoQyxDQUFDO3VHQU5VLDJCQUEyQjsyR0FBM0IsMkJBQTJCOzsyRkFBM0IsMkJBQTJCO2tCQUR2QyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIG9mIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IFNlY3VyaXR5Q29uZmlnIH0gZnJvbSAnLi4vbW9kZWxzJztcclxuaW1wb3J0IHsgU0VDVVJJVFlfQ09ORklHIH0gZnJvbSAnLi4vcHJvdmlkZXInO1xyXG5pbXBvcnQgeyBUb2tlblByb3ZpZGVyIH0gZnJvbSAnLi90b2tlbi1wcm92aWRlcic7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBTZXNzaW9uU3RvcmFnZVRva2VuUHJvdmlkZXIgaW1wbGVtZW50cyBUb2tlblByb3ZpZGVyIHtcclxuICBwcml2YXRlIGNvbmZpZyA9IGluamVjdDxTZWN1cml0eUNvbmZpZz4oU0VDVVJJVFlfQ09ORklHKTtcclxuXHJcbiAgZ2V0VG9rZW4oKTogT2JzZXJ2YWJsZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcclxuICAgIGNvbnN0IHRva2VuID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSh0aGlzLmNvbmZpZy50b2tlblN0b3JhZ2VLZXkpO1xyXG4gICAgcmV0dXJuIG9mKHRva2VuID8/IHVuZGVmaW5lZCk7XHJcbiAgfVxyXG59XHJcbiJdfQ==","import { inject, Injectable } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { convertJWTToUser } from '../models';\nimport { SECURITY_CONFIG, SECURITY_CONTEXT_TOKEN_PROVIDER } from '../provider';\nimport { AuthContextService } from './auth-context.service';\nimport * as i0 from \"@angular/core\";\nexport class LoginService {\n config = inject(SECURITY_CONFIG);\n tokenProvider = inject(SECURITY_CONTEXT_TOKEN_PROVIDER);\n authService = inject(AuthContextService);\n router = inject(Router);\n login(token) {\n if (token) {\n this.tokenProvider.setToken(token);\n this.authService.setUser(convertJWTToUser(token));\n }\n else {\n this.router.navigate([this.config.loginPage]);\n }\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.2.1\", ngImport: i0, type: LoginService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });\n static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"20.2.1\", ngImport: i0, type: LoginService });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.2.1\", ngImport: i0, type: LoginService, decorators: [{\n type: Injectable\n }] });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9naW4uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWJzL3NlY3VyaXR5L2NvcmUvc3JjL2xpYi9zZXJ2aWNlcy9sb2dpbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQWtCLE1BQU0sV0FBVyxDQUFDO0FBQzdELE9BQU8sRUFBRSxlQUFlLEVBQUUsK0JBQStCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDL0UsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7O0FBSTVELE1BQU0sT0FBTyxZQUFZO0lBQ2IsTUFBTSxHQUFHLE1BQU0sQ0FBaUIsZUFBZSxDQUFDLENBQUM7SUFDakQsYUFBYSxHQUFHLE1BQU0sQ0FBNEIsK0JBQStCLENBQUMsQ0FBQztJQUNuRixXQUFXLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDekMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUVoQyxLQUFLLENBQUMsS0FBYztRQUNoQixJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbkMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUN0RCxDQUFDO2FBQU0sQ0FBQztZQUNKLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQ2xELENBQUM7SUFDTCxDQUFDO3VHQWJRLFlBQVk7MkdBQVosWUFBWTs7MkZBQVosWUFBWTtrQkFEeEIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IGNvbnZlcnRKV1RUb1VzZXIsIFNlY3VyaXR5Q29uZmlnIH0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7IFNFQ1VSSVRZX0NPTkZJRywgU0VDVVJJVFlfQ09OVEVYVF9UT0tFTl9QUk9WSURFUiB9IGZyb20gJy4uL3Byb3ZpZGVyJztcbmltcG9ydCB7IEF1dGhDb250ZXh0U2VydmljZSB9IGZyb20gJy4vYXV0aC1jb250ZXh0LnNlcnZpY2UnO1xuaW1wb3J0IHsgTG9jYWxTdG9yYWdlVG9rZW5Qcm92aWRlciB9IGZyb20gJy4vbG9jYWwtc3RvcmFnZS10b2tlbi1wcm92aWRlcic7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBMb2dpblNlcnZpY2Uge1xuICAgIHByaXZhdGUgY29uZmlnID0gaW5qZWN0PFNlY3VyaXR5Q29uZmlnPihTRUNVUklUWV9DT05GSUcpO1xuICAgIHByaXZhdGUgdG9rZW5Qcm92aWRlciA9IGluamVjdDxMb2NhbFN0b3JhZ2VUb2tlblByb3ZpZGVyPihTRUNVUklUWV9DT05URVhUX1RPS0VOX1BST1ZJREVSKTtcbiAgICBwcml2YXRlIGF1dGhTZXJ2aWNlID0gaW5qZWN0KEF1dGhDb250ZXh0U2VydmljZSk7XG4gICAgcHJpdmF0ZSByb3V0ZXIgPSBpbmplY3QoUm91dGVyKTtcblxuICAgIGxvZ2luKHRva2VuPzogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGlmICh0b2tlbikge1xuICAgICAgICAgICAgdGhpcy50b2tlblByb3ZpZGVyLnNldFRva2VuKHRva2VuKTtcbiAgICAgICAgICAgIHRoaXMuYXV0aFNlcnZpY2Uuc2V0VXNlcihjb252ZXJ0SldUVG9Vc2VyKHRva2VuKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbdGhpcy5jb25maWcubG9naW5QYWdlXSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=","import { inject, Injectable } from '@angular/core';\nimport { SECURITY_CONTEXT_TOKEN_PROVIDER } from '../provider';\nimport { AuthContextService } from './auth-context.service';\nimport * as i0 from \"@angular/core\";\nexport class LogoutService {\n tokenProvider = inject(SECURITY_CONTEXT_TOKEN_PROVIDER);\n authService = inject(AuthContextService);\n logout() {\n this.tokenProvider.removeToken();\n this.authService.setUser(undefined);\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.2.1\", ngImport: i0, type: LogoutService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });\n static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"20.2.1\", ngImport: i0, type: LogoutService });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.2.1\", ngImport: i0, type: LogoutService, decorators: [{\n type: Injectable\n }] });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nb3V0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGlicy9zZWN1cml0eS9jb3JlL3NyYy9saWIvc2VydmljZXMvbG9nb3V0LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLCtCQUErQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzlELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDOztBQUk1RCxNQUFNLE9BQU8sYUFBYTtJQUNMLGFBQWEsR0FBRyxNQUFNLENBQTRCLCtCQUErQixDQUFDLENBQUM7SUFDbkYsV0FBVyxHQUFHLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBRTFELE1BQU07UUFDRixJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7dUdBUFEsYUFBYTsyR0FBYixhQUFhOzsyRkFBYixhQUFhO2tCQUR6QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTRUNVUklUWV9DT05URVhUX1RPS0VOX1BST1ZJREVSIH0gZnJvbSAnLi4vcHJvdmlkZXInO1xuaW1wb3J0IHsgQXV0aENvbnRleHRTZXJ2aWNlIH0gZnJvbSAnLi9hdXRoLWNvbnRleHQuc2VydmljZSc7XG5pbXBvcnQgeyBMb2NhbFN0b3JhZ2VUb2tlblByb3ZpZGVyIH0gZnJvbSAnLi9sb2NhbC1zdG9yYWdlLXRva2VuLXByb3ZpZGVyJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIExvZ291dFNlcnZpY2Uge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdG9rZW5Qcm92aWRlciA9IGluamVjdDxMb2NhbFN0b3JhZ2VUb2tlblByb3ZpZGVyPihTRUNVUklUWV9DT05URVhUX1RPS0VOX1BST1ZJREVSKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGF1dGhTZXJ2aWNlID0gaW5qZWN0KEF1dGhDb250ZXh0U2VydmljZSk7XG5cbiAgICBsb2dvdXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMudG9rZW5Qcm92aWRlci5yZW1vdmVUb2tlbigpO1xuICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLnNldFVzZXIodW5kZWZpbmVkKTtcbiAgICB9XG59XG4iXX0=","import { Directive, Input, TemplateRef, ViewContainerRef, } from '@angular/core';\nimport { distinctUntilChanged } from 'rxjs';\nimport { AuthContextService } from '../services';\nimport * as i0 from \"@angular/core\";\nimport * as i1 from \"../services\";\nexport class HasPermissionDirective {\n templateRef;\n viewContainer;\n authContext;\n requiredPermissions = '';\n sub;\n constructor(templateRef, viewContainer, authContext) {\n this.templateRef = templateRef;\n this.viewContainer = viewContainer;\n this.authContext = authContext;\n }\n set hasPermission(value) {\n this.requiredPermissions = value;\n this.updateView();\n }\n ngOnDestroy() {\n this.unregister();\n }\n unregister() {\n this.sub?.unsubscribe();\n }\n updateView() {\n this.unregister();\n if (this.requiredPermissions || this.requiredPermissions.length) {\n this.sub = this.authContext\n .hasRequiredPermission(this.requiredPermissions)\n .pipe(distinctUntilChanged())\n .subscribe((hasPerm) => {\n if (hasPerm) {\n this.viewContainer.createEmbeddedView(this.templateRef);\n }\n else {\n this.viewContainer.clear();\n }\n });\n }\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.2.1\", ngImport: i0, type: HasPermissionDirective, deps: [{ token: i0.TemplateRef }, { token: i0.ViewContainerRef }, { token: i1.AuthContextService }], target: i0.ɵɵFactoryTarget.Directive });\n static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"20.2.1\", type: HasPermissionDirective, isStandalone: true, selector: \"[hasPermission]\", inputs: { hasPermission: \"hasPermission\" }, ngImport: i0 });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.2.1\", ngImport: i0, type: HasPermissionDirective, decorators: [{\n type: Directive,\n args: [{\n standalone: true,\n selector: '[hasPermission]',\n }]\n }], ctorParameters: () => [{ type: i0.TemplateRef }, { type: i0.ViewContainerRef }, { type: i1.AuthContextService }], propDecorators: { hasPermission: [{\n type: Input\n }] } });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFzLXBlcm1pc3Npb24uZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYnMvc2VjdXJpdHkvY29yZS9zcmMvbGliL2RpcmVjdGl2ZXMvaGFzLXBlcm1pc3Npb24uZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUNMLFdBQVcsRUFDWCxnQkFBZ0IsR0FFakIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLG9CQUFvQixFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUMxRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxhQUFhLENBQUM7OztBQU1qRCxNQUFNLE9BQU8sc0JBQXNCO0lBS3ZCO0lBQ0E7SUFDQTtJQU5GLG1CQUFtQixHQUFzQixFQUFFLENBQUM7SUFDNUMsR0FBRyxDQUFnQjtJQUUzQixZQUNVLFdBQTJCLEVBQzNCLGFBQStCLEVBQy9CLFdBQStCO1FBRi9CLGdCQUFXLEdBQVgsV0FBVyxDQUFnQjtRQUMzQixrQkFBYSxHQUFiLGFBQWEsQ0FBa0I7UUFDL0IsZ0JBQVcsR0FBWCxXQUFXLENBQW9CO0lBQ3RDLENBQUM7SUFFSixJQUNJLGFBQWEsQ0FBQyxLQUF3QjtRQUN4QyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsS0FBSyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNwQixDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNwQixDQUFDO0lBRU8sVUFBVTtRQUNoQixJQUFJLENBQUMsR0FBRyxFQUFFLFdBQVcsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFTyxVQUFVO1FBQ2hCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNsQixJQUFJLElBQUksQ0FBQyxtQkFBbUIsSUFBSSxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDaEUsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVztpQkFDeEIscUJBQXFCLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDO2lCQUMvQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztpQkFDNUIsU0FBUyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7Z0JBQ3JCLElBQUksT0FBTyxFQUFFLENBQUM7b0JBQ1osSUFBSSxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQzFELENBQUM7cUJBQU0sQ0FBQztvQkFDTixJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUM3QixDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDO0lBQ0gsQ0FBQzt1R0F0Q1Usc0JBQXNCOzJGQUF0QixzQkFBc0I7OzJGQUF0QixzQkFBc0I7a0JBSmxDLFNBQVM7bUJBQUM7b0JBQ1QsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLFFBQVEsRUFBRSxpQkFBaUI7aUJBQzVCO2dKQVlLLGFBQWE7c0JBRGhCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIERpcmVjdGl2ZSxcclxuICBJbnB1dCxcclxuICBUZW1wbGF0ZVJlZixcclxuICBWaWV3Q29udGFpbmVyUmVmLFxyXG4gIE9uRGVzdHJveSxcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgZGlzdGluY3RVbnRpbENoYW5nZWQsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBBdXRoQ29udGV4dFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcyc7XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIHNlbGVjdG9yOiAnW2hhc1Blcm1pc3Npb25dJyxcclxufSlcclxuZXhwb3J0IGNsYXNzIEhhc1Blcm1pc3Npb25EaXJlY3RpdmU8VD4gaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xyXG4gIHByaXZhdGUgcmVxdWlyZWRQZXJtaXNzaW9uczogc3RyaW5nIHwgc3RyaW5nW10gPSAnJztcclxuICBwcml2YXRlIHN1Yj86IFN1YnNjcmlwdGlvbjtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHRlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjxUPixcclxuICAgIHByaXZhdGUgdmlld0NvbnRhaW5lcjogVmlld0NvbnRhaW5lclJlZixcclxuICAgIHByaXZhdGUgYXV0aENvbnRleHQ6IEF1dGhDb250ZXh0U2VydmljZVxyXG4gICkge31cclxuXHJcbiAgQElucHV0KClcclxuICBzZXQgaGFzUGVybWlzc2lvbih2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10pIHtcclxuICAgIHRoaXMucmVxdWlyZWRQZXJtaXNzaW9ucyA9IHZhbHVlO1xyXG4gICAgdGhpcy51cGRhdGVWaWV3KCk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMudW5yZWdpc3RlcigpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1bnJlZ2lzdGVyKCkge1xyXG4gICAgdGhpcy5zdWI/LnVuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZVZpZXcoKTogdm9pZCB7XHJcbiAgICB0aGlzLnVucmVnaXN0ZXIoKTtcclxuICAgIGlmICh0aGlzLnJlcXVpcmVkUGVybWlzc2lvbnMgfHwgdGhpcy5yZXF1aXJlZFBlcm1pc3Npb25zLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLnN1YiA9IHRoaXMuYXV0aENvbnRleHRcclxuICAgICAgICAuaGFzUmVxdWlyZWRQZXJtaXNzaW9uKHRoaXMucmVxdWlyZWRQZXJtaXNzaW9ucylcclxuICAgICAgICAucGlwZShkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoKGhhc1Blcm0pID0+IHtcclxuICAgICAgICAgIGlmIChoYXNQZXJtKSB7XHJcbiAgICAgICAgICAgIHRoaXMudmlld0NvbnRhaW5lci5jcmVhdGVFbWJlZGRlZFZpZXcodGhpcy50ZW1wbGF0ZVJlZik7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnZpZXdDb250YWluZXIuY2xlYXIoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19","import { Directive, Input, TemplateRef, ViewContainerRef, } from '@angular/core';\nimport { distinctUntilChanged } from 'rxjs';\nimport { AuthContextService } from '../services';\nimport * as i0 from \"@angular/core\";\nimport * as i1 from \"../services\";\nexport class HasRoleDirective {\n templateRef;\n viewContainer;\n authContext;\n requiredRoles;\n sub;\n constructor(templateRef, viewContainer, authContext) {\n this.templateRef = templateRef;\n this.viewContainer = viewContainer;\n this.authContext = authContext;\n }\n set hasRole(value) {\n this.requiredRoles = value;\n this.updateView();\n }\n ngOnDestroy() {\n this.unregister();\n }\n unregister() {\n this.sub?.unsubscribe();\n }\n updateView() {\n this.unregister();\n if (this.requiredRoles || this.requiredRoles?.length) {\n this.sub = this.authContext\n .hasRequiredRole(this.requiredRoles)\n .pipe(distinctUntilChanged())\n .subscribe((hasRole) => {\n if (hasRole) {\n this.viewContainer.createEmbeddedView(this.templateRef);\n }\n else {\n this.viewContainer.clear();\n }\n });\n }\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.2.1\", ngImport: i0, type: HasRoleDirective, deps: [{ token: i0.TemplateRef }, { token: i0.ViewContainerRef }, { token: i1.AuthContextService }], target: i0.ɵɵFactoryTarget.Directive });\n static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"20.2.1\", type: HasRoleDirective, isStandalone: true, selector: \"[hasRole]\", inputs: { hasRole: \"hasRole\" }, ngImport: i0 });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.2.1\", ngImport: i0, type: HasRoleDirective, decorators: [{\n type: Directive,\n args: [{\n standalone: true,\n selector: '[hasRole]',\n }]\n }], ctorParameters: () => [{ type: i0.TemplateRef }, { type: i0.ViewContainerRef }, { type: i1.AuthContextService }], propDecorators: { hasRole: [{\n type: Input\n }] } });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFzLXJvbGUuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYnMvc2VjdXJpdHkvY29yZS9zcmMvbGliL2RpcmVjdGl2ZXMvaGFzLXJvbGUuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUNMLFdBQVcsRUFDWCxnQkFBZ0IsR0FFakIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLG9CQUFvQixFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUMxRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxhQUFhLENBQUM7OztBQU1qRCxNQUFNLE9BQU8sZ0JBQWdCO0lBS2pCO0lBQ0E7SUFDQTtJQU5GLGFBQWEsQ0FBZ0M7SUFDN0MsR0FBRyxDQUFnQjtJQUUzQixZQUNVLFdBQTJCLEVBQzNCLGFBQStCLEVBQy9CLFdBQStCO1FBRi9CLGdCQUFXLEdBQVgsV0FBVyxDQUFnQjtRQUMzQixrQkFBYSxHQUFiLGFBQWEsQ0FBa0I7UUFDL0IsZ0JBQVcsR0FBWCxXQUFXLENBQW9CO0lBQ3RDLENBQUM7SUFFSixJQUNJLE9BQU8sQ0FBQyxLQUF3QjtRQUNsQyxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztRQUMzQixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDcEIsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDcEIsQ0FBQztJQUVPLFVBQVU7UUFDaEIsSUFBSSxDQUFDLEdBQUcsRUFBRSxXQUFXLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRU8sVUFBVTtRQUNoQixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDbEIsSUFBSSxJQUFJLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsTUFBTSxFQUFFLENBQUM7WUFDckQsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVztpQkFDeEIsZUFBZSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUM7aUJBQ25DLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO2lCQUM1QixTQUFTLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtnQkFDckIsSUFBSSxPQUFPLEVBQUUsQ0FBQztvQkFDWixJQUFJLENBQUMsYUFBYSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDMUQsQ0FBQztxQkFBTSxDQUFDO29CQUNOLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQzdCLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUM7SUFDSCxDQUFDO3VHQXRDVSxnQkFBZ0I7MkZBQWhCLGdCQUFnQjs7MkZBQWhCLGdCQUFnQjtrQkFKNUIsU0FBUzttQkFBQztvQkFDVCxVQUFVLEVBQUUsSUFBSTtvQkFDaEIsUUFBUSxFQUFFLFdBQVc7aUJBQ3RCO2dKQVlLLE9BQU87c0JBRFYsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgRGlyZWN0aXZlLFxyXG4gIElucHV0LFxyXG4gIFRlbXBsYXRlUmVmLFxyXG4gIFZpZXdDb250YWluZXJSZWYsXHJcbiAgT25EZXN0cm95LFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IEF1dGhDb250ZXh0U2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzJztcclxuXHJcbkBEaXJlY3RpdmUoe1xyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgc2VsZWN0b3I6ICdbaGFzUm9sZV0nLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgSGFzUm9sZURpcmVjdGl2ZTxUPiBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XHJcbiAgcHJpdmF0ZSByZXF1aXJlZFJvbGVzOiBzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHN1Yj86IFN1YnNjcmlwdGlvbjtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHRlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjxUPixcclxuICAgIHByaXZhdGUgdmlld0NvbnRhaW5lcjogVmlld0NvbnRhaW5lclJlZixcclxuICAgIHByaXZhdGUgYXV0aENvbnRleHQ6IEF1dGhDb250ZXh0U2VydmljZVxyXG4gICkge31cclxuXHJcbiAgQElucHV0KClcclxuICBzZXQgaGFzUm9sZSh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10pIHtcclxuICAgIHRoaXMucmVxdWlyZWRSb2xlcyA9IHZhbHVlO1xyXG4gICAgdGhpcy51cGRhdGVWaWV3KCk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMudW5yZWdpc3RlcigpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1bnJlZ2lzdGVyKCkge1xyXG4gICAgdGhpcy5zdWI/LnVuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZVZpZXcoKTogdm9pZCB7XHJcbiAgICB0aGlzLnVucmVnaXN0ZXIoKTtcclxuICAgIGlmICh0aGlzLnJlcXVpcmVkUm9sZXMgfHwgdGhpcy5yZXF1aXJlZFJvbGVzPy5sZW5ndGgpIHtcclxuICAgICAgdGhpcy5zdWIgPSB0aGlzLmF1dGhDb250ZXh0XHJcbiAgICAgICAgLmhhc1JlcXVpcmVkUm9sZSh0aGlzLnJlcXVpcmVkUm9sZXMpXHJcbiAgICAgICAgLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSlcclxuICAgICAgICAuc3Vic2NyaWJlKChoYXNSb2xlKSA9PiB7XHJcbiAgICAgICAgICBpZiAoaGFzUm9sZSkge1xyXG4gICAgICAgICAgICB0aGlzLnZpZXdDb250YWluZXIuY3JlYXRlRW1iZWRkZWRWaWV3KHRoaXMudGVtcGxhdGVSZWYpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy52aWV3Q29udGFpbmVyLmNsZWFyKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==","/**\n * Generated bundle index. Do not edit.\n */\nexport * from './index';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyaXNvZnQtc2VjdXJpdHktY29yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWJzL3NlY3VyaXR5L2NvcmUvc3JjL3Zlcmlzb2Z0LXNlY3VyaXR5LWNvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLFNBQVMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9pbmRleCc7XG4iXX0="],"names":["i1.AuthContextService"],"mappings":"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"}
|