@ngbase/adk 0.1.16 → 0.1.17

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.
@@ -1,5 +1,7 @@
1
1
  import * as i0 from '@angular/core';
2
- import { InjectionToken, makeEnvironmentProviders, inject, Injectable } from '@angular/core';
2
+ import { InjectionToken, makeEnvironmentProviders, signal, computed, inject, Injectable } from '@angular/core';
3
+ import { BehaviorSubject, throwError, of } from 'rxjs';
4
+ import { tap, catchError, switchMap, filter, take, map } from 'rxjs/operators';
3
5
 
4
6
  // injectiontoken for getting the token
5
7
  const JWT_OPTIONS = new InjectionToken('JWT_OPTIONS');
@@ -9,41 +11,59 @@ function provideJwt(options) {
9
11
  { provide: JwtInterceptor, useClass: JwtInterceptor },
10
12
  ]);
11
13
  }
12
- class JwtService {
13
- constructor() {
14
- this.tokenKey = 'auth_token';
15
- this.options = inject(JWT_OPTIONS, { optional: true });
14
+ class TokenHandler {
15
+ constructor(storageKey, tokenGetter, tokenSetter) {
16
+ this.storageKey = storageKey;
17
+ this.tokenGetter = tokenGetter;
18
+ this.tokenSetter = tokenSetter;
19
+ this._token = signal(null, ...(ngDevMode ? [{ debugName: "_token" }] : []));
20
+ this.token = this._token.asReadonly();
21
+ this.decoded = computed(() => {
22
+ const tokenValue = this._token();
23
+ if (!tokenValue)
24
+ return null;
25
+ try {
26
+ const payload = tokenValue.split('.')[1];
27
+ return JSON.parse(this.base64UrlDecode(payload));
28
+ }
29
+ catch (e) {
30
+ console.error('Error decoding token', e);
31
+ return null;
32
+ }
33
+ }, ...(ngDevMode ? [{ debugName: "decoded" }] : []));
34
+ this.exp = computed(() => {
35
+ const decodedToken = this.decoded();
36
+ return decodedToken?.exp || null;
37
+ }, ...(ngDevMode ? [{ debugName: "exp" }] : []));
38
+ this.expirationDate = computed(() => {
39
+ const exp = this.exp();
40
+ if (!exp)
41
+ return null;
42
+ const date = new Date(0);
43
+ date.setUTCSeconds(exp);
44
+ return date;
45
+ }, ...(ngDevMode ? [{ debugName: "expirationDate" }] : []));
46
+ this.isExpired = () => {
47
+ const expiry = this.expirationDate();
48
+ const ise = expiry ? expiry <= new Date() : true;
49
+ return ise;
50
+ };
51
+ const initialToken = this.tokenGetter?.() ?? localStorage.getItem(this.storageKey);
52
+ this._token.set(initialToken);
16
53
  }
17
- getToken() {
18
- return this.options?.tokenGetter() ?? localStorage.getItem(this.tokenKey);
19
- }
20
- isTokenExpired(token) {
21
- const inputToken = token ?? this.getToken();
22
- if (!inputToken)
23
- return true;
24
- const expiry = this.getTokenExpirationDate(inputToken);
25
- return expiry ? expiry <= new Date() : true;
26
- }
27
- decodeToken(token) {
28
- const inputToken = token ?? this.getToken();
29
- if (!inputToken)
30
- return null;
31
- try {
32
- const payload = inputToken.split('.')[1];
33
- return JSON.parse(this.base64UrlDecode(payload));
54
+ setToken(token) {
55
+ if (this.tokenSetter) {
56
+ this.tokenSetter(token);
34
57
  }
35
- catch (e) {
36
- console.error('Error decoding token', e);
37
- return null;
58
+ else {
59
+ if (token) {
60
+ localStorage.setItem(this.storageKey, token);
61
+ }
62
+ else {
63
+ localStorage.removeItem(this.storageKey);
64
+ }
38
65
  }
39
- }
40
- getTokenExpirationDate(token) {
41
- const decoded = this.decodeToken(token);
42
- if (!decoded || !decoded.exp)
43
- return null;
44
- const date = new Date(0);
45
- date.setUTCSeconds(decoded.exp);
46
- return date;
66
+ this._token.set(token);
47
67
  }
48
68
  base64UrlDecode(input) {
49
69
  input = input.replace(/-/g, '+').replace(/_/g, '/');
@@ -52,6 +72,40 @@ class JwtService {
52
72
  }
53
73
  return atob(input);
54
74
  }
75
+ }
76
+ class JwtService {
77
+ constructor() {
78
+ this.options = inject(JWT_OPTIONS, { optional: true });
79
+ this.accessTokenKey = 'access_token';
80
+ this.refreshTokenKey = 'refresh_token';
81
+ this._accessToken = new TokenHandler(this.accessTokenKey, this.options?.tokenGetter, this.options?.tokenSetter);
82
+ this._refreshToken = new TokenHandler(this.refreshTokenKey, this.options?.refreshTokenGetter, this.options?.refreshTokenSetter);
83
+ this.getAccessToken = this._accessToken.token;
84
+ this.getRefreshToken = this._refreshToken.token;
85
+ this.isAccessTokenExpired = this._accessToken.isExpired;
86
+ this.isRefreshTokenExpired = this._refreshToken.isExpired;
87
+ this.decodeToken = this._accessToken.decoded;
88
+ this.getTokenExpirationDate = this._accessToken.expirationDate;
89
+ }
90
+ setTokens(accessToken, refreshToken) {
91
+ this._accessToken.setToken(accessToken);
92
+ this._refreshToken.setToken(refreshToken);
93
+ }
94
+ clearTokens() {
95
+ this._accessToken.setToken(null);
96
+ this._refreshToken.setToken(null);
97
+ }
98
+ isAccessTokenNearExpiry(minutesBeforeExpiry = 5) {
99
+ const token = this.getAccessToken();
100
+ if (!token)
101
+ return true;
102
+ const expiry = this.getTokenExpirationDate();
103
+ if (!expiry)
104
+ return true;
105
+ console.log('minutesBeforeExpiry ', minutesBeforeExpiry);
106
+ const bufferTime = new Date(Date.now() + 0.5 * 60 * 1000);
107
+ return expiry <= bufferTime;
108
+ }
55
109
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.0", ngImport: i0, type: JwtService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
56
110
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.2.0", ngImport: i0, type: JwtService, providedIn: 'root' }); }
57
111
  }
@@ -65,7 +119,7 @@ class JwtInterceptor {
65
119
  this.jwtService = jwtService;
66
120
  }
67
121
  intercept(req, next) {
68
- const token = this.jwtService.getToken();
122
+ const token = this.jwtService.getAccessToken();
69
123
  if (token) {
70
124
  req = req.clone({
71
125
  setHeaders: { Authorization: `Bearer ${token}` },
@@ -82,9 +136,233 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.0", ngImpor
82
136
  }], ctorParameters: () => [{ type: JwtService }] });
83
137
  const injectJwt = () => inject(JwtService);
84
138
 
139
+ class TokenRefreshService {
140
+ constructor(refreshApi) {
141
+ this.refreshApi = refreshApi;
142
+ this.jwt = injectJwt();
143
+ this.refreshSubject = new BehaviorSubject(null);
144
+ this.isRefreshing = false;
145
+ /**
146
+ * Returns an observable that emits when refresh completes
147
+ */
148
+ this.getRefreshStatus$ = this.refreshSubject.asObservable();
149
+ }
150
+ /**
151
+ * Attempts to refresh the access token using the refresh token
152
+ * @returns Observable with new token pair
153
+ */
154
+ refreshToken() {
155
+ const refreshToken = this.jwt.getRefreshToken();
156
+ if (!refreshToken) {
157
+ return throwError(() => new Error('No refresh token available'));
158
+ }
159
+ if (this.isRefreshing) {
160
+ // If already refreshing, wait for the refresh to complete
161
+ return this.refreshSubject.asObservable();
162
+ }
163
+ this.isRefreshing = true;
164
+ this.refreshSubject.next(null);
165
+ return this.refreshApi().pipe(tap(res => {
166
+ this.isRefreshing = false;
167
+ this.refreshSubject.next(res);
168
+ }), catchError(error => {
169
+ this.isRefreshing = false;
170
+ this.refreshSubject.next(null);
171
+ // Clear tokens on refresh failure
172
+ this.jwt.clearTokens();
173
+ return throwError(() => error);
174
+ }));
175
+ }
176
+ /**
177
+ * Checks if a refresh operation is currently in progress
178
+ */
179
+ isTokenRefreshing() {
180
+ return this.isRefreshing;
181
+ }
182
+ /**
183
+ * Proactively refresh token if it's expired or near expiry
184
+ * @param minutesBeforeExpiry How many minutes before expiry to refresh (default: 5)
185
+ * @returns Observable that emits true if refresh was needed and successful, false if not needed
186
+ */
187
+ refreshIfNeeded(minutesBeforeExpiry = 5) {
188
+ if (this.jwt.isRefreshTokenExpired()) {
189
+ // Refresh token is expired, clear tokens and reject
190
+ this.jwt.clearTokens();
191
+ return throwError(() => new Error('Refresh token expired'));
192
+ }
193
+ if (this.jwt.isAccessTokenExpired() || this.jwt.isAccessTokenNearExpiry(minutesBeforeExpiry)) {
194
+ // Need to refresh
195
+ return this.refreshToken().pipe(switchMap(() => of(true)), // Return true to indicate refresh was performed
196
+ catchError(error => throwError(() => error)));
197
+ }
198
+ // No refresh needed
199
+ return of(false);
200
+ }
201
+ }
202
+
203
+ /**
204
+ * Centralized authentication service for guards and interceptors
205
+ * Handles token validation and refresh logic consistently
206
+ */
207
+ class TokenGuardHelper {
208
+ constructor(refreshApi, logout) {
209
+ this.refreshApi = refreshApi;
210
+ this.logout = logout;
211
+ this.jwt = injectJwt();
212
+ /**
213
+ * Checks if user is authenticated, handles token refresh if needed
214
+ * Returns Observable<boolean> - true if authenticated, false if should redirect to login
215
+ */
216
+ this.checkAuthentication = () => {
217
+ // Check if we have basic tokens
218
+ const accessToken = this.jwt.getAccessToken();
219
+ const refreshToken = this.jwt.getRefreshToken();
220
+ if (!accessToken || !refreshToken) {
221
+ console.log('AuthGuard: No tokens available, redirecting to login');
222
+ return of(false);
223
+ }
224
+ // Check if refresh token is expired
225
+ if (this.jwt.isRefreshTokenExpired()) {
226
+ console.warn('AuthGuard: Refresh token is expired, clearing tokens');
227
+ this.logout();
228
+ return of(false);
229
+ }
230
+ // If access token is valid, allow access
231
+ if (!this.jwt.isAccessTokenExpired() && !this.jwt.isAccessTokenNearExpiry(5)) {
232
+ console.log('AuthGuard: Access token is valid, allowing access');
233
+ return of(true);
234
+ }
235
+ // Access token is expired or near expiry, need to refresh
236
+ console.log('AuthGuard: Access token expired or near expiry, attempting refresh');
237
+ // Check if already refreshing
238
+ if (this.tokenRefreshService.isTokenRefreshing()) {
239
+ console.log('AuthGuard: Token refresh already in progress, waiting...');
240
+ return this.tokenRefreshService.getRefreshStatus$.pipe(filter(refreshed => refreshed === true), take(1), map(() => {
241
+ const newToken = this.jwt.getAccessToken();
242
+ if (newToken && !this.jwt.isAccessTokenExpired()) {
243
+ console.log('AuthGuard: Token refresh completed successfully');
244
+ return true;
245
+ }
246
+ else {
247
+ console.warn('AuthGuard: No valid token after refresh completion');
248
+ return false;
249
+ }
250
+ }), catchError(error => {
251
+ console.error('AuthGuard: Failed to wait for token refresh:', error);
252
+ return of(false);
253
+ }));
254
+ }
255
+ // Start token refresh
256
+ return this.tokenRefreshService.refreshToken().pipe(map(() => {
257
+ if (!this.jwt.isAccessTokenExpired()) {
258
+ console.log('AuthGuard: Token refresh successful');
259
+ return true;
260
+ }
261
+ else {
262
+ console.warn('AuthGuard: Invalid refresh response or token still expired');
263
+ return false;
264
+ }
265
+ }), catchError(refreshError => {
266
+ console.warn('AuthGuard: Token refresh failed:', refreshError);
267
+ this.logout();
268
+ return of(false);
269
+ }));
270
+ };
271
+ /**
272
+ * Enhanced authentication check with automatic retry
273
+ * Attempts refresh once, then falls back to login redirect
274
+ */
275
+ this.ensureAuthenticated = () => {
276
+ return this.checkAuthentication().pipe(switchMap(isAuthenticated => {
277
+ if (isAuthenticated) {
278
+ return of(true);
279
+ }
280
+ // If not authenticated after refresh attempt, redirect to login
281
+ console.log('AuthGuard: Authentication failed, redirecting to login');
282
+ this.logout();
283
+ return of(false);
284
+ }));
285
+ };
286
+ /**
287
+ * Quick synchronous check for authentication status
288
+ * Use this only when you don't need token refresh
289
+ */
290
+ this.isQuickAuthenticated = () => {
291
+ const accessToken = this.jwt.getAccessToken();
292
+ const refreshToken = this.jwt.getRefreshToken();
293
+ if (!accessToken || !refreshToken)
294
+ return false;
295
+ if (this.jwt.isRefreshTokenExpired())
296
+ return false;
297
+ if (this.jwt.isAccessTokenExpired())
298
+ return false;
299
+ return true;
300
+ };
301
+ /**
302
+ * Validates and refreshes token for HTTP requests
303
+ * Returns Observable<string> with valid access token or throws error
304
+ * Used by interceptors
305
+ */
306
+ this.getValidAccessToken = () => {
307
+ // Check if we have tokens
308
+ const accessToken = this.jwt.getAccessToken();
309
+ if (!accessToken) {
310
+ console.warn('Interceptor: No access token available');
311
+ this.logout();
312
+ throw new Error('No access token available');
313
+ }
314
+ // Check if refresh token is expired
315
+ if (this.jwt.isRefreshTokenExpired()) {
316
+ console.warn('Interceptor: Refresh token is expired, redirecting to login');
317
+ this.logout();
318
+ throw new Error('Refresh token expired');
319
+ }
320
+ // If access token is valid, return it
321
+ if (!this.jwt.isAccessTokenExpired() && !this.jwt.isAccessTokenNearExpiry(5)) {
322
+ return of(accessToken);
323
+ }
324
+ // Access token needs refresh
325
+ console.log('Interceptor: Access token expired or near expiry, refreshing proactively');
326
+ // Check if already refreshing
327
+ if (this.tokenRefreshService.isTokenRefreshing()) {
328
+ return this.tokenRefreshService.getRefreshStatus$.pipe(filter(refreshed => refreshed === true), take(1), map(() => {
329
+ const newToken = this.jwt.getAccessToken();
330
+ if (newToken) {
331
+ return newToken;
332
+ }
333
+ else {
334
+ this.logout();
335
+ throw new Error('Failed to get new access token');
336
+ }
337
+ }), catchError(error => {
338
+ console.error('Interceptor: Failed to wait for token refresh:', error);
339
+ this.logout();
340
+ throw error;
341
+ }));
342
+ }
343
+ // Start token refresh
344
+ return this.tokenRefreshService.refreshToken().pipe(map(() => {
345
+ const newToken = this.jwt.getAccessToken();
346
+ if (newToken) {
347
+ return newToken;
348
+ }
349
+ else {
350
+ this.logout();
351
+ throw new Error('Invalid refresh response');
352
+ }
353
+ }), catchError(refreshError => {
354
+ console.warn('Interceptor: Token refresh failed:', refreshError);
355
+ this.logout();
356
+ throw refreshError;
357
+ }));
358
+ };
359
+ this.tokenRefreshService = new TokenRefreshService(this.refreshApi);
360
+ }
361
+ }
362
+
85
363
  /**
86
364
  * Generated bundle index. Do not edit.
87
365
  */
88
366
 
89
- export { JwtService, injectJwt, provideJwt };
367
+ export { JwtService, TokenGuardHelper, injectJwt, provideJwt };
90
368
  //# sourceMappingURL=ngbase-adk-jwt.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ngbase-adk-jwt.mjs","sources":["../../../projects/adk/jwt/jwt.service.ts","../../../projects/adk/jwt/ngbase-adk-jwt.ts"],"sourcesContent":["import { HttpEvent, HttpHandler, HttpInterceptor, HttpRequest } from '@angular/common/http';\nimport { inject, Injectable, InjectionToken, makeEnvironmentProviders } from '@angular/core';\nimport { Observable } from 'rxjs';\n\n// injectiontoken for getting the token\nconst JWT_OPTIONS = new InjectionToken<JwtOptions>('JWT_OPTIONS');\n\ninterface JwtOptions {\n tokenGetter: () => string | null | undefined;\n}\n\nexport function provideJwt(options: () => JwtOptions) {\n return makeEnvironmentProviders([\n { provide: JWT_OPTIONS, useFactory: options },\n { provide: JwtInterceptor, useClass: JwtInterceptor },\n ]);\n}\n\n@Injectable({ providedIn: 'root' })\nexport class JwtService<T> {\n private tokenKey = 'auth_token';\n private options = inject(JWT_OPTIONS, { optional: true });\n\n getToken(): string | null {\n return this.options?.tokenGetter() ?? localStorage.getItem(this.tokenKey);\n }\n\n isTokenExpired(token?: string): boolean {\n const inputToken = token ?? this.getToken();\n if (!inputToken) return true;\n\n const expiry = this.getTokenExpirationDate(inputToken);\n return expiry ? expiry <= new Date() : true;\n }\n\n decodeToken(token?: string): T | null {\n const inputToken = token ?? this.getToken();\n if (!inputToken) return null;\n\n try {\n const payload = inputToken.split('.')[1];\n return JSON.parse(this.base64UrlDecode(payload));\n } catch (e) {\n console.error('Error decoding token', e);\n return null;\n }\n }\n\n getTokenExpirationDate(token?: string): Date | null {\n const decoded = this.decodeToken(token) as T extends { exp: number } ? T : null;\n if (!decoded || !decoded.exp) return null;\n\n const date = new Date(0);\n date.setUTCSeconds(decoded.exp);\n return date;\n }\n\n private base64UrlDecode(input: string): string {\n input = input.replace(/-/g, '+').replace(/_/g, '/');\n while (input.length % 4) {\n input += '=';\n }\n return atob(input);\n }\n}\n\n// jwt interceptor\n@Injectable({ providedIn: 'root' })\nexport class JwtInterceptor implements HttpInterceptor {\n constructor(private jwtService: JwtService<any>) {}\n\n intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\n const token = this.jwtService.getToken();\n if (token) {\n req = req.clone({\n setHeaders: { Authorization: `Bearer ${token}` },\n });\n }\n return next.handle(req);\n }\n}\n\nexport const injectJwt = () => inject(JwtService);\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ngbase-adk-jwt.mjs","sources":["../../../projects/adk/jwt/jwt.service.ts","../../../projects/adk/jwt/token-refresh.ts","../../../projects/adk/jwt/token-guard.ts","../../../projects/adk/jwt/ngbase-adk-jwt.ts"],"sourcesContent":["import { HttpEvent, HttpHandler, HttpInterceptor, HttpRequest } from '@angular/common/http';\nimport {\n computed,\n inject,\n Injectable,\n InjectionToken,\n makeEnvironmentProviders,\n signal,\n} from '@angular/core';\nimport { Observable } from 'rxjs';\n\n// injectiontoken for getting the token\nconst JWT_OPTIONS = new InjectionToken<JwtOptions>('JWT_OPTIONS');\n\ninterface JwtOptions {\n tokenGetter: () => string | null | undefined;\n tokenSetter?: (token: string | null) => void;\n refreshTokenGetter?: () => string | null | undefined;\n refreshTokenSetter?: (token: string | null) => void;\n}\n\nexport function provideJwt(options: () => JwtOptions) {\n return makeEnvironmentProviders([\n { provide: JWT_OPTIONS, useFactory: options },\n { provide: JwtInterceptor, useClass: JwtInterceptor },\n ]);\n}\n\nclass TokenHandler<T = any> {\n readonly _token = signal<string | null>(null);\n readonly token = this._token.asReadonly();\n\n readonly decoded = computed<T | null>(() => {\n const tokenValue = this._token();\n if (!tokenValue) return null;\n\n try {\n const payload = tokenValue.split('.')[1];\n return JSON.parse(this.base64UrlDecode(payload));\n } catch (e) {\n console.error('Error decoding token', e);\n return null;\n }\n });\n\n readonly exp = computed<number | null>(() => {\n const decodedToken = this.decoded() as T extends { exp: number } ? T : null;\n return decodedToken?.exp || null;\n });\n\n readonly expirationDate = computed<Date | null>(() => {\n const exp = this.exp();\n if (!exp) return null;\n\n const date = new Date(0);\n date.setUTCSeconds(exp);\n return date;\n });\n\n readonly isExpired = () => {\n const expiry = this.expirationDate();\n const ise = expiry ? expiry <= new Date() : true;\n return ise;\n };\n\n constructor(\n private storageKey: string,\n private tokenGetter?: () => string | null | undefined,\n private tokenSetter?: (token: string | null) => void,\n ) {\n const initialToken = this.tokenGetter?.() ?? localStorage.getItem(this.storageKey);\n this._token.set(initialToken);\n }\n\n setToken(token: string | null): void {\n if (this.tokenSetter) {\n this.tokenSetter(token);\n } else {\n if (token) {\n localStorage.setItem(this.storageKey, token);\n } else {\n localStorage.removeItem(this.storageKey);\n }\n }\n this._token.set(token);\n }\n\n private base64UrlDecode(input: string): string {\n input = input.replace(/-/g, '+').replace(/_/g, '/');\n while (input.length % 4) {\n input += '=';\n }\n return atob(input);\n }\n}\n\n@Injectable({ providedIn: 'root' })\nexport class JwtService<T> {\n private options = inject(JWT_OPTIONS, { optional: true });\n\n private accessTokenKey = 'access_token';\n private refreshTokenKey = 'refresh_token';\n\n private _accessToken = new TokenHandler<T>(\n this.accessTokenKey,\n this.options?.tokenGetter,\n this.options?.tokenSetter,\n );\n private _refreshToken = new TokenHandler<T>(\n this.refreshTokenKey,\n this.options?.refreshTokenGetter,\n this.options?.refreshTokenSetter,\n );\n\n getAccessToken = this._accessToken.token;\n\n getRefreshToken = this._refreshToken.token;\n\n setTokens(accessToken: string, refreshToken: string): void {\n this._accessToken.setToken(accessToken);\n this._refreshToken.setToken(refreshToken);\n }\n\n clearTokens(): void {\n this._accessToken.setToken(null);\n this._refreshToken.setToken(null);\n }\n\n isAccessTokenExpired = this._accessToken.isExpired;\n\n isRefreshTokenExpired = this._refreshToken.isExpired;\n\n isAccessTokenNearExpiry(minutesBeforeExpiry: number = 5): boolean {\n const token = this.getAccessToken();\n if (!token) return true;\n\n const expiry = this.getTokenExpirationDate();\n if (!expiry) return true;\n\n console.log('minutesBeforeExpiry ', minutesBeforeExpiry);\n const bufferTime = new Date(Date.now() + 0.5 * 60 * 1000);\n return expiry <= bufferTime;\n }\n\n decodeToken = this._accessToken.decoded;\n\n getTokenExpirationDate = this._accessToken.expirationDate;\n}\n\n// jwt interceptor\n@Injectable({ providedIn: 'root' })\nexport class JwtInterceptor implements HttpInterceptor {\n constructor(private jwtService: JwtService<any>) {}\n\n intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\n const token = this.jwtService.getAccessToken();\n if (token) {\n req = req.clone({\n setHeaders: { Authorization: `Bearer ${token}` },\n });\n }\n return next.handle(req);\n }\n}\n\nexport const injectJwt = <T>() => inject<JwtService<T>>(JwtService);\n","import { BehaviorSubject, Observable, throwError, of } from 'rxjs';\nimport { catchError, tap, switchMap } from 'rxjs/operators';\nimport { injectJwt } from './jwt.service';\n\nexport class TokenRefreshService<T> {\n private jwt = injectJwt();\n private refreshSubject = new BehaviorSubject<T | null>(null);\n private isRefreshing = false;\n\n /**\n * Returns an observable that emits when refresh completes\n */\n getRefreshStatus$ = this.refreshSubject.asObservable();\n\n constructor(private refreshApi: () => Observable<T>) {}\n\n /**\n * Attempts to refresh the access token using the refresh token\n * @returns Observable with new token pair\n */\n refreshToken(): Observable<T | null> {\n const refreshToken = this.jwt.getRefreshToken();\n if (!refreshToken) {\n return throwError(() => new Error('No refresh token available'));\n }\n\n if (this.isRefreshing) {\n // If already refreshing, wait for the refresh to complete\n return this.refreshSubject.asObservable();\n }\n\n this.isRefreshing = true;\n this.refreshSubject.next(null);\n\n return this.refreshApi().pipe(\n tap(res => {\n this.isRefreshing = false;\n this.refreshSubject.next(res);\n }),\n catchError(error => {\n this.isRefreshing = false;\n this.refreshSubject.next(null);\n\n // Clear tokens on refresh failure\n this.jwt.clearTokens();\n\n return throwError(() => error);\n }),\n );\n }\n\n /**\n * Checks if a refresh operation is currently in progress\n */\n isTokenRefreshing(): boolean {\n return this.isRefreshing;\n }\n\n /**\n * Proactively refresh token if it's expired or near expiry\n * @param minutesBeforeExpiry How many minutes before expiry to refresh (default: 5)\n * @returns Observable that emits true if refresh was needed and successful, false if not needed\n */\n refreshIfNeeded(minutesBeforeExpiry: number = 5): Observable<boolean> {\n if (this.jwt.isRefreshTokenExpired()) {\n // Refresh token is expired, clear tokens and reject\n this.jwt.clearTokens();\n return throwError(() => new Error('Refresh token expired'));\n }\n\n if (this.jwt.isAccessTokenExpired() || this.jwt.isAccessTokenNearExpiry(minutesBeforeExpiry)) {\n // Need to refresh\n return this.refreshToken().pipe(\n switchMap(() => of(true)), // Return true to indicate refresh was performed\n catchError(error => throwError(() => error)),\n );\n }\n\n // No refresh needed\n return of(false);\n }\n}\n","import { Observable, of } from 'rxjs';\nimport { map, catchError, switchMap, filter, take } from 'rxjs/operators';\nimport { TokenRefreshService } from './token-refresh';\nimport { injectJwt } from './jwt.service';\n\n/**\n * Centralized authentication service for guards and interceptors\n * Handles token validation and refresh logic consistently\n */\nexport class TokenGuardHelper {\n private readonly tokenRefreshService: TokenRefreshService<any>;\n private readonly jwt = injectJwt();\n\n constructor(\n private refreshApi: () => Observable<any>,\n private logout: () => void,\n ) {\n this.tokenRefreshService = new TokenRefreshService(this.refreshApi);\n }\n\n /**\n * Checks if user is authenticated, handles token refresh if needed\n * Returns Observable<boolean> - true if authenticated, false if should redirect to login\n */\n checkAuthentication = (): Observable<boolean> => {\n // Check if we have basic tokens\n const accessToken = this.jwt.getAccessToken();\n const refreshToken = this.jwt.getRefreshToken();\n\n if (!accessToken || !refreshToken) {\n console.log('AuthGuard: No tokens available, redirecting to login');\n return of(false);\n }\n\n // Check if refresh token is expired\n if (this.jwt.isRefreshTokenExpired()) {\n console.warn('AuthGuard: Refresh token is expired, clearing tokens');\n this.logout();\n return of(false);\n }\n\n // If access token is valid, allow access\n if (!this.jwt.isAccessTokenExpired() && !this.jwt.isAccessTokenNearExpiry(5)) {\n console.log('AuthGuard: Access token is valid, allowing access');\n return of(true);\n }\n\n // Access token is expired or near expiry, need to refresh\n console.log('AuthGuard: Access token expired or near expiry, attempting refresh');\n\n // Check if already refreshing\n if (this.tokenRefreshService.isTokenRefreshing()) {\n console.log('AuthGuard: Token refresh already in progress, waiting...');\n return this.tokenRefreshService.getRefreshStatus$.pipe(\n filter(refreshed => refreshed === true),\n take(1),\n map(() => {\n const newToken = this.jwt.getAccessToken();\n if (newToken && !this.jwt.isAccessTokenExpired()) {\n console.log('AuthGuard: Token refresh completed successfully');\n return true;\n } else {\n console.warn('AuthGuard: No valid token after refresh completion');\n return false;\n }\n }),\n catchError(error => {\n console.error('AuthGuard: Failed to wait for token refresh:', error);\n return of(false);\n }),\n );\n }\n\n // Start token refresh\n return this.tokenRefreshService.refreshToken().pipe(\n map(() => {\n if (!this.jwt.isAccessTokenExpired()) {\n console.log('AuthGuard: Token refresh successful');\n return true;\n } else {\n console.warn('AuthGuard: Invalid refresh response or token still expired');\n return false;\n }\n }),\n catchError(refreshError => {\n console.warn('AuthGuard: Token refresh failed:', refreshError);\n this.logout();\n return of(false);\n }),\n );\n };\n\n /**\n * Enhanced authentication check with automatic retry\n * Attempts refresh once, then falls back to login redirect\n */\n ensureAuthenticated = (): Observable<boolean> => {\n return this.checkAuthentication().pipe(\n switchMap(isAuthenticated => {\n if (isAuthenticated) {\n return of(true);\n }\n\n // If not authenticated after refresh attempt, redirect to login\n console.log('AuthGuard: Authentication failed, redirecting to login');\n this.logout();\n return of(false);\n }),\n );\n };\n\n /**\n * Quick synchronous check for authentication status\n * Use this only when you don't need token refresh\n */\n isQuickAuthenticated = (): boolean => {\n const accessToken = this.jwt.getAccessToken();\n const refreshToken = this.jwt.getRefreshToken();\n\n if (!accessToken || !refreshToken) return false;\n if (this.jwt.isRefreshTokenExpired()) return false;\n if (this.jwt.isAccessTokenExpired()) return false;\n\n return true;\n };\n\n /**\n * Validates and refreshes token for HTTP requests\n * Returns Observable<string> with valid access token or throws error\n * Used by interceptors\n */\n getValidAccessToken = (): Observable<string> => {\n // Check if we have tokens\n const accessToken = this.jwt.getAccessToken();\n\n if (!accessToken) {\n console.warn('Interceptor: No access token available');\n this.logout();\n throw new Error('No access token available');\n }\n\n // Check if refresh token is expired\n if (this.jwt.isRefreshTokenExpired()) {\n console.warn('Interceptor: Refresh token is expired, redirecting to login');\n this.logout();\n throw new Error('Refresh token expired');\n }\n\n // If access token is valid, return it\n if (!this.jwt.isAccessTokenExpired() && !this.jwt.isAccessTokenNearExpiry(5)) {\n return of(accessToken);\n }\n\n // Access token needs refresh\n console.log('Interceptor: Access token expired or near expiry, refreshing proactively');\n\n // Check if already refreshing\n if (this.tokenRefreshService.isTokenRefreshing()) {\n return this.tokenRefreshService.getRefreshStatus$.pipe(\n filter(refreshed => refreshed === true),\n take(1),\n map(() => {\n const newToken = this.jwt.getAccessToken();\n if (newToken) {\n return newToken;\n } else {\n this.logout();\n throw new Error('Failed to get new access token');\n }\n }),\n catchError(error => {\n console.error('Interceptor: Failed to wait for token refresh:', error);\n this.logout();\n throw error;\n }),\n );\n }\n\n // Start token refresh\n return this.tokenRefreshService.refreshToken().pipe(\n map(() => {\n const newToken = this.jwt.getAccessToken();\n if (newToken) {\n return newToken;\n } else {\n this.logout();\n throw new Error('Invalid refresh response');\n }\n }),\n catchError(refreshError => {\n console.warn('Interceptor: Token refresh failed:', refreshError);\n this.logout();\n throw refreshError;\n }),\n );\n };\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { signal, computed, Injectable, inject, Component, model, input, linkedSignal, Directive, ElementRef } from '@angular/core';
3
- import { fadeAnimation } from '@ngbase/adk/utils';
3
+ import * as i1 from '@ngbase/adk/utils';
4
+ import { fadeAnimation, DisableAnimation } from '@ngbase/adk/utils';
4
5
  import { injectDirectionality, Directionality } from '@ngbase/adk/bidi';
5
6
  import { trigger, state, style, transition, animate } from '@angular/animations';
6
7
 
@@ -180,12 +181,13 @@ class NgbSidenavHeader {
180
181
  this.sidenav.minWidth = linkedSignal(this.minWidth);
181
182
  }
182
183
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.0", ngImport: i0, type: NgbSidenavHeader, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
183
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.2.0", type: NgbSidenavHeader, isStandalone: true, selector: "[ngbSidenavHeader]", inputs: { width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null }, minWidth: { classPropertyName: "minWidth", publicName: "minWidth", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "@slide.done": "sidenav.animationDone()", "@slide.start": "sidenav.animationStart()" }, properties: { "style.visibility": "sidenav.visibility() ? \"visible\" : \"hidden\"", "style": "headerStyles()", "style.width": "actualWidth()", "attr.aria-hidden": "!sidenav.show()", "attr.data-mode": "sidenav.mode()", "@slide": "{ value: sidenav.animate(), params: { x: dir.isRtl() ? w() : '-'+w() } }" }, styleAttribute: "overflow:hidden;position:absolute;" }, ngImport: i0 }); }
184
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.2.0", type: NgbSidenavHeader, isStandalone: true, selector: "[ngbSidenavHeader]", inputs: { width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null }, minWidth: { classPropertyName: "minWidth", publicName: "minWidth", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "@slide.done": "sidenav.animationDone()", "@slide.start": "sidenav.animationStart()" }, properties: { "style.visibility": "sidenav.visibility() ? \"visible\" : \"hidden\"", "style": "headerStyles()", "style.width": "actualWidth()", "attr.aria-hidden": "!sidenav.show()", "attr.data-mode": "sidenav.mode()", "@slide": "{ value: sidenav.animate(), params: { x: dir.isRtl() ? w() : '-'+w() } }" }, styleAttribute: "overflow:hidden;position:absolute;" }, hostDirectives: [{ directive: i1.DisableAnimation }], ngImport: i0 }); }
184
185
  }
185
186
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.0", ngImport: i0, type: NgbSidenavHeader, decorators: [{
186
187
  type: Directive,
187
188
  args: [{
188
189
  selector: '[ngbSidenavHeader]',
190
+ hostDirectives: [DisableAnimation],
189
191
  host: {
190
192
  style: 'overflow:hidden;position:absolute;',
191
193
  '[style.visibility]': 'sidenav.visibility() ? "visible" : "hidden"',
@@ -1 +1 @@
1
- {"version":3,"file":"ngbase-adk-sidenav.mjs","sources":["../../../projects/adk/sidenav/sidenav.service.ts","../../../projects/adk/sidenav/sidenav.ts","../../../projects/adk/sidenav/sidenav-header.ts","../../../projects/adk/sidenav/ngbase-adk-sidenav.ts"],"sourcesContent":["import { computed, Injectable, signal } from '@angular/core';\nimport { injectDirectionality } from '@ngbase/adk/bidi';\n\nexport type SidenavType = 'side' | 'over' | 'partial';\n\n@Injectable()\nexport class SidenavService {\n readonly dir = injectDirectionality();\n width = signal('0');\n show = signal(true);\n mode = signal<'side' | 'over' | 'partial'>('side');\n minWidth = signal('0');\n readonly status = signal(1);\n\n readonly visibility = computed(() => (this.mode() === 'partial' ? true : this.status()));\n readonly animate = computed(() => (this.mode() === 'partial' ? true : this.show()));\n\n readonly w = computed(() =>\n this.show() && this.mode() !== 'over'\n ? this.width()\n : this.mode() === 'partial'\n ? this.minWidth()\n : '0',\n );\n\n readonly styles = computed(() => {\n const styles = {} as any;\n if (this.dir.isRtl()) {\n styles.paddingRight = this.w();\n } else {\n styles.paddingLeft = this.w();\n }\n return styles;\n });\n\n animationDone() {\n this.status.set(this.show() ? 1 : 0);\n }\n\n animationStart() {\n this.status.set(1);\n }\n}\n","import {\n Component,\n computed,\n Directive,\n inject,\n input,\n linkedSignal,\n model,\n Type,\n} from '@angular/core';\nimport { fadeAnimation } from '@ngbase/adk/utils';\nimport { SidenavType } from './sidenav.service';\nimport { SidenavService } from './sidenav.service';\n\n@Component({\n selector: '[ngbSidenavOverlay]',\n template: ``,\n host: {\n class: 'sidenav-overlay',\n style: 'position:absolute;left:0;top:0;width:100%;height:100%;',\n '(click)': 'sidenav.toggle()',\n '[@fadeAnimation]': '',\n },\n animations: [fadeAnimation('500ms')],\n})\nexport class NgbSidenavOverlay {\n readonly sidenav = inject(NgbSidenav);\n}\n\n@Directive({\n selector: '[ngbSidenav]',\n exportAs: 'ngbSidenav',\n providers: [SidenavService],\n host: {\n style: 'position:relative;width:100%;height:100%;',\n },\n})\nexport class NgbSidenav {\n readonly sidenavService = inject(SidenavService);\n\n // Inputs\n readonly show = model(true);\n readonly mode = input<SidenavType>('side');\n\n readonly showOverlay = computed(() => this.mode() === 'over' && this.show());\n\n constructor() {\n this.sidenavService.show = linkedSignal(this.show);\n this.sidenavService.mode = linkedSignal(this.mode);\n }\n\n toggle() {\n this.show.update(show => !show);\n }\n}\n\nexport const aliasSidenav = (sidenav: Type<NgbSidenav>) => [\n SidenavService,\n { provide: NgbSidenav, useExisting: sidenav },\n];\n","import { animate, state, style, transition, trigger } from '@angular/animations';\nimport { computed, Directive, ElementRef, inject, input, linkedSignal } from '@angular/core';\nimport { Directionality } from '@ngbase/adk/bidi';\nimport { SidenavService } from './sidenav.service';\n\n@Directive({\n selector: '[ngbSidenavHeaderContent]',\n host: {\n '[style.width]': 'w()',\n },\n})\nexport class NgbSidenavHeaderContent {\n readonly sidenav = inject(SidenavService);\n readonly w = computed(() =>\n this.sidenav.mode() === 'partial' && !this.sidenav.show()\n ? this.sidenav.minWidth()\n : this.sidenav.width(),\n );\n}\n\n@Directive({\n selector: '[ngbSidenavHeaderTrack]',\n host: {\n '[style.width]': 'sidenav.w()',\n },\n})\nexport class NgbSidenavHeaderTrack {\n readonly sidenav = inject(SidenavService);\n}\n\nexport function slideAnimation(ease: string) {\n return trigger('slide', [\n state('true', style({ transform: 'translateX(0)' })),\n state('false', style({ transform: 'translateX({{x}})' }), { params: { x: '-100%' } }),\n transition('* <=> *', [animate(ease)]),\n ]);\n}\n\n@Directive({\n selector: '[ngbSidenavHeader]',\n host: {\n style: 'overflow:hidden;position:absolute;',\n '[style.visibility]': 'sidenav.visibility() ? \"visible\" : \"hidden\"',\n '[style]': `headerStyles()`,\n '[style.width]': `actualWidth()`,\n '[attr.aria-hidden]': '!sidenav.show()',\n '[attr.data-mode]': 'sidenav.mode()',\n '[@slide]': `{ value: sidenav.animate(), params: { x: dir.isRtl() ? w() : '-'+w() } }`,\n '(@slide.done)': 'sidenav.animationDone()',\n '(@slide.start)': 'sidenav.animationStart()',\n // '[@slide.disabled]': 'isAnimationDisabled()',\n },\n})\nexport class NgbSidenavHeader {\n readonly sidenav = inject(SidenavService);\n readonly el = inject(ElementRef);\n readonly dir = inject(Directionality);\n\n readonly width = input('250px');\n readonly minWidth = input('0');\n\n private initial = 0;\n readonly isAnimationDisabled = linkedSignal({\n source: this.sidenav.animate,\n computation: () => this.initial++ === 0, // this will not considered on initial render due to increment\n });\n\n readonly w = computed(() => (this.sidenav.mode() === 'partial' ? this.minWidth() : this.width()));\n readonly actualWidth = computed(() => {\n if (this.sidenav.show()) {\n return this.width();\n } else if (this.sidenav.mode() === 'partial') {\n return this.minWidth();\n } else if (this.sidenav.mode() === 'over') {\n return this.width();\n }\n return this.width();\n });\n\n readonly headerStyles = computed(() => {\n let styles = {};\n if (this.sidenav.mode() === 'over') {\n styles = { ...styles, position: 'absolute', top: '0', height: '100%' };\n }\n if (this.dir.isRtl()) {\n styles = { ...styles, right: '0' };\n } else {\n styles = { ...styles, left: '0' };\n }\n return styles;\n });\n\n constructor() {\n this.sidenav.width = linkedSignal(this.width);\n this.sidenav.minWidth = linkedSignal(this.minWidth);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ngbase-adk-sidenav.mjs","sources":["../../../projects/adk/sidenav/sidenav.service.ts","../../../projects/adk/sidenav/sidenav.ts","../../../projects/adk/sidenav/sidenav-header.ts","../../../projects/adk/sidenav/ngbase-adk-sidenav.ts"],"sourcesContent":["import { computed, Injectable, signal } from '@angular/core';\nimport { injectDirectionality } from '@ngbase/adk/bidi';\n\nexport type SidenavType = 'side' | 'over' | 'partial';\n\n@Injectable()\nexport class SidenavService {\n readonly dir = injectDirectionality();\n width = signal('0');\n show = signal(true);\n mode = signal<'side' | 'over' | 'partial'>('side');\n minWidth = signal('0');\n readonly status = signal(1);\n\n readonly visibility = computed(() => (this.mode() === 'partial' ? true : this.status()));\n readonly animate = computed(() => (this.mode() === 'partial' ? true : this.show()));\n\n readonly w = computed(() =>\n this.show() && this.mode() !== 'over'\n ? this.width()\n : this.mode() === 'partial'\n ? this.minWidth()\n : '0',\n );\n\n readonly styles = computed(() => {\n const styles = {} as any;\n if (this.dir.isRtl()) {\n styles.paddingRight = this.w();\n } else {\n styles.paddingLeft = this.w();\n }\n return styles;\n });\n\n animationDone() {\n this.status.set(this.show() ? 1 : 0);\n }\n\n animationStart() {\n this.status.set(1);\n }\n}\n","import {\n Component,\n computed,\n Directive,\n inject,\n input,\n linkedSignal,\n model,\n Type,\n} from '@angular/core';\nimport { fadeAnimation } from '@ngbase/adk/utils';\nimport { SidenavType } from './sidenav.service';\nimport { SidenavService } from './sidenav.service';\n\n@Component({\n selector: '[ngbSidenavOverlay]',\n template: ``,\n host: {\n class: 'sidenav-overlay',\n style: 'position:absolute;left:0;top:0;width:100%;height:100%;',\n '(click)': 'sidenav.toggle()',\n '[@fadeAnimation]': '',\n },\n animations: [fadeAnimation('500ms')],\n})\nexport class NgbSidenavOverlay {\n readonly sidenav = inject(NgbSidenav);\n}\n\n@Directive({\n selector: '[ngbSidenav]',\n exportAs: 'ngbSidenav',\n providers: [SidenavService],\n host: {\n style: 'position:relative;width:100%;height:100%;',\n },\n})\nexport class NgbSidenav {\n readonly sidenavService = inject(SidenavService);\n\n // Inputs\n readonly show = model(true);\n readonly mode = input<SidenavType>('side');\n\n readonly showOverlay = computed(() => this.mode() === 'over' && this.show());\n\n constructor() {\n this.sidenavService.show = linkedSignal(this.show);\n this.sidenavService.mode = linkedSignal(this.mode);\n }\n\n toggle() {\n this.show.update(show => !show);\n }\n}\n\nexport const aliasSidenav = (sidenav: Type<NgbSidenav>) => [\n SidenavService,\n { provide: NgbSidenav, useExisting: sidenav },\n];\n","import { animate, state, style, transition, trigger } from '@angular/animations';\nimport { computed, Directive, ElementRef, inject, input, linkedSignal } from '@angular/core';\nimport { Directionality } from '@ngbase/adk/bidi';\nimport { SidenavService } from './sidenav.service';\nimport { DisableAnimation } from '@ngbase/adk/utils';\n\n@Directive({\n selector: '[ngbSidenavHeaderContent]',\n host: {\n '[style.width]': 'w()',\n },\n})\nexport class NgbSidenavHeaderContent {\n readonly sidenav = inject(SidenavService);\n readonly w = computed(() =>\n this.sidenav.mode() === 'partial' && !this.sidenav.show()\n ? this.sidenav.minWidth()\n : this.sidenav.width(),\n );\n}\n\n@Directive({\n selector: '[ngbSidenavHeaderTrack]',\n host: {\n '[style.width]': 'sidenav.w()',\n },\n})\nexport class NgbSidenavHeaderTrack {\n readonly sidenav = inject(SidenavService);\n}\n\nexport function slideAnimation(ease: string) {\n return trigger('slide', [\n state('true', style({ transform: 'translateX(0)' })),\n state('false', style({ transform: 'translateX({{x}})' }), { params: { x: '-100%' } }),\n transition('* <=> *', [animate(ease)]),\n ]);\n}\n\n@Directive({\n selector: '[ngbSidenavHeader]',\n hostDirectives: [DisableAnimation],\n host: {\n style: 'overflow:hidden;position:absolute;',\n '[style.visibility]': 'sidenav.visibility() ? \"visible\" : \"hidden\"',\n '[style]': `headerStyles()`,\n '[style.width]': `actualWidth()`,\n '[attr.aria-hidden]': '!sidenav.show()',\n '[attr.data-mode]': 'sidenav.mode()',\n '[@slide]': `{ value: sidenav.animate(), params: { x: dir.isRtl() ? w() : '-'+w() } }`,\n '(@slide.done)': 'sidenav.animationDone()',\n '(@slide.start)': 'sidenav.animationStart()',\n // '[@slide.disabled]': 'isAnimationDisabled()',\n },\n})\nexport class NgbSidenavHeader {\n readonly sidenav = inject(SidenavService);\n readonly el = inject(ElementRef);\n readonly dir = inject(Directionality);\n\n readonly width = input('250px');\n readonly minWidth = input('0');\n\n private initial = 0;\n readonly isAnimationDisabled = linkedSignal({\n source: this.sidenav.animate,\n computation: () => this.initial++ === 0, // this will not considered on initial render due to increment\n });\n\n readonly w = computed(() => (this.sidenav.mode() === 'partial' ? this.minWidth() : this.width()));\n readonly actualWidth = computed(() => {\n if (this.sidenav.show()) {\n return this.width();\n } else if (this.sidenav.mode() === 'partial') {\n return this.minWidth();\n } else if (this.sidenav.mode() === 'over') {\n return this.width();\n }\n return this.width();\n });\n\n readonly headerStyles = computed(() => {\n let styles = {};\n if (this.sidenav.mode() === 'over') {\n styles = { ...styles, position: 'absolute', top: '0', height: '100%' };\n }\n if (this.dir.isRtl()) {\n styles = { ...styles, right: '0' };\n } else {\n styles = { ...styles, left: '0' };\n }\n return styles;\n });\n\n constructor() {\n this.sidenav.width = linkedSignal(this.width);\n this.sidenav.minWidth = linkedSignal(this.minWidth);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
package/jwt/index.d.ts CHANGED
@@ -1,20 +1,64 @@
1
- import * as i0 from '@angular/core';
1
+ import * as _angular_core from '@angular/core';
2
+ import { Observable } from 'rxjs';
2
3
 
3
4
  interface JwtOptions {
4
5
  tokenGetter: () => string | null | undefined;
6
+ tokenSetter?: (token: string | null) => void;
7
+ refreshTokenGetter?: () => string | null | undefined;
8
+ refreshTokenSetter?: (token: string | null) => void;
5
9
  }
6
- declare function provideJwt(options: () => JwtOptions): i0.EnvironmentProviders;
10
+ declare function provideJwt(options: () => JwtOptions): _angular_core.EnvironmentProviders;
7
11
  declare class JwtService<T> {
8
- private tokenKey;
9
12
  private options;
10
- getToken(): string | null;
11
- isTokenExpired(token?: string): boolean;
12
- decodeToken(token?: string): T | null;
13
- getTokenExpirationDate(token?: string): Date | null;
14
- private base64UrlDecode;
15
- static ɵfac: i0.ɵɵFactoryDeclaration<JwtService<any>, never>;
16
- static ɵprov: i0.ɵɵInjectableDeclaration<JwtService<any>>;
13
+ private accessTokenKey;
14
+ private refreshTokenKey;
15
+ private _accessToken;
16
+ private _refreshToken;
17
+ getAccessToken: _angular_core.Signal<string | null>;
18
+ getRefreshToken: _angular_core.Signal<string | null>;
19
+ setTokens(accessToken: string, refreshToken: string): void;
20
+ clearTokens(): void;
21
+ isAccessTokenExpired: () => boolean;
22
+ isRefreshTokenExpired: () => boolean;
23
+ isAccessTokenNearExpiry(minutesBeforeExpiry?: number): boolean;
24
+ decodeToken: _angular_core.Signal<T | null>;
25
+ getTokenExpirationDate: _angular_core.Signal<Date | null>;
26
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<JwtService<any>, never>;
27
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<JwtService<any>>;
17
28
  }
18
- declare const injectJwt: () => JwtService<any>;
29
+ declare const injectJwt: <T>() => JwtService<T>;
19
30
 
20
- export { JwtService, injectJwt, provideJwt };
31
+ /**
32
+ * Centralized authentication service for guards and interceptors
33
+ * Handles token validation and refresh logic consistently
34
+ */
35
+ declare class TokenGuardHelper {
36
+ private refreshApi;
37
+ private logout;
38
+ private readonly tokenRefreshService;
39
+ private readonly jwt;
40
+ constructor(refreshApi: () => Observable<any>, logout: () => void);
41
+ /**
42
+ * Checks if user is authenticated, handles token refresh if needed
43
+ * Returns Observable<boolean> - true if authenticated, false if should redirect to login
44
+ */
45
+ checkAuthentication: () => Observable<boolean>;
46
+ /**
47
+ * Enhanced authentication check with automatic retry
48
+ * Attempts refresh once, then falls back to login redirect
49
+ */
50
+ ensureAuthenticated: () => Observable<boolean>;
51
+ /**
52
+ * Quick synchronous check for authentication status
53
+ * Use this only when you don't need token refresh
54
+ */
55
+ isQuickAuthenticated: () => boolean;
56
+ /**
57
+ * Validates and refreshes token for HTTP requests
58
+ * Returns Observable<string> with valid access token or throws error
59
+ * Used by interceptors
60
+ */
61
+ getValidAccessToken: () => Observable<string>;
62
+ }
63
+
64
+ export { JwtService, TokenGuardHelper, injectJwt, provideJwt };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ngbase/adk",
3
- "version": "0.1.16",
3
+ "version": "0.1.17",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://github.com/ng-base/ngbase.git"
@@ -36,65 +36,69 @@
36
36
  "types": "./a11y/index.d.ts",
37
37
  "default": "./fesm2022/ngbase-adk-a11y.mjs"
38
38
  },
39
- "./avatar": {
40
- "types": "./avatar/index.d.ts",
41
- "default": "./fesm2022/ngbase-adk-avatar.mjs"
42
- },
43
- "./autocomplete": {
44
- "types": "./autocomplete/index.d.ts",
45
- "default": "./fesm2022/ngbase-adk-autocomplete.mjs"
46
- },
47
39
  "./accordion": {
48
40
  "types": "./accordion/index.d.ts",
49
41
  "default": "./fesm2022/ngbase-adk-accordion.mjs"
50
42
  },
43
+ "./avatar": {
44
+ "types": "./avatar/index.d.ts",
45
+ "default": "./fesm2022/ngbase-adk-avatar.mjs"
46
+ },
51
47
  "./bidi": {
52
48
  "types": "./bidi/index.d.ts",
53
49
  "default": "./fesm2022/ngbase-adk-bidi.mjs"
54
50
  },
55
- "./breadcrumb": {
56
- "types": "./breadcrumb/index.d.ts",
57
- "default": "./fesm2022/ngbase-adk-breadcrumb.mjs"
51
+ "./autocomplete": {
52
+ "types": "./autocomplete/index.d.ts",
53
+ "default": "./fesm2022/ngbase-adk-autocomplete.mjs"
58
54
  },
59
55
  "./cache": {
60
56
  "types": "./cache/index.d.ts",
61
57
  "default": "./fesm2022/ngbase-adk-cache.mjs"
62
58
  },
59
+ "./breadcrumb": {
60
+ "types": "./breadcrumb/index.d.ts",
61
+ "default": "./fesm2022/ngbase-adk-breadcrumb.mjs"
62
+ },
63
63
  "./carousel": {
64
64
  "types": "./carousel/index.d.ts",
65
65
  "default": "./fesm2022/ngbase-adk-carousel.mjs"
66
66
  },
67
+ "./checkbox": {
68
+ "types": "./checkbox/index.d.ts",
69
+ "default": "./fesm2022/ngbase-adk-checkbox.mjs"
70
+ },
67
71
  "./chip": {
68
72
  "types": "./chip/index.d.ts",
69
73
  "default": "./fesm2022/ngbase-adk-chip.mjs"
70
74
  },
75
+ "./collections": {
76
+ "types": "./collections/index.d.ts",
77
+ "default": "./fesm2022/ngbase-adk-collections.mjs"
78
+ },
71
79
  "./clipboard": {
72
80
  "types": "./clipboard/index.d.ts",
73
81
  "default": "./fesm2022/ngbase-adk-clipboard.mjs"
74
82
  },
75
- "./checkbox": {
76
- "types": "./checkbox/index.d.ts",
77
- "default": "./fesm2022/ngbase-adk-checkbox.mjs"
78
- },
79
- "./collections": {
80
- "types": "./collections/index.d.ts",
81
- "default": "./fesm2022/ngbase-adk-collections.mjs"
83
+ "./cookies": {
84
+ "types": "./cookies/index.d.ts",
85
+ "default": "./fesm2022/ngbase-adk-cookies.mjs"
82
86
  },
83
87
  "./color-picker": {
84
88
  "types": "./color-picker/index.d.ts",
85
89
  "default": "./fesm2022/ngbase-adk-color-picker.mjs"
86
90
  },
87
- "./cookies": {
88
- "types": "./cookies/index.d.ts",
89
- "default": "./fesm2022/ngbase-adk-cookies.mjs"
91
+ "./datepicker": {
92
+ "types": "./datepicker/index.d.ts",
93
+ "default": "./fesm2022/ngbase-adk-datepicker.mjs"
90
94
  },
91
95
  "./dialog": {
92
96
  "types": "./dialog/index.d.ts",
93
97
  "default": "./fesm2022/ngbase-adk-dialog.mjs"
94
98
  },
95
- "./datepicker": {
96
- "types": "./datepicker/index.d.ts",
97
- "default": "./fesm2022/ngbase-adk-datepicker.mjs"
99
+ "./hover-card": {
100
+ "types": "./hover-card/index.d.ts",
101
+ "default": "./fesm2022/ngbase-adk-hover-card.mjs"
98
102
  },
99
103
  "./drag": {
100
104
  "types": "./drag/index.d.ts",
@@ -104,10 +108,6 @@
104
108
  "types": "./form-field/index.d.ts",
105
109
  "default": "./fesm2022/ngbase-adk-form-field.mjs"
106
110
  },
107
- "./hover-card": {
108
- "types": "./hover-card/index.d.ts",
109
- "default": "./fesm2022/ngbase-adk-hover-card.mjs"
110
- },
111
111
  "./icon": {
112
112
  "types": "./icon/index.d.ts",
113
113
  "default": "./fesm2022/ngbase-adk-icon.mjs"
@@ -120,18 +120,22 @@
120
120
  "types": "./inline-edit/index.d.ts",
121
121
  "default": "./fesm2022/ngbase-adk-inline-edit.mjs"
122
122
  },
123
- "./layout": {
124
- "types": "./layout/index.d.ts",
125
- "default": "./fesm2022/ngbase-adk-layout.mjs"
126
- },
127
123
  "./keys": {
128
124
  "types": "./keys/index.d.ts",
129
125
  "default": "./fesm2022/ngbase-adk-keys.mjs"
130
126
  },
127
+ "./layout": {
128
+ "types": "./layout/index.d.ts",
129
+ "default": "./fesm2022/ngbase-adk-layout.mjs"
130
+ },
131
131
  "./list": {
132
132
  "types": "./list/index.d.ts",
133
133
  "default": "./fesm2022/ngbase-adk-list.mjs"
134
134
  },
135
+ "./menu": {
136
+ "types": "./menu/index.d.ts",
137
+ "default": "./fesm2022/ngbase-adk-menu.mjs"
138
+ },
135
139
  "./mask": {
136
140
  "types": "./mask/index.d.ts",
137
141
  "default": "./fesm2022/ngbase-adk-mask.mjs"
@@ -140,33 +144,29 @@
140
144
  "types": "./network/index.d.ts",
141
145
  "default": "./fesm2022/ngbase-adk-network.mjs"
142
146
  },
143
- "./menu": {
144
- "types": "./menu/index.d.ts",
145
- "default": "./fesm2022/ngbase-adk-menu.mjs"
146
- },
147
147
  "./otp": {
148
148
  "types": "./otp/index.d.ts",
149
149
  "default": "./fesm2022/ngbase-adk-otp.mjs"
150
150
  },
151
- "./pagination": {
152
- "types": "./pagination/index.d.ts",
153
- "default": "./fesm2022/ngbase-adk-pagination.mjs"
154
- },
155
151
  "./popover": {
156
152
  "types": "./popover/index.d.ts",
157
153
  "default": "./fesm2022/ngbase-adk-popover.mjs"
158
154
  },
159
- "./progress": {
160
- "types": "./progress/index.d.ts",
161
- "default": "./fesm2022/ngbase-adk-progress.mjs"
155
+ "./pagination": {
156
+ "types": "./pagination/index.d.ts",
157
+ "default": "./fesm2022/ngbase-adk-pagination.mjs"
158
+ },
159
+ "./portal": {
160
+ "types": "./portal/index.d.ts",
161
+ "default": "./fesm2022/ngbase-adk-portal.mjs"
162
162
  },
163
163
  "./radio": {
164
164
  "types": "./radio/index.d.ts",
165
165
  "default": "./fesm2022/ngbase-adk-radio.mjs"
166
166
  },
167
- "./portal": {
168
- "types": "./portal/index.d.ts",
169
- "default": "./fesm2022/ngbase-adk-portal.mjs"
167
+ "./progress": {
168
+ "types": "./progress/index.d.ts",
169
+ "default": "./fesm2022/ngbase-adk-progress.mjs"
170
170
  },
171
171
  "./resizable": {
172
172
  "types": "./resizable/index.d.ts",
@@ -188,14 +188,14 @@
188
188
  "types": "./sheet/index.d.ts",
189
189
  "default": "./fesm2022/ngbase-adk-sheet.mjs"
190
190
  },
191
- "./sidenav": {
192
- "types": "./sidenav/index.d.ts",
193
- "default": "./fesm2022/ngbase-adk-sidenav.mjs"
194
- },
195
191
  "./slider": {
196
192
  "types": "./slider/index.d.ts",
197
193
  "default": "./fesm2022/ngbase-adk-slider.mjs"
198
194
  },
195
+ "./sidenav": {
196
+ "types": "./sidenav/index.d.ts",
197
+ "default": "./fesm2022/ngbase-adk-sidenav.mjs"
198
+ },
199
199
  "./sonner": {
200
200
  "types": "./sonner/index.d.ts",
201
201
  "default": "./fesm2022/ngbase-adk-sonner.mjs"
@@ -208,6 +208,10 @@
208
208
  "types": "./switch/index.d.ts",
209
209
  "default": "./fesm2022/ngbase-adk-switch.mjs"
210
210
  },
211
+ "./tabs": {
212
+ "types": "./tabs/index.d.ts",
213
+ "default": "./fesm2022/ngbase-adk-tabs.mjs"
214
+ },
211
215
  "./table": {
212
216
  "types": "./table/index.d.ts",
213
217
  "default": "./fesm2022/ngbase-adk-table.mjs"
@@ -220,30 +224,26 @@
220
224
  "types": "./toggle/index.d.ts",
221
225
  "default": "./fesm2022/ngbase-adk-toggle.mjs"
222
226
  },
223
- "./tabs": {
224
- "types": "./tabs/index.d.ts",
225
- "default": "./fesm2022/ngbase-adk-tabs.mjs"
226
- },
227
227
  "./toggle-group": {
228
228
  "types": "./toggle-group/index.d.ts",
229
229
  "default": "./fesm2022/ngbase-adk-toggle-group.mjs"
230
230
  },
231
- "./tour": {
232
- "types": "./tour/index.d.ts",
233
- "default": "./fesm2022/ngbase-adk-tour.mjs"
231
+ "./translate": {
232
+ "types": "./translate/index.d.ts",
233
+ "default": "./fesm2022/ngbase-adk-translate.mjs"
234
234
  },
235
235
  "./tooltip": {
236
236
  "types": "./tooltip/index.d.ts",
237
237
  "default": "./fesm2022/ngbase-adk-tooltip.mjs"
238
238
  },
239
- "./translate": {
240
- "types": "./translate/index.d.ts",
241
- "default": "./fesm2022/ngbase-adk-translate.mjs"
242
- },
243
239
  "./tree": {
244
240
  "types": "./tree/index.d.ts",
245
241
  "default": "./fesm2022/ngbase-adk-tree.mjs"
246
242
  },
243
+ "./tour": {
244
+ "types": "./tour/index.d.ts",
245
+ "default": "./fesm2022/ngbase-adk-tour.mjs"
246
+ },
247
247
  "./utils": {
248
248
  "types": "./utils/index.d.ts",
249
249
  "default": "./fesm2022/ngbase-adk-utils.mjs"
@@ -47,7 +47,7 @@ export class Accordion extends NgbAccordion {}
47
47
  hostDirectives: [NgbAccordionHeader],
48
48
  host: {
49
49
  class:
50
- 'flex items-center w-full py-3 px-3 aria-disabled:cursor-not-allowed aria-disabled:opacity-50',
50
+ 'flex items-center w-full py-3 px-3 aria-disabled:cursor-not-allowed aria-disabled:opacity-50 cursor-pointer',
51
51
  },
52
52
  })
53
53
  export class AccordionHeader {}
@@ -11,14 +11,15 @@ import { Button } from '@/ui/button';
11
11
  - ButtonVariant = 'primary' | 'secondary' | 'ghost' | 'outline' | 'icon'
12
12
  - **Inputs:**
13
13
 
14
- - `variant`: ButtonVariant = 'primary'
14
+ - `<%= name %>Button`: ButtonVariant = 'primary'
15
15
 
16
16
  - **Export:** `#button="<%= name %>Button"` - Template reference
17
17
 
18
18
  ## Usage
19
19
 
20
20
  ```html
21
- <button <%= name %>Button>Button</button> <button <%= name %>Button variant="ghost">Button</button>
21
+ <button <%= name %>Button>Button</button>
22
+ <button <%= name %>Button="ghost">Button</button>
22
23
  <button <%= name %>Button="icon">
23
24
  <<%= name %>-icon name="lucideHouse" />
24
25
  </button>
@@ -79,7 +79,7 @@ export class Description {}
79
79
  @Directive({
80
80
  selector: '[<%= name %>Prefix]',
81
81
  host: {
82
- class: 'mr-2.5',
82
+ class: 'mr-2.5 text-muted-foreground',
83
83
  },
84
84
  })
85
85
  export class InputPrefix {}
@@ -87,7 +87,7 @@ export class InputPrefix {}
87
87
  @Directive({
88
88
  selector: '[<%= name %>Suffix]',
89
89
  host: {
90
- class: 'ml-2.5',
90
+ class: 'ml-2.5 text-muted-foreground',
91
91
  },
92
92
  })
93
93
  export class InputSuffix {}
@@ -27,7 +27,7 @@ import {
27
27
  <div class="relative flex overflow-hidden">
28
28
  <button
29
29
  ngbTabScroll="left"
30
- class="absolute left-0 z-10 h-full place-items-center bg-background px-2"
30
+ class="bg-background absolute left-0 z-10 h-full place-items-center px-2"
31
31
  >
32
32
  <<%= name %>-icon name="lucideChevronLeft" />
33
33
  </button>
@@ -36,14 +36,14 @@ import {
36
36
  @for (tab of tabs(); track tab.id) {
37
37
  <button
38
38
  [ngbTabButton]="tab"
39
- class="whitespace-nowrap border-b-2 border-transparent font-medium text-muted-foreground aria-[disabled=true]:cursor-not-allowed aria-[selected=true]:!border-primary aria-[disabled=true]:text-muted-foreground aria-[selected=true]:!text-primary aria-[disabled=true]:opacity-50 [&[data-ch='false']]:px-4 [&[data-ch='false']]:py-3 [&[data-ch='true']>*:first-child]:px-4 [&[data-ch='true']>*:first-child]:py-3"
39
+ class="text-muted-foreground aria-[selected=true]:!border-primary aria-[disabled=true]:text-muted-foreground aria-[selected=true]:!text-primary cursor-pointer border-b-2 border-transparent font-medium whitespace-nowrap aria-[disabled=true]:cursor-not-allowed aria-[disabled=true]:opacity-50 [&[data-ch='false']]:px-4 [&[data-ch='false']]:py-3 [&[data-ch='true']>*:first-child]:px-4 [&[data-ch='true']>*:first-child]:py-3"
40
40
  ></button>
41
41
  }
42
42
  </div>
43
43
  </nav>
44
44
  <button
45
45
  ngbTabScroll="right"
46
- class="absolute right-0 z-10 h-full place-items-center bg-background px-2"
46
+ class="bg-background absolute right-0 z-10 h-full place-items-center px-2"
47
47
  >
48
48
  <<%= name %>-icon name="lucideChevronRight" />
49
49
  </button>
@@ -43,6 +43,7 @@
43
43
  "chip",
44
44
  "color-picker",
45
45
  "command",
46
+ "confirmation",
46
47
  "datepicker",
47
48
  "dialog",
48
49
  "drawer",
@@ -100,6 +101,7 @@
100
101
  { "value": "chip", "label": "Chip" },
101
102
  { "value": "color-picker", "label": "Color Picker" },
102
103
  { "value": "command", "label": "Command" },
104
+ { "value": "confirmation", "label": "Confirmation" },
103
105
  { "value": "datepicker", "label": "Datepicker" },
104
106
  { "value": "dialog", "label": "Dialog" },
105
107
  { "value": "drawer", "label": "Drawer" },
@@ -3,6 +3,7 @@ import { Type, ElementRef } from '@angular/core';
3
3
  import * as _ngbase_adk_bidi from '@ngbase/adk/bidi';
4
4
  import { Directionality } from '@ngbase/adk/bidi';
5
5
  import * as _angular_animations from '@angular/animations';
6
+ import * as i1 from '@ngbase/adk/utils';
6
7
 
7
8
  type SidenavType = 'side' | 'over' | 'partial';
8
9
  declare class SidenavService {
@@ -67,7 +68,7 @@ declare class NgbSidenavHeader {
67
68
  readonly headerStyles: _angular_core.Signal<{}>;
68
69
  constructor();
69
70
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgbSidenavHeader, never>;
70
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<NgbSidenavHeader, "[ngbSidenavHeader]", never, { "width": { "alias": "width"; "required": false; "isSignal": true; }; "minWidth": { "alias": "minWidth"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
71
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<NgbSidenavHeader, "[ngbSidenavHeader]", never, { "width": { "alias": "width"; "required": false; "isSignal": true; }; "minWidth": { "alias": "minWidth"; "required": false; "isSignal": true; }; }, {}, never, never, true, [{ directive: typeof i1.DisableAnimation; inputs: {}; outputs: {}; }]>;
71
72
  }
72
73
 
73
74
  export { NgbSidenav, NgbSidenavHeader, NgbSidenavHeaderContent, NgbSidenavHeaderTrack, NgbSidenavOverlay, aliasSidenav, slideAnimation };