@ackplus/nest-auth-client 2.0.0-beta.9 → 2.0.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/README.md +103 -63
- package/dist/client/auth-client.d.ts +47 -32
- package/dist/client/auth-client.d.ts.map +1 -1
- package/dist/client/auth-client.js +118 -69
- package/dist/client/auth-client.js.map +1 -1
- package/dist/client/event-emitter.d.ts +2 -3
- package/dist/client/event-emitter.d.ts.map +1 -1
- package/dist/client/event-emitter.js.map +1 -1
- package/dist/client/http-attach.d.ts +35 -0
- package/dist/client/http-attach.d.ts.map +1 -0
- package/dist/client/http-attach.js +90 -0
- package/dist/client/http-attach.js.map +1 -0
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/token/token-manager.d.ts +10 -0
- package/dist/token/token-manager.d.ts.map +1 -1
- package/dist/token/token-manager.js +84 -11
- package/dist/token/token-manager.js.map +1 -1
- package/dist/types/auth.types.d.ts +9 -1
- package/dist/types/auth.types.d.ts.map +1 -1
- package/dist/types/config.types.d.ts +10 -4
- package/dist/types/config.types.d.ts.map +1 -1
- package/dist/types/config.types.js +1 -1
- package/dist/types/config.types.js.map +1 -1
- package/dist/utils/role-utils.d.ts +9 -9
- package/dist/utils/role-utils.d.ts.map +1 -1
- package/dist/utils/role-utils.js +40 -31
- package/dist/utils/role-utils.js.map +1 -1
- package/package.json +9 -3
package/README.md
CHANGED
|
@@ -1,93 +1,133 @@
|
|
|
1
1
|
# @ackplus/nest-auth-client
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[](https://www.npmjs.com/package/@ackplus/nest-auth-client)
|
|
4
|
+
[](https://www.npmjs.com/package/@ackplus/nest-auth-client)
|
|
5
|
+
[](https://www.npmjs.com/package/@ackplus/nest-auth-client)
|
|
4
6
|
|
|
5
|
-
|
|
7
|
+
Framework-agnostic JavaScript/TypeScript client for [`@ackplus/nest-auth`](https://www.npmjs.com/package/@ackplus/nest-auth). Zero peer dependencies. Works anywhere modern JS runs — browsers, Node 18+, React Native, Cloudflare Workers, Deno, Bun.
|
|
6
8
|
|
|
7
|
-
|
|
8
|
-
- 💾 **Storage Adapters** - Built-in support for `localStorage`, `sessionStorage`, `AsyncStorage`, and Cookies.
|
|
9
|
-
- 🔄 **Auto Refresh** - Automatically handles JWT refresh token rotation silently.
|
|
10
|
-
- 📡 **HTTP Client** - Configurable HTTP client with interceptors.
|
|
11
|
-
- 🔐 **Type-Safe** - Full TypeScript support sharing types with the backend.
|
|
9
|
+
> 📚 **Full documentation: [ack-solutions.github.io/nest-auth/docs/client](https://ack-solutions.github.io/nest-auth/docs/client/)**
|
|
12
10
|
|
|
13
|
-
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Why use it
|
|
14
|
+
|
|
15
|
+
The official client for the `@ackplus/nest-auth` backend. Use it directly from Vue, Angular, Svelte, vanilla JS, or as the foundation under [`@ackplus/nest-auth-react`](https://www.npmjs.com/package/@ackplus/nest-auth-react).
|
|
16
|
+
|
|
17
|
+
It handles the parts of auth that are tedious to write by hand: token persistence, automatic refresh on 401 with concurrent-request deduplication, cookie/header mode switching, MFA flows, multi-tenant context, and an event subscription API.
|
|
18
|
+
|
|
19
|
+
## Install
|
|
14
20
|
|
|
15
21
|
```bash
|
|
16
|
-
npm install @ackplus/nest-auth-client
|
|
17
|
-
# or
|
|
18
22
|
pnpm add @ackplus/nest-auth-client
|
|
19
23
|
```
|
|
20
24
|
|
|
21
|
-
|
|
25
|
+
**No peer dependencies.** TypeScript definitions ship in the package.
|
|
22
26
|
|
|
23
|
-
|
|
27
|
+
## Minimal example
|
|
24
28
|
|
|
25
|
-
```
|
|
26
|
-
import {
|
|
29
|
+
```ts
|
|
30
|
+
import { AuthClient } from '@ackplus/nest-auth-client';
|
|
27
31
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
storage: 'local', // or 'cookie', 'memory'
|
|
32
|
+
const auth = new AuthClient({
|
|
33
|
+
baseUrl: 'https://api.example.com',
|
|
31
34
|
});
|
|
32
|
-
```
|
|
33
35
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
email: 'user@example.com',
|
|
40
|
-
password: 'password123',
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
console.log('Logged in user:', user);
|
|
44
|
-
} catch (error) {
|
|
45
|
-
console.error('Login failed:', error);
|
|
46
|
-
}
|
|
47
|
-
```
|
|
36
|
+
await auth.signup({
|
|
37
|
+
email: 'alice@example.com',
|
|
38
|
+
password: 'correct horse battery staple',
|
|
39
|
+
firstName: 'Alice', // any extra field flows through to UserRegisteredEvent
|
|
40
|
+
});
|
|
48
41
|
|
|
49
|
-
|
|
42
|
+
await auth.login({
|
|
43
|
+
credentials: { email: 'alice@example.com', password: 'correct horse battery staple' },
|
|
44
|
+
});
|
|
50
45
|
|
|
51
|
-
|
|
46
|
+
if (auth.getIsAuthenticated()) {
|
|
47
|
+
const user = await auth.getSessionUserData();
|
|
48
|
+
console.log('Hello', user.email);
|
|
49
|
+
}
|
|
50
|
+
```
|
|
52
51
|
|
|
53
|
-
|
|
54
|
-
|
|
52
|
+
## What's included
|
|
53
|
+
|
|
54
|
+
| Capability | Notes |
|
|
55
|
+
| --- | --- |
|
|
56
|
+
| **Auth flows** | `signup`, `login`, `logout`, `logoutAll`, `refresh`, `passwordlessSend`, `switchTenant` |
|
|
57
|
+
| **MFA** | `send2fa`, `verify2fa`, `setupTotp`, `verifyTotpSetup`, `getMfaStatus`, recovery codes |
|
|
58
|
+
| **Password management** | `forgotPassword`, `verifyForgotPasswordOtp`, `resetPassword`, `changePassword` |
|
|
59
|
+
| **Email/phone verification** | `sendEmailVerification`, `verifyEmail`, `sendPhoneVerification`, `verifyPhone` |
|
|
60
|
+
| **Auto-refresh** | 401 → refresh → retry once, with `RefreshQueue` deduplication so N parallel 401s only fire **one** refresh |
|
|
61
|
+
| **Header or cookie mode** | `accessTokenType: 'header' \| 'cookie' \| null` (auto-detect) |
|
|
62
|
+
| **Storage adapters** | `MemoryStorage`, `LocalStorageAdapter`, `SessionStorageAdapter`, `CookieStorageAdapter`, custom |
|
|
63
|
+
| **HTTP adapters** | `FetchAdapter` (default) or `createAxiosAdapter(yourAxiosInstance)`, custom |
|
|
64
|
+
| **Events** | `onTokensSet`, `onTokenRefreshed`, `onTokensRemoved`, `onLogout`, `onError`, `onSessionVerified` |
|
|
65
|
+
| **Utilities** | `decodeJwt`, `isTokenExpired`, `hasRole`, `hasPermission`, `hasAnyAccess`, `hasAllAccess` |
|
|
66
|
+
|
|
67
|
+
## Configuration
|
|
68
|
+
|
|
69
|
+
```ts
|
|
70
|
+
new AuthClient({
|
|
71
|
+
baseUrl: 'https://api.example.com',
|
|
72
|
+
storage: new LocalStorageAdapter('myapp_'),
|
|
73
|
+
httpAdapter: new FetchAdapter(),
|
|
74
|
+
accessTokenType: 'header', // or 'cookie' or null (auto-detect)
|
|
75
|
+
autoRefresh: true,
|
|
76
|
+
refreshThreshold: 60, // seconds before expiry
|
|
77
|
+
onTokenRefreshed: (tokens) => { /* … */ },
|
|
78
|
+
onLogout: () => { window.location.href = '/login'; },
|
|
79
|
+
onError: (err) => console.error(err),
|
|
80
|
+
});
|
|
55
81
|
```
|
|
56
82
|
|
|
57
|
-
|
|
83
|
+
[Full config reference →](https://ack-solutions.github.io/nest-auth/docs/client/config/)
|
|
58
84
|
|
|
59
|
-
|
|
85
|
+
## React Native
|
|
60
86
|
|
|
61
|
-
```
|
|
62
|
-
import { createAuthClient } from '@ackplus/nest-auth-client';
|
|
87
|
+
```ts
|
|
63
88
|
import AsyncStorage from '@react-native-async-storage/async-storage';
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
89
|
+
import { AuthClient, type StorageAdapter } from '@ackplus/nest-auth-client';
|
|
90
|
+
|
|
91
|
+
const RNStorage: StorageAdapter = {
|
|
92
|
+
get: (k) => AsyncStorage.getItem(k),
|
|
93
|
+
set: (k, v) => AsyncStorage.setItem(k, v),
|
|
94
|
+
remove: (k) => AsyncStorage.removeItem(k),
|
|
95
|
+
clear: () => AsyncStorage.clear(),
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
export const auth = new AuthClient({
|
|
99
|
+
baseUrl: 'https://api.example.com',
|
|
100
|
+
storage: RNStorage,
|
|
73
101
|
});
|
|
74
102
|
```
|
|
75
103
|
|
|
76
|
-
|
|
104
|
+
## Documentation
|
|
77
105
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
106
|
+
| Section | What's there |
|
|
107
|
+
| --- | --- |
|
|
108
|
+
| [`AuthClient`](https://ack-solutions.github.io/nest-auth/docs/client/client/) | Every method with TS signatures and examples |
|
|
109
|
+
| [Config](https://ack-solutions.github.io/nest-auth/docs/client/config/) | All `AuthClientConfig` options |
|
|
110
|
+
| [Storage Adapters](https://ack-solutions.github.io/nest-auth/docs/client/storage-adapters/) | Built-ins and how to write your own |
|
|
111
|
+
| [HTTP Adapters](https://ack-solutions.github.io/nest-auth/docs/client/http-adapters/) | Fetch (default), axios, custom |
|
|
112
|
+
| [Events](https://ack-solutions.github.io/nest-auth/docs/client/events/) | Subscription API |
|
|
113
|
+
| [Utilities](https://ack-solutions.github.io/nest-auth/docs/client/utilities/) | JWT helpers, role/permission checks |
|
|
82
114
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
115
|
+
## Companion packages
|
|
116
|
+
|
|
117
|
+
| Package | Use when |
|
|
118
|
+
| --- | --- |
|
|
119
|
+
| [`@ackplus/nest-auth`](https://www.npmjs.com/package/@ackplus/nest-auth) | The NestJS backend module |
|
|
120
|
+
| [`@ackplus/nest-auth-react`](https://www.npmjs.com/package/@ackplus/nest-auth-react) | React provider, hooks, guards, and Next.js App Router helpers (recommended for React) |
|
|
121
|
+
| [`@ackplus/nest-auth-contracts`](https://www.npmjs.com/package/@ackplus/nest-auth-contracts) | Shared TS types (already a transitive dep of this package) |
|
|
122
|
+
|
|
123
|
+
All four packages release together with the same version number. Pin them all to the same version.
|
|
124
|
+
|
|
125
|
+
## Links
|
|
126
|
+
|
|
127
|
+
- 📚 [Documentation](https://ack-solutions.github.io/nest-auth/)
|
|
128
|
+
- 💬 [Issue Tracker](https://github.com/ack-solutions/nest-auth/issues)
|
|
129
|
+
- 📦 [GitHub Repository](https://github.com/ack-solutions/nest-auth)
|
|
88
130
|
|
|
89
|
-
##
|
|
131
|
+
## License
|
|
90
132
|
|
|
91
|
-
|
|
92
|
-
- [@ackplus/nest-auth-react](../nest-auth-react) - React hooks for this client.
|
|
93
|
-
- [@ackplus/nest-auth-contracts](../nest-auth-contracts) - Shared types.
|
|
133
|
+
[MIT](https://github.com/ack-solutions/nest-auth/blob/main/LICENSE)
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { AuthClientConfig, RequestOptions } from '../types/config.types';
|
|
3
|
-
import { ClientSession } from '../types/auth.types';
|
|
1
|
+
import { ITokenPair, ISignupRequest, IRefreshRequest, IForgotPasswordRequest, IResetPasswordWithTokenRequest, IVerifyEmailRequest, IVerifyForgotPasswordOtpRequest, ISendEmailVerificationRequest, ISendPhoneVerificationRequest, IVerifyPhoneRequest, IChangePasswordRequest, IVerify2faRequest, IAuthResponse, IMessageResponse, IVerifyOtpResponse, IVerify2faResponse, ITotpSetupResponse, IVerifyTotpSetupRequest, IMfaStatusResponse, IMfaDevice, IToggleMfaRequest, ISwitchTenantRequest, IPasswordlessSendRequest, ISessionUserData, ILoginRequest } from '@ackplus/nest-auth-contracts';
|
|
2
|
+
import { AuthClientConfig, RequestOptions, GetAuthHeadersOptions } from '../types/config.types';
|
|
3
|
+
import { ClientSession, TokenState } from '../types/auth.types';
|
|
4
4
|
import { AuthError } from '../types/auth.types';
|
|
5
|
+
import { type AxiosLikeInstance, type AttachOptions } from './http-attach';
|
|
5
6
|
export declare class AuthClient {
|
|
6
7
|
private config;
|
|
7
8
|
private tokenManager;
|
|
8
9
|
private events;
|
|
9
10
|
private refreshQueue;
|
|
10
11
|
private retryTracker;
|
|
11
|
-
private
|
|
12
|
+
private isAuthenticated;
|
|
12
13
|
private session;
|
|
13
|
-
private userAccesses;
|
|
14
14
|
private tenantId;
|
|
15
15
|
private timeout;
|
|
16
16
|
constructor(config: AuthClientConfig);
|
|
@@ -26,56 +26,71 @@ export declare class AuthClient {
|
|
|
26
26
|
private handleError;
|
|
27
27
|
private storeTokensOnly;
|
|
28
28
|
private handleAuthResponse;
|
|
29
|
-
login(dto:
|
|
30
|
-
|
|
31
|
-
|
|
29
|
+
login(dto: ILoginRequest, options?: RequestOptions): Promise<IAuthResponse>;
|
|
30
|
+
socialLogin(provider: 'google' | 'github' | 'facebook' | 'apple' | (string & {}), token: string, opts?: {
|
|
31
|
+
type?: 'idToken' | 'accessToken';
|
|
32
|
+
createUserIfNotExists?: boolean;
|
|
33
|
+
tenantId?: string;
|
|
34
|
+
nonce?: string;
|
|
35
|
+
name?: string;
|
|
36
|
+
extraCredentials?: Record<string, unknown>;
|
|
37
|
+
}, options?: RequestOptions): Promise<IAuthResponse>;
|
|
38
|
+
signup(dto: ISignupRequest, options?: RequestOptions): Promise<IAuthResponse>;
|
|
39
|
+
passwordlessSend(dto: IPasswordlessSendRequest, options?: RequestOptions): Promise<IMessageResponse>;
|
|
32
40
|
private clearAuthState;
|
|
33
41
|
logout(options?: RequestOptions): Promise<void>;
|
|
34
|
-
logoutAll(options?: RequestOptions): Promise<
|
|
35
|
-
refresh(dto?:
|
|
42
|
+
logoutAll(options?: RequestOptions): Promise<IMessageResponse>;
|
|
43
|
+
refresh(dto?: IRefreshRequest, options?: RequestOptions): Promise<ITokenPair | null>;
|
|
36
44
|
verifySession(options?: RequestOptions): Promise<{
|
|
37
45
|
valid: boolean;
|
|
38
46
|
userId?: string;
|
|
39
47
|
expiresAt?: string;
|
|
40
48
|
}>;
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
49
|
+
getSessionUserData(): Promise<ISessionUserData>;
|
|
50
|
+
switchTenant(dto: ISwitchTenantRequest, options?: RequestOptions): Promise<IAuthResponse>;
|
|
51
|
+
forgotPassword(dto: IForgotPasswordRequest, options?: RequestOptions): Promise<IMessageResponse>;
|
|
52
|
+
verifyForgotPasswordOtp(dto: IVerifyForgotPasswordOtpRequest, options?: RequestOptions): Promise<IVerifyOtpResponse>;
|
|
53
|
+
resetPassword(dto: IResetPasswordWithTokenRequest, options?: RequestOptions): Promise<IMessageResponse>;
|
|
54
|
+
changePassword(dto: IChangePasswordRequest, options?: RequestOptions): Promise<IMessageResponse>;
|
|
55
|
+
sendEmailVerification(dto?: ISendEmailVerificationRequest, options?: RequestOptions): Promise<IMessageResponse>;
|
|
56
|
+
sendPhoneVerification(dto?: ISendPhoneVerificationRequest, options?: RequestOptions): Promise<IMessageResponse>;
|
|
57
|
+
verifyEmail(dto: IVerifyEmailRequest, options?: RequestOptions): Promise<IMessageResponse>;
|
|
58
|
+
verifyPhone(dto: IVerifyPhoneRequest, options?: RequestOptions): Promise<IMessageResponse>;
|
|
59
|
+
send2fa(method?: 'email' | 'phone', options?: RequestOptions): Promise<IMessageResponse>;
|
|
60
|
+
verify2fa(dto: IVerify2faRequest, options?: RequestOptions): Promise<IVerify2faResponse>;
|
|
52
61
|
setupTotp(options?: RequestOptions): Promise<ITotpSetupResponse>;
|
|
53
|
-
verifyTotpSetup(dto: IVerifyTotpSetupRequest, options?: RequestOptions): Promise<
|
|
62
|
+
verifyTotpSetup(dto: IVerifyTotpSetupRequest, options?: RequestOptions): Promise<IMessageResponse>;
|
|
54
63
|
getMfaStatus(options?: RequestOptions): Promise<IMfaStatusResponse>;
|
|
55
64
|
listTotpDevices(options?: RequestOptions): Promise<IMfaDevice[]>;
|
|
56
|
-
removeTotpDevice(deviceId: string, options?: RequestOptions): Promise<
|
|
57
|
-
toggleMfa(dto: IToggleMfaRequest, options?: RequestOptions): Promise<
|
|
65
|
+
removeTotpDevice(deviceId: string, options?: RequestOptions): Promise<IMessageResponse>;
|
|
66
|
+
toggleMfa(dto: IToggleMfaRequest, options?: RequestOptions): Promise<IMessageResponse>;
|
|
58
67
|
generateRecoveryCode(options?: RequestOptions): Promise<{
|
|
59
68
|
code: string;
|
|
60
69
|
}>;
|
|
61
|
-
resetMfa(code: string, options?: RequestOptions): Promise<
|
|
70
|
+
resetMfa(code: string, options?: RequestOptions): Promise<IMessageResponse>;
|
|
62
71
|
setMode(mode: 'header' | 'cookie'): void;
|
|
63
72
|
getMode(): 'header' | 'cookie';
|
|
64
73
|
setTenantId(id: string): void;
|
|
65
74
|
getTenantId(): string | undefined;
|
|
66
|
-
getUser(): AuthUser | null;
|
|
67
75
|
getSession(): ClientSession | null;
|
|
68
|
-
|
|
69
|
-
getTenantMemberships(): INestAuthUserAccess[] | undefined;
|
|
70
|
-
isAuthenticated(): boolean;
|
|
76
|
+
getIsAuthenticated(): boolean;
|
|
71
77
|
getAccessToken(): Promise<string | null>;
|
|
72
|
-
|
|
73
|
-
onTokenRefreshed(callback: (tokens: TokenPair) => void): () => void;
|
|
78
|
+
onTokenRefreshed(callback: (tokens: ITokenPair | null) => void): () => void;
|
|
74
79
|
onLogout(callback: () => void): () => void;
|
|
75
80
|
onError(callback: (error: AuthError) => void): () => void;
|
|
76
|
-
onTokensSet(callback: (tokens:
|
|
81
|
+
onTokensSet(callback: (tokens: ITokenPair & {
|
|
77
82
|
trustToken?: string;
|
|
78
83
|
}) => void | Promise<void>): () => void;
|
|
79
84
|
onTokensRemoved(callback: () => void | Promise<void>): () => void;
|
|
85
|
+
onSessionVerified(callback: () => void): () => void;
|
|
86
|
+
onRefreshSessionData(callback: () => void): () => void;
|
|
87
|
+
getAuthHeaders(opts?: GetAuthHeadersOptions): Promise<Record<string, string>>;
|
|
88
|
+
getAuthHeadersSync(opts?: GetAuthHeadersOptions): Record<string, string>;
|
|
89
|
+
shouldSendCookies(): boolean;
|
|
90
|
+
ready(): Promise<void>;
|
|
91
|
+
attachToAxios(instance: AxiosLikeInstance, opts?: AttachOptions): () => void;
|
|
92
|
+
attachToFetch(baseFetch?: typeof globalThis.fetch, opts?: AttachOptions): typeof globalThis.fetch;
|
|
93
|
+
getTokenState(): TokenState;
|
|
94
|
+
subscribeTokenState(listener: (state: TokenState) => void): () => void;
|
|
80
95
|
}
|
|
81
96
|
//# sourceMappingURL=auth-client.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth-client.d.ts","sourceRoot":"","sources":["../../src/client/auth-client.ts"],"names":[],"mappings":"AAKA,OAAO,EACH,
|
|
1
|
+
{"version":3,"file":"auth-client.d.ts","sourceRoot":"","sources":["../../src/client/auth-client.ts"],"names":[],"mappings":"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"}
|