@ackplus/nest-auth-client 1.1.29

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/README.md +93 -0
  2. package/dist/client/auth-client.d.ts +60 -0
  3. package/dist/client/auth-client.d.ts.map +1 -0
  4. package/dist/client/auth-client.js +383 -0
  5. package/dist/client/auth-client.js.map +1 -0
  6. package/dist/client/event-emitter.d.ts +27 -0
  7. package/dist/client/event-emitter.d.ts.map +1 -0
  8. package/dist/client/event-emitter.js +46 -0
  9. package/dist/client/event-emitter.js.map +1 -0
  10. package/dist/client/refresh-queue.d.ts +16 -0
  11. package/dist/client/refresh-queue.d.ts.map +1 -0
  12. package/dist/client/refresh-queue.js +63 -0
  13. package/dist/client/refresh-queue.js.map +1 -0
  14. package/dist/http/axios.adapter.d.ts +3 -0
  15. package/dist/http/axios.adapter.d.ts.map +1 -0
  16. package/dist/http/axios.adapter.js +55 -0
  17. package/dist/http/axios.adapter.js.map +1 -0
  18. package/dist/http/fetch.adapter.d.ts +5 -0
  19. package/dist/http/fetch.adapter.d.ts.map +1 -0
  20. package/dist/http/fetch.adapter.js +50 -0
  21. package/dist/http/fetch.adapter.js.map +1 -0
  22. package/dist/index.d.ts +18 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +15 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/storage/cookie.storage.d.ts +22 -0
  27. package/dist/storage/cookie.storage.d.ts.map +1 -0
  28. package/dist/storage/cookie.storage.js +79 -0
  29. package/dist/storage/cookie.storage.js.map +1 -0
  30. package/dist/storage/local.storage.d.ts +11 -0
  31. package/dist/storage/local.storage.d.ts.map +1 -0
  32. package/dist/storage/local.storage.js +56 -0
  33. package/dist/storage/local.storage.js.map +1 -0
  34. package/dist/storage/memory.storage.d.ts +9 -0
  35. package/dist/storage/memory.storage.d.ts.map +1 -0
  36. package/dist/storage/memory.storage.js +18 -0
  37. package/dist/storage/memory.storage.js.map +1 -0
  38. package/dist/storage/session.storage.d.ts +11 -0
  39. package/dist/storage/session.storage.d.ts.map +1 -0
  40. package/dist/storage/session.storage.js +56 -0
  41. package/dist/storage/session.storage.js.map +1 -0
  42. package/dist/token/jwt-utils.d.ts +7 -0
  43. package/dist/token/jwt-utils.d.ts.map +1 -0
  44. package/dist/token/jwt-utils.js +49 -0
  45. package/dist/token/jwt-utils.js.map +1 -0
  46. package/dist/token/token-manager.d.ts +29 -0
  47. package/dist/token/token-manager.d.ts.map +1 -0
  48. package/dist/token/token-manager.js +102 -0
  49. package/dist/token/token-manager.js.map +1 -0
  50. package/dist/types/auth.types.d.ts +33 -0
  51. package/dist/types/auth.types.d.ts.map +1 -0
  52. package/dist/types/auth.types.js +2 -0
  53. package/dist/types/auth.types.js.map +1 -0
  54. package/dist/types/config.types.d.ts +73 -0
  55. package/dist/types/config.types.d.ts.map +1 -0
  56. package/dist/types/config.types.js +17 -0
  57. package/dist/types/config.types.js.map +1 -0
  58. package/dist/utils/role-utils.d.ts +12 -0
  59. package/dist/utils/role-utils.d.ts.map +1 -0
  60. package/dist/utils/role-utils.js +43 -0
  61. package/dist/utils/role-utils.js.map +1 -0
  62. package/package.json +56 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jwt-utils.js","sourceRoot":"","sources":["../../src/token/jwt-utils.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAYvC,MAAM,UAAU,SAAS,CAAC,KAAgC;IACtD,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAExB,IAAI,CAAC;QACD,OAAO,SAAS,CAAa,KAAK,CAAC,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,IAAI,CAAC;IAChB,CAAC;AACL,CAAC;AASD,MAAM,UAAU,cAAc,CAC1B,KAAiC,EACjC,mBAA2B,CAAC;IAE5B,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAExB,MAAM,OAAO,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAErE,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IAC1C,OAAO,OAAO,CAAC,GAAG,IAAI,GAAG,GAAG,gBAAgB,CAAC;AACjD,CAAC;AAQD,MAAM,UAAU,sBAAsB,CAAC,KAAiC;IACpE,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAExB,MAAM,OAAO,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAErE,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;AACxC,CAAC;AAQD,MAAM,UAAU,oBAAoB,CAAC,KAAiC;IAClE,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAExB,MAAM,OAAO,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAErE,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IAC1C,OAAO,OAAO,CAAC,GAAG,GAAG,GAAG,CAAC;AAC7B,CAAC;AAQD,MAAM,UAAU,kBAAkB,CAAC,KAA6C;IAC5E,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAExB,MAAM,OAAO,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAErE,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAG1B,OAAO,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC;AACpE,CAAC"}
@@ -0,0 +1,29 @@
1
+ import { ITokenPair as TokenPair } from '@ackplus/nest-auth-contracts';
2
+ import { AccessTokenType } from '../types/config.types';
3
+ import { StorageAdapter } from '../types/config.types';
4
+ export interface TokenManagerConfig {
5
+ storage: StorageAdapter;
6
+ accessTokenType: AccessTokenType;
7
+ refreshThreshold?: number;
8
+ }
9
+ export declare class TokenManager {
10
+ private storage;
11
+ private mode;
12
+ private refreshThreshold;
13
+ constructor(config: TokenManagerConfig);
14
+ setMode(mode: 'header' | 'cookie'): void;
15
+ getMode(): 'header' | 'cookie';
16
+ isCookieMode(): boolean;
17
+ isHeaderMode(): boolean;
18
+ setTokens(tokens: TokenPair): Promise<void>;
19
+ getAccessToken(): Promise<string | null>;
20
+ getRefreshToken(): Promise<string | null>;
21
+ getTokens(): Promise<TokenPair | null>;
22
+ clearTokens(): Promise<void>;
23
+ isAccessTokenExpired(): Promise<boolean>;
24
+ isRefreshTokenExpired(): Promise<boolean>;
25
+ hasValidTokens(): Promise<boolean>;
26
+ needsRefresh(): Promise<boolean>;
27
+ getAuthorizationHeader(): Promise<string | null>;
28
+ }
29
+ //# sourceMappingURL=token-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-manager.d.ts","sourceRoot":"","sources":["../../src/token/token-manager.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,UAAU,IAAI,SAAS,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAavD,MAAM,WAAW,kBAAkB;IAE/B,OAAO,EAAE,cAAc,CAAC;IAExB,eAAe,EAAE,eAAe,CAAC;IAEjC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC7B;AASD,qBAAa,YAAY;IACrB,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,IAAI,CAAkB;IAC9B,OAAO,CAAC,gBAAgB,CAAS;gBAErB,MAAM,EAAE,kBAAkB;IAStC,OAAO,CAAC,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,IAAI;IAOxC,OAAO,IAAI,QAAQ,GAAG,QAAQ;IAO9B,YAAY,IAAI,OAAO;IAOvB,YAAY,IAAI,OAAO;IAOjB,SAAS,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAa3C,cAAc,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAWxC,eAAe,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAWzC,SAAS,IAAI,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IActC,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAS5B,oBAAoB,IAAI,OAAO,CAAC,OAAO,CAAC;IAYxC,qBAAqB,IAAI,OAAO,CAAC,OAAO,CAAC;IAYzC,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;IAiBlC,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC;IAehC,sBAAsB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CAYzD"}
@@ -0,0 +1,102 @@
1
+ import { isTokenExpired } from './jwt-utils';
2
+ const STORAGE_KEYS = {
3
+ ACCESS_TOKEN: 'access_token',
4
+ REFRESH_TOKEN: 'refresh_token',
5
+ EXPIRES_AT: 'expires_at',
6
+ };
7
+ export class TokenManager {
8
+ constructor(config) {
9
+ this.storage = config.storage;
10
+ this.mode = config.accessTokenType;
11
+ this.refreshThreshold = config.refreshThreshold ?? 60;
12
+ }
13
+ setMode(mode) {
14
+ this.mode = mode;
15
+ }
16
+ getMode() {
17
+ return this.mode || 'header';
18
+ }
19
+ isCookieMode() {
20
+ return this.getMode() === 'cookie';
21
+ }
22
+ isHeaderMode() {
23
+ return this.getMode() === 'header';
24
+ }
25
+ async setTokens(tokens) {
26
+ if (this.isCookieMode()) {
27
+ return;
28
+ }
29
+ await Promise.resolve(this.storage.set(STORAGE_KEYS.ACCESS_TOKEN, tokens.accessToken));
30
+ await Promise.resolve(this.storage.set(STORAGE_KEYS.REFRESH_TOKEN, tokens.refreshToken));
31
+ }
32
+ async getAccessToken() {
33
+ if (this.isCookieMode()) {
34
+ return null;
35
+ }
36
+ const token = this.storage.get(STORAGE_KEYS.ACCESS_TOKEN);
37
+ return Promise.resolve(token);
38
+ }
39
+ async getRefreshToken() {
40
+ if (this.isCookieMode()) {
41
+ return null;
42
+ }
43
+ const token = this.storage.get(STORAGE_KEYS.REFRESH_TOKEN);
44
+ return Promise.resolve(token);
45
+ }
46
+ async getTokens() {
47
+ const accessToken = await this.getAccessToken();
48
+ const refreshToken = await this.getRefreshToken();
49
+ if (!accessToken || !refreshToken) {
50
+ return null;
51
+ }
52
+ return { accessToken, refreshToken };
53
+ }
54
+ async clearTokens() {
55
+ await Promise.resolve(this.storage.remove(STORAGE_KEYS.ACCESS_TOKEN));
56
+ await Promise.resolve(this.storage.remove(STORAGE_KEYS.REFRESH_TOKEN));
57
+ await Promise.resolve(this.storage.remove(STORAGE_KEYS.EXPIRES_AT));
58
+ }
59
+ async isAccessTokenExpired() {
60
+ const token = await this.getAccessToken();
61
+ if (!token) {
62
+ return true;
63
+ }
64
+ const expired = isTokenExpired(token, this.refreshThreshold);
65
+ return expired ?? true;
66
+ }
67
+ async isRefreshTokenExpired() {
68
+ const token = await this.getRefreshToken();
69
+ if (!token) {
70
+ return true;
71
+ }
72
+ const expired = isTokenExpired(token);
73
+ return expired ?? true;
74
+ }
75
+ async hasValidTokens() {
76
+ if (this.isCookieMode()) {
77
+ return false;
78
+ }
79
+ const accessExpired = await this.isAccessTokenExpired();
80
+ const refreshExpired = await this.isRefreshTokenExpired();
81
+ return !accessExpired || !refreshExpired;
82
+ }
83
+ async needsRefresh() {
84
+ if (this.isCookieMode()) {
85
+ return false;
86
+ }
87
+ const accessExpired = await this.isAccessTokenExpired();
88
+ const refreshExpired = await this.isRefreshTokenExpired();
89
+ return accessExpired && !refreshExpired;
90
+ }
91
+ async getAuthorizationHeader() {
92
+ if (this.isCookieMode()) {
93
+ return null;
94
+ }
95
+ const token = await this.getAccessToken();
96
+ if (!token) {
97
+ return null;
98
+ }
99
+ return `Bearer ${token}`;
100
+ }
101
+ }
102
+ //# sourceMappingURL=token-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-manager.js","sourceRoot":"","sources":["../../src/token/token-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ export type AuthStatus = 'loading' | 'authenticated' | 'unauthenticated';
2
+ export interface ClientSession {
3
+ id: string;
4
+ userId: string;
5
+ expiresAt?: Date;
6
+ createdAt?: Date;
7
+ accessToken?: string;
8
+ refreshToken?: string;
9
+ }
10
+ export interface AuthState {
11
+ status: AuthStatus;
12
+ user: import('@ackplus/nest-auth-contracts').IAuthUser | null;
13
+ session: ClientSession | null;
14
+ error: AuthError | null;
15
+ }
16
+ export interface AuthError {
17
+ message: string;
18
+ code?: string;
19
+ statusCode?: number;
20
+ details?: Record<string, any>;
21
+ }
22
+ export interface DecodedJwt {
23
+ userId?: string;
24
+ sub?: string;
25
+ user_id?: string;
26
+ exp?: number;
27
+ iat?: number;
28
+ sessionId?: string;
29
+ tenantId?: string;
30
+ type?: string;
31
+ [key: string]: any;
32
+ }
33
+ //# sourceMappingURL=auth.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.types.d.ts","sourceRoot":"","sources":["../../src/types/auth.types.ts"],"names":[],"mappings":"AAQA,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,eAAe,GAAG,iBAAiB,CAAC;AAKzE,MAAM,WAAW,aAAa;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB;AAKD,MAAM,WAAW,SAAS;IACtB,MAAM,EAAE,UAAU,CAAC;IACnB,IAAI,EAAE,OAAO,8BAA8B,EAAE,SAAS,GAAG,IAAI,CAAC;IAC9D,OAAO,EAAE,aAAa,GAAG,IAAI,CAAC;IAC9B,KAAK,EAAE,SAAS,GAAG,IAAI,CAAC;CAC3B;AAKD,MAAM,WAAW,SAAS;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CACjC;AAKD,MAAM,WAAW,UAAU;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACtB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=auth.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.types.js","sourceRoot":"","sources":["../../src/types/auth.types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,73 @@
1
+ import { IAuthUser as AuthUser, ITokenPair as TokenPair } from '@ackplus/nest-auth-contracts';
2
+ import { AuthError } from './auth.types';
3
+ export interface StorageAdapter {
4
+ get(key: string): Promise<string | null> | string | null;
5
+ set(key: string, value: string): Promise<void> | void;
6
+ remove(key: string): Promise<void> | void;
7
+ clear?(): Promise<void> | void;
8
+ }
9
+ export interface HttpAdapter {
10
+ request<T = any>(options: HttpRequestOptions): Promise<HttpResponse<T>>;
11
+ }
12
+ export interface HttpRequestOptions {
13
+ url: string;
14
+ method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';
15
+ headers?: Record<string, string>;
16
+ body?: any;
17
+ credentials?: 'include' | 'omit' | 'same-origin';
18
+ timeout?: number;
19
+ signal?: AbortSignal;
20
+ }
21
+ export interface HttpResponse<T = any> {
22
+ status: number;
23
+ data: T;
24
+ headers: Record<string, string>;
25
+ ok: boolean;
26
+ }
27
+ export interface Logger {
28
+ debug?(message: string, ...args: any[]): void;
29
+ info?(message: string, ...args: any[]): void;
30
+ warn?(message: string, ...args: any[]): void;
31
+ error?(message: string, ...args: any[]): void;
32
+ }
33
+ export interface EndpointConfig {
34
+ login?: string;
35
+ signup?: string;
36
+ logout?: string;
37
+ refresh?: string;
38
+ me?: string;
39
+ forgotPassword?: string;
40
+ verifyForgotPasswordOtp?: string;
41
+ resetPassword?: string;
42
+ verifyEmail?: string;
43
+ resendVerification?: string;
44
+ changePassword?: string;
45
+ send2fa?: string;
46
+ verify2fa?: string;
47
+ verifySession?: string;
48
+ }
49
+ export declare const DEFAULT_ENDPOINTS: Required<EndpointConfig>;
50
+ export type AccessTokenType = 'header' | 'cookie' | null;
51
+ export interface AuthClientConfig {
52
+ baseUrl: string;
53
+ endpoints?: EndpointConfig;
54
+ accessTokenType?: AccessTokenType;
55
+ storage?: StorageAdapter;
56
+ httpAdapter?: HttpAdapter;
57
+ logger?: Logger;
58
+ tenantId?: string | (() => string | undefined);
59
+ tenantHeader?: string;
60
+ autoRefresh?: boolean;
61
+ refreshThreshold?: number;
62
+ onAuthStateChange?: (user: AuthUser | null) => void;
63
+ onTokenRefreshed?: (tokens: TokenPair) => void;
64
+ onLogout?: () => void;
65
+ onError?: (error: AuthError) => void;
66
+ }
67
+ export interface RequestOptions {
68
+ timeout?: number;
69
+ headers?: Record<string, string>;
70
+ signal?: AbortSignal;
71
+ skipRefresh?: boolean;
72
+ }
73
+ //# sourceMappingURL=config.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.types.d.ts","sourceRoot":"","sources":["../../src/types/config.types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ export const DEFAULT_ENDPOINTS = {
2
+ login: '/auth/login',
3
+ signup: '/auth/signup',
4
+ logout: '/auth/logout',
5
+ refresh: '/auth/refresh',
6
+ me: '/auth/me',
7
+ forgotPassword: '/auth/forgot-password',
8
+ verifyForgotPasswordOtp: '/auth/verify-forgot-password-otp',
9
+ resetPassword: '/auth/reset-password',
10
+ verifyEmail: '/auth/verify-email',
11
+ resendVerification: '/auth/send-email-verification',
12
+ changePassword: '/auth/change-password',
13
+ send2fa: '/auth/2fa/send',
14
+ verify2fa: '/auth/2fa/verify',
15
+ verifySession: '/auth/verify-session',
16
+ };
17
+ //# sourceMappingURL=config.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.types.js","sourceRoot":"","sources":["../../src/types/config.types.ts"],"names":[],"mappings":"AA8HA,MAAM,CAAC,MAAM,iBAAiB,GAA6B;IACvD,KAAK,EAAE,aAAa;IACpB,MAAM,EAAE,cAAc;IACtB,MAAM,EAAE,cAAc;IACtB,OAAO,EAAE,eAAe;IACxB,EAAE,EAAE,UAAU;IACd,cAAc,EAAE,uBAAuB;IACvC,uBAAuB,EAAE,kCAAkC;IAC3D,aAAa,EAAE,sBAAsB;IACrC,WAAW,EAAE,oBAAoB;IACjC,kBAAkB,EAAE,+BAA+B;IACnD,cAAc,EAAE,uBAAuB;IACvC,OAAO,EAAE,gBAAgB;IACzB,SAAS,EAAE,kBAAkB;IAC7B,aAAa,EAAE,sBAAsB;CACxC,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { IAuthUser as AuthUser } from '@ackplus/nest-auth-contracts';
2
+ export declare function hasRole(user: AuthUser | null | undefined, role: string | string[], matchAll?: boolean): boolean;
3
+ export declare function hasPermission(user: AuthUser | null | undefined, permission: string | string[], matchAll?: boolean): boolean;
4
+ export declare function hasAnyAccess(user: AuthUser | null | undefined, requirements: {
5
+ roles?: string[];
6
+ permissions?: string[];
7
+ }): boolean;
8
+ export declare function hasAllAccess(user: AuthUser | null | undefined, requirements: {
9
+ roles?: string[];
10
+ permissions?: string[];
11
+ }): boolean;
12
+ //# sourceMappingURL=role-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"role-utils.d.ts","sourceRoot":"","sources":["../../src/utils/role-utils.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,IAAI,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAsBrE,wBAAgB,OAAO,CACnB,IAAI,EAAE,QAAQ,GAAG,IAAI,GAAG,SAAS,EACjC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,EACvB,QAAQ,GAAE,OAAe,GAC1B,OAAO,CAYT;AAsBD,wBAAgB,aAAa,CACzB,IAAI,EAAE,QAAQ,GAAG,IAAI,GAAG,SAAS,EACjC,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,EAC7B,QAAQ,GAAE,OAAe,GAC1B,OAAO,CAYT;AAgBD,wBAAgB,YAAY,CACxB,IAAI,EAAE,QAAQ,GAAG,IAAI,GAAG,SAAS,EACjC,YAAY,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GAC3D,OAAO,CAYT;AAgBD,wBAAgB,YAAY,CACxB,IAAI,EAAE,QAAQ,GAAG,IAAI,GAAG,SAAS,EACjC,YAAY,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GAC3D,OAAO,CAYT"}
@@ -0,0 +1,43 @@
1
+ export function hasRole(user, role, matchAll = false) {
2
+ if (!user || !user.roles || user.roles.length === 0) {
3
+ return false;
4
+ }
5
+ const roles = Array.isArray(role) ? role : [role];
6
+ if (matchAll) {
7
+ return roles.every(r => user.roles.includes(r));
8
+ }
9
+ return roles.some(r => user.roles.includes(r));
10
+ }
11
+ export function hasPermission(user, permission, matchAll = false) {
12
+ if (!user || !user.permissions || user.permissions.length === 0) {
13
+ return false;
14
+ }
15
+ const permissions = Array.isArray(permission) ? permission : [permission];
16
+ if (matchAll) {
17
+ return permissions.every(p => user.permissions.includes(p));
18
+ }
19
+ return permissions.some(p => user.permissions.includes(p));
20
+ }
21
+ export function hasAnyAccess(user, requirements) {
22
+ if (!user)
23
+ return false;
24
+ const hasRequiredRole = requirements.roles && requirements.roles.length > 0
25
+ ? hasRole(user, requirements.roles)
26
+ : false;
27
+ const hasRequiredPermission = requirements.permissions && requirements.permissions.length > 0
28
+ ? hasPermission(user, requirements.permissions)
29
+ : false;
30
+ return hasRequiredRole || hasRequiredPermission;
31
+ }
32
+ export function hasAllAccess(user, requirements) {
33
+ if (!user)
34
+ return false;
35
+ const hasRequiredRoles = requirements.roles && requirements.roles.length > 0
36
+ ? hasRole(user, requirements.roles, true)
37
+ : true;
38
+ const hasRequiredPermissions = requirements.permissions && requirements.permissions.length > 0
39
+ ? hasPermission(user, requirements.permissions, true)
40
+ : true;
41
+ return hasRequiredRoles && hasRequiredPermissions;
42
+ }
43
+ //# sourceMappingURL=role-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"role-utils.js","sourceRoot":"","sources":["../../src/utils/role-utils.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,56 @@
1
+ {
2
+ "name": "@ackplus/nest-auth-client",
3
+ "version": "1.1.29",
4
+ "description": "NestJS authentication for REST APIs",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js",
13
+ "require": "./dist/index.js"
14
+ }
15
+ },
16
+ "files": [
17
+ "dist",
18
+ "README.md",
19
+ "LICENSE"
20
+ ],
21
+ "keywords": [
22
+ "query-builder",
23
+ "rest",
24
+ "api",
25
+ "frontend",
26
+ "backend",
27
+ "filtering",
28
+ "pagination",
29
+ "relations",
30
+ "typescript",
31
+ "nestjs",
32
+ "react",
33
+ "angular",
34
+ "vue"
35
+ ],
36
+ "repository": {
37
+ "type": "git",
38
+ "url": "https://github.com/ack-solutions/nest-auth"
39
+ },
40
+ "license": "MIT",
41
+ "author": "Ackplus",
42
+ "dependencies": {
43
+ "jwt-decode": "^4.0.0",
44
+ "tslib": "^2.3.0",
45
+ "@ackplus/nest-auth-contracts": "1.1.29"
46
+ },
47
+ "devDependencies": {
48
+ "typescript": "^5.7.3"
49
+ },
50
+ "scripts": {
51
+ "clean": "rm -rf dist tsconfig.build.tsbuildinfo",
52
+ "build": "pnpm clean && tsc -p tsconfig.build.json",
53
+ "format": "prettier --write \"src/**/*.ts\"",
54
+ "lint": "eslint \"src/**/*.ts\" --fix"
55
+ }
56
+ }