hydrousdb 1.1.0
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/LICENSE +21 -0
- package/README.md +686 -0
- package/dist/analytics/index.d.mts +178 -0
- package/dist/analytics/index.d.ts +178 -0
- package/dist/analytics/index.js +221 -0
- package/dist/analytics/index.js.map +1 -0
- package/dist/analytics/index.mjs +219 -0
- package/dist/analytics/index.mjs.map +1 -0
- package/dist/auth/index.d.mts +180 -0
- package/dist/auth/index.d.ts +180 -0
- package/dist/auth/index.js +220 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/index.mjs +218 -0
- package/dist/auth/index.mjs.map +1 -0
- package/dist/http-CIXLF5GV.d.mts +466 -0
- package/dist/http-CIXLF5GV.d.ts +466 -0
- package/dist/index.d.mts +73 -0
- package/dist/index.d.ts +73 -0
- package/dist/index.js +810 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +801 -0
- package/dist/index.mjs.map +1 -0
- package/dist/records/index.d.mts +124 -0
- package/dist/records/index.d.ts +124 -0
- package/dist/records/index.js +226 -0
- package/dist/records/index.js.map +1 -0
- package/dist/records/index.mjs +224 -0
- package/dist/records/index.mjs.map +1 -0
- package/package.json +67 -0
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// src/auth/client.ts
|
|
4
|
+
var AuthClient = class {
|
|
5
|
+
constructor(http) {
|
|
6
|
+
this.http = http;
|
|
7
|
+
}
|
|
8
|
+
get path() {
|
|
9
|
+
return `/auth/${this.http.bucketKey}`;
|
|
10
|
+
}
|
|
11
|
+
// ── Sign-up ────────────────────────────────────────────────────────────────
|
|
12
|
+
/**
|
|
13
|
+
* Create a new user account. Returns the user and a session immediately.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* const { data, session } = await db.auth.signUp({
|
|
17
|
+
* email: 'alice@example.com',
|
|
18
|
+
* password: 'Str0ngP@ss!',
|
|
19
|
+
* fullName: 'Alice Smith',
|
|
20
|
+
* });
|
|
21
|
+
* // Store session.sessionId and session.refreshToken in your app
|
|
22
|
+
*/
|
|
23
|
+
async signUp(payload, opts) {
|
|
24
|
+
return this.http.post(`${this.path}/signup`, payload, opts);
|
|
25
|
+
}
|
|
26
|
+
// ── Sign-in ────────────────────────────────────────────────────────────────
|
|
27
|
+
/**
|
|
28
|
+
* Authenticate with email + password. Returns user data and a new session.
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* const { data, session } = await db.auth.signIn({
|
|
32
|
+
* email: 'alice@example.com',
|
|
33
|
+
* password: 'Str0ngP@ss!',
|
|
34
|
+
* });
|
|
35
|
+
*/
|
|
36
|
+
async signIn(payload, opts) {
|
|
37
|
+
return this.http.post(`${this.path}/signin`, payload, opts);
|
|
38
|
+
}
|
|
39
|
+
// ── Sign-out ───────────────────────────────────────────────────────────────
|
|
40
|
+
/**
|
|
41
|
+
* Revoke a session (or all sessions for a user).
|
|
42
|
+
*
|
|
43
|
+
* @example
|
|
44
|
+
* // Single device
|
|
45
|
+
* await db.auth.signOut({ sessionId: 'sess_...' });
|
|
46
|
+
*
|
|
47
|
+
* // All devices
|
|
48
|
+
* await db.auth.signOut({ allDevices: true, userId: 'user_...' });
|
|
49
|
+
*/
|
|
50
|
+
async signOut(payload, opts) {
|
|
51
|
+
return this.http.post(`${this.path}/signout`, payload, opts);
|
|
52
|
+
}
|
|
53
|
+
// ── Session: validate ──────────────────────────────────────────────────────
|
|
54
|
+
/**
|
|
55
|
+
* Validate a session token — use this on every protected request in your backend.
|
|
56
|
+
*
|
|
57
|
+
* @example
|
|
58
|
+
* try {
|
|
59
|
+
* const { data } = await db.auth.validateSession(sessionId);
|
|
60
|
+
* // data is the authenticated user
|
|
61
|
+
* } catch (err) {
|
|
62
|
+
* // Session expired or invalid
|
|
63
|
+
* }
|
|
64
|
+
*/
|
|
65
|
+
async validateSession(sessionId, opts) {
|
|
66
|
+
return this.http.post(`${this.path}/session/validate`, { sessionId }, opts);
|
|
67
|
+
}
|
|
68
|
+
// ── Session: refresh ───────────────────────────────────────────────────────
|
|
69
|
+
/**
|
|
70
|
+
* Exchange a refresh token for a new session (rotation).
|
|
71
|
+
* The old session is revoked.
|
|
72
|
+
*
|
|
73
|
+
* @example
|
|
74
|
+
* const { session } = await db.auth.refreshSession(refreshToken);
|
|
75
|
+
*/
|
|
76
|
+
async refreshSession(refreshToken, opts) {
|
|
77
|
+
return this.http.post(`${this.path}/session/refresh`, { refreshToken }, opts);
|
|
78
|
+
}
|
|
79
|
+
// ── User: get ──────────────────────────────────────────────────────────────
|
|
80
|
+
/**
|
|
81
|
+
* Fetch a user by their ID.
|
|
82
|
+
*
|
|
83
|
+
* @example
|
|
84
|
+
* const { data } = await db.auth.getUser('user_abc123');
|
|
85
|
+
*/
|
|
86
|
+
async getUser(userId, opts) {
|
|
87
|
+
return this.http.get(`${this.path}/user`, { userId }, opts);
|
|
88
|
+
}
|
|
89
|
+
// ── User: list ─────────────────────────────────────────────────────────────
|
|
90
|
+
/**
|
|
91
|
+
* List users with cursor-based pagination.
|
|
92
|
+
*
|
|
93
|
+
* @example
|
|
94
|
+
* const { data, meta } = await db.auth.listUsers({ limit: 50 });
|
|
95
|
+
*/
|
|
96
|
+
async listUsers(options) {
|
|
97
|
+
const params = {
|
|
98
|
+
limit: options?.limit
|
|
99
|
+
};
|
|
100
|
+
if (options?.cursor) params["cursor"] = options.cursor;
|
|
101
|
+
return this.http.get(`${this.path}/users`, params, options);
|
|
102
|
+
}
|
|
103
|
+
// ── User: update ───────────────────────────────────────────────────────────
|
|
104
|
+
/**
|
|
105
|
+
* Update user profile fields.
|
|
106
|
+
*
|
|
107
|
+
* @example
|
|
108
|
+
* await db.auth.updateUser({ userId: 'user_abc', updates: { fullName: 'Bob Smith' } });
|
|
109
|
+
*/
|
|
110
|
+
async updateUser(payload, opts) {
|
|
111
|
+
return this.http.patch(`${this.path}/user`, payload, opts);
|
|
112
|
+
}
|
|
113
|
+
// ── User: delete ───────────────────────────────────────────────────────────
|
|
114
|
+
/**
|
|
115
|
+
* Soft-delete a user. All their sessions are revoked automatically.
|
|
116
|
+
*
|
|
117
|
+
* @example
|
|
118
|
+
* await db.auth.deleteUser('user_abc123');
|
|
119
|
+
*/
|
|
120
|
+
async deleteUser(userId, opts) {
|
|
121
|
+
return this.http.delete(`${this.path}/user`, { userId }, opts);
|
|
122
|
+
}
|
|
123
|
+
// ── Password: change ───────────────────────────────────────────────────────
|
|
124
|
+
/**
|
|
125
|
+
* Change password for a signed-in user (requires old password).
|
|
126
|
+
* All sessions are revoked after success.
|
|
127
|
+
*
|
|
128
|
+
* @example
|
|
129
|
+
* await db.auth.changePassword({
|
|
130
|
+
* userId: 'user_abc',
|
|
131
|
+
* oldPassword: 'Old@Pass1',
|
|
132
|
+
* newPassword: 'New@Pass2',
|
|
133
|
+
* });
|
|
134
|
+
*/
|
|
135
|
+
async changePassword(payload, opts) {
|
|
136
|
+
return this.http.post(`${this.path}/password/change`, payload, opts);
|
|
137
|
+
}
|
|
138
|
+
// ── Password: reset request ────────────────────────────────────────────────
|
|
139
|
+
/**
|
|
140
|
+
* Request a password reset email.
|
|
141
|
+
* Always returns success to prevent email enumeration.
|
|
142
|
+
*
|
|
143
|
+
* @example
|
|
144
|
+
* await db.auth.requestPasswordReset({ email: 'alice@example.com' });
|
|
145
|
+
*/
|
|
146
|
+
async requestPasswordReset(payload, opts) {
|
|
147
|
+
return this.http.post(`${this.path}/password/reset/request`, payload, opts);
|
|
148
|
+
}
|
|
149
|
+
// ── Password: reset confirm ────────────────────────────────────────────────
|
|
150
|
+
/**
|
|
151
|
+
* Confirm a password reset using the token from the reset email.
|
|
152
|
+
*
|
|
153
|
+
* @example
|
|
154
|
+
* await db.auth.confirmPasswordReset({ resetToken: 'tok_...', newPassword: 'New@Pass2' });
|
|
155
|
+
*/
|
|
156
|
+
async confirmPasswordReset(payload, opts) {
|
|
157
|
+
return this.http.post(`${this.path}/password/reset/confirm`, payload, opts);
|
|
158
|
+
}
|
|
159
|
+
// ── Email: verify request ──────────────────────────────────────────────────
|
|
160
|
+
/**
|
|
161
|
+
* Send a verification email to the user.
|
|
162
|
+
*
|
|
163
|
+
* @example
|
|
164
|
+
* await db.auth.requestEmailVerification({ userId: 'user_abc' });
|
|
165
|
+
*/
|
|
166
|
+
async requestEmailVerification(payload, opts) {
|
|
167
|
+
return this.http.post(`${this.path}/email/verify/request`, payload, opts);
|
|
168
|
+
}
|
|
169
|
+
// ── Email: verify confirm ──────────────────────────────────────────────────
|
|
170
|
+
/**
|
|
171
|
+
* Confirm email address using the token from the verification email.
|
|
172
|
+
*
|
|
173
|
+
* @example
|
|
174
|
+
* await db.auth.confirmEmailVerification({ verifyToken: 'tok_...' });
|
|
175
|
+
*/
|
|
176
|
+
async confirmEmailVerification(payload, opts) {
|
|
177
|
+
return this.http.post(`${this.path}/email/verify/confirm`, payload, opts);
|
|
178
|
+
}
|
|
179
|
+
// ── Account: lock ──────────────────────────────────────────────────────────
|
|
180
|
+
/**
|
|
181
|
+
* Lock a user account for a given duration (default: 15 min).
|
|
182
|
+
*
|
|
183
|
+
* @example
|
|
184
|
+
* await db.auth.lockAccount({ userId: 'user_abc', duration: 30 * 60 * 1000 });
|
|
185
|
+
*/
|
|
186
|
+
async lockAccount(payload, opts) {
|
|
187
|
+
return this.http.post(`${this.path}/account/lock`, payload, opts);
|
|
188
|
+
}
|
|
189
|
+
// ── Account: unlock ────────────────────────────────────────────────────────
|
|
190
|
+
/**
|
|
191
|
+
* Unlock a previously locked user account.
|
|
192
|
+
*
|
|
193
|
+
* @example
|
|
194
|
+
* await db.auth.unlockAccount('user_abc');
|
|
195
|
+
*/
|
|
196
|
+
async unlockAccount(userId, opts) {
|
|
197
|
+
return this.http.post(`${this.path}/account/unlock`, { userId }, opts);
|
|
198
|
+
}
|
|
199
|
+
// ── Helpers ────────────────────────────────────────────────────────────────
|
|
200
|
+
/**
|
|
201
|
+
* Fetch all users, automatically following cursors.
|
|
202
|
+
*
|
|
203
|
+
* @example
|
|
204
|
+
* const users = await db.auth.listAllUsers();
|
|
205
|
+
*/
|
|
206
|
+
async listAllUsers(opts) {
|
|
207
|
+
const all = [];
|
|
208
|
+
let cursor = null;
|
|
209
|
+
do {
|
|
210
|
+
const result = await this.listUsers(cursor ? { cursor, ...opts } : { ...opts });
|
|
211
|
+
all.push(...result.data);
|
|
212
|
+
cursor = result.meta.nextCursor ?? null;
|
|
213
|
+
} while (cursor);
|
|
214
|
+
return all;
|
|
215
|
+
}
|
|
216
|
+
};
|
|
217
|
+
|
|
218
|
+
exports.AuthClient = AuthClient;
|
|
219
|
+
//# sourceMappingURL=index.js.map
|
|
220
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/auth/client.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type { HttpClient } from '../utils/http.js';\nimport type {\n SignUpPayload,\n SignUpResponse,\n SignInPayload,\n SignInResponse,\n SignOutPayload,\n ValidateSessionResponse,\n RefreshSessionResponse,\n GetUserResponse,\n ListUsersResponse,\n UpdateUserPayload,\n UpdateUserResponse,\n PasswordChangePayload,\n PasswordResetRequestPayload,\n PasswordResetConfirmPayload,\n EmailVerifyRequestPayload,\n EmailVerifyConfirmPayload,\n AccountLockPayload,\n AccountLockResponse,\n AuthUser,\n RequestOptions,\n} from '../types/index.js';\n\nexport class AuthClient {\n constructor(private readonly http: HttpClient) {}\n\n private get path() {\n return `/auth/${this.http.bucketKey}`;\n }\n\n // ── Sign-up ────────────────────────────────────────────────────────────────\n\n /**\n * Create a new user account. Returns the user and a session immediately.\n *\n * @example\n * const { data, session } = await db.auth.signUp({\n * email: 'alice@example.com',\n * password: 'Str0ngP@ss!',\n * fullName: 'Alice Smith',\n * });\n * // Store session.sessionId and session.refreshToken in your app\n */\n async signUp(payload: SignUpPayload, opts?: RequestOptions): Promise<SignUpResponse> {\n return this.http.post<SignUpResponse>(`${this.path}/signup`, payload, opts);\n }\n\n // ── Sign-in ────────────────────────────────────────────────────────────────\n\n /**\n * Authenticate with email + password. Returns user data and a new session.\n *\n * @example\n * const { data, session } = await db.auth.signIn({\n * email: 'alice@example.com',\n * password: 'Str0ngP@ss!',\n * });\n */\n async signIn(payload: SignInPayload, opts?: RequestOptions): Promise<SignInResponse> {\n return this.http.post<SignInResponse>(`${this.path}/signin`, payload, opts);\n }\n\n // ── Sign-out ───────────────────────────────────────────────────────────────\n\n /**\n * Revoke a session (or all sessions for a user).\n *\n * @example\n * // Single device\n * await db.auth.signOut({ sessionId: 'sess_...' });\n *\n * // All devices\n * await db.auth.signOut({ allDevices: true, userId: 'user_...' });\n */\n async signOut(payload: SignOutPayload, opts?: RequestOptions): Promise<{ success: true; message: string }> {\n return this.http.post(`${this.path}/signout`, payload, opts);\n }\n\n // ── Session: validate ──────────────────────────────────────────────────────\n\n /**\n * Validate a session token — use this on every protected request in your backend.\n *\n * @example\n * try {\n * const { data } = await db.auth.validateSession(sessionId);\n * // data is the authenticated user\n * } catch (err) {\n * // Session expired or invalid\n * }\n */\n async validateSession(sessionId: string, opts?: RequestOptions): Promise<ValidateSessionResponse> {\n return this.http.post<ValidateSessionResponse>(`${this.path}/session/validate`, { sessionId }, opts);\n }\n\n // ── Session: refresh ───────────────────────────────────────────────────────\n\n /**\n * Exchange a refresh token for a new session (rotation).\n * The old session is revoked.\n *\n * @example\n * const { session } = await db.auth.refreshSession(refreshToken);\n */\n async refreshSession(refreshToken: string, opts?: RequestOptions): Promise<RefreshSessionResponse> {\n return this.http.post<RefreshSessionResponse>(`${this.path}/session/refresh`, { refreshToken }, opts);\n }\n\n // ── User: get ──────────────────────────────────────────────────────────────\n\n /**\n * Fetch a user by their ID.\n *\n * @example\n * const { data } = await db.auth.getUser('user_abc123');\n */\n async getUser(userId: string, opts?: RequestOptions): Promise<GetUserResponse> {\n return this.http.get<GetUserResponse>(`${this.path}/user`, { userId }, opts);\n }\n\n // ── User: list ─────────────────────────────────────────────────────────────\n\n /**\n * List users with cursor-based pagination.\n *\n * @example\n * const { data, meta } = await db.auth.listUsers({ limit: 50 });\n */\n async listUsers(options?: { limit?: number; cursor?: string } & RequestOptions): Promise<ListUsersResponse> {\n const params: Record<string, string | number | boolean | undefined | null> = {\n limit: options?.limit,\n };\n if (options?.cursor) params['cursor'] = options.cursor;\n return this.http.get<ListUsersResponse>(`${this.path}/users`, params, options);\n }\n\n // ── User: update ───────────────────────────────────────────────────────────\n\n /**\n * Update user profile fields.\n *\n * @example\n * await db.auth.updateUser({ userId: 'user_abc', updates: { fullName: 'Bob Smith' } });\n */\n async updateUser(payload: UpdateUserPayload, opts?: RequestOptions): Promise<UpdateUserResponse> {\n return this.http.patch<UpdateUserResponse>(`${this.path}/user`, payload, opts);\n }\n\n // ── User: delete ───────────────────────────────────────────────────────────\n\n /**\n * Soft-delete a user. All their sessions are revoked automatically.\n *\n * @example\n * await db.auth.deleteUser('user_abc123');\n */\n async deleteUser(userId: string, opts?: RequestOptions): Promise<{ success: true; message: string }> {\n return this.http.delete(`${this.path}/user`, { userId }, opts);\n }\n\n // ── Password: change ───────────────────────────────────────────────────────\n\n /**\n * Change password for a signed-in user (requires old password).\n * All sessions are revoked after success.\n *\n * @example\n * await db.auth.changePassword({\n * userId: 'user_abc',\n * oldPassword: 'Old@Pass1',\n * newPassword: 'New@Pass2',\n * });\n */\n async changePassword(payload: PasswordChangePayload, opts?: RequestOptions): Promise<{ success: true; message: string }> {\n return this.http.post(`${this.path}/password/change`, payload, opts);\n }\n\n // ── Password: reset request ────────────────────────────────────────────────\n\n /**\n * Request a password reset email.\n * Always returns success to prevent email enumeration.\n *\n * @example\n * await db.auth.requestPasswordReset({ email: 'alice@example.com' });\n */\n async requestPasswordReset(payload: PasswordResetRequestPayload, opts?: RequestOptions): Promise<{ success: true; message: string }> {\n return this.http.post(`${this.path}/password/reset/request`, payload, opts);\n }\n\n // ── Password: reset confirm ────────────────────────────────────────────────\n\n /**\n * Confirm a password reset using the token from the reset email.\n *\n * @example\n * await db.auth.confirmPasswordReset({ resetToken: 'tok_...', newPassword: 'New@Pass2' });\n */\n async confirmPasswordReset(payload: PasswordResetConfirmPayload, opts?: RequestOptions): Promise<{ success: true; message: string }> {\n return this.http.post(`${this.path}/password/reset/confirm`, payload, opts);\n }\n\n // ── Email: verify request ──────────────────────────────────────────────────\n\n /**\n * Send a verification email to the user.\n *\n * @example\n * await db.auth.requestEmailVerification({ userId: 'user_abc' });\n */\n async requestEmailVerification(payload: EmailVerifyRequestPayload, opts?: RequestOptions): Promise<{ success: true; message: string }> {\n return this.http.post(`${this.path}/email/verify/request`, payload, opts);\n }\n\n // ── Email: verify confirm ──────────────────────────────────────────────────\n\n /**\n * Confirm email address using the token from the verification email.\n *\n * @example\n * await db.auth.confirmEmailVerification({ verifyToken: 'tok_...' });\n */\n async confirmEmailVerification(payload: EmailVerifyConfirmPayload, opts?: RequestOptions): Promise<{ success: true; message: string }> {\n return this.http.post(`${this.path}/email/verify/confirm`, payload, opts);\n }\n\n // ── Account: lock ──────────────────────────────────────────────────────────\n\n /**\n * Lock a user account for a given duration (default: 15 min).\n *\n * @example\n * await db.auth.lockAccount({ userId: 'user_abc', duration: 30 * 60 * 1000 });\n */\n async lockAccount(payload: AccountLockPayload, opts?: RequestOptions): Promise<AccountLockResponse> {\n return this.http.post<AccountLockResponse>(`${this.path}/account/lock`, payload, opts);\n }\n\n // ── Account: unlock ────────────────────────────────────────────────────────\n\n /**\n * Unlock a previously locked user account.\n *\n * @example\n * await db.auth.unlockAccount('user_abc');\n */\n async unlockAccount(userId: string, opts?: RequestOptions): Promise<{ success: true; message: string }> {\n return this.http.post(`${this.path}/account/unlock`, { userId }, opts);\n }\n\n // ── Helpers ────────────────────────────────────────────────────────────────\n\n /**\n * Fetch all users, automatically following cursors.\n *\n * @example\n * const users = await db.auth.listAllUsers();\n */\n async listAllUsers(opts?: RequestOptions): Promise<AuthUser[]> {\n const all: AuthUser[] = [];\n let cursor: string | null = null;\n\n do {\n const result = await this.listUsers(cursor ? { cursor, ...opts } : { ...opts });\n all.push(...result.data);\n cursor = result.meta.nextCursor ?? null;\n } while (cursor);\n\n return all;\n }\n}\n"]}
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
// src/auth/client.ts
|
|
2
|
+
var AuthClient = class {
|
|
3
|
+
constructor(http) {
|
|
4
|
+
this.http = http;
|
|
5
|
+
}
|
|
6
|
+
get path() {
|
|
7
|
+
return `/auth/${this.http.bucketKey}`;
|
|
8
|
+
}
|
|
9
|
+
// ── Sign-up ────────────────────────────────────────────────────────────────
|
|
10
|
+
/**
|
|
11
|
+
* Create a new user account. Returns the user and a session immediately.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* const { data, session } = await db.auth.signUp({
|
|
15
|
+
* email: 'alice@example.com',
|
|
16
|
+
* password: 'Str0ngP@ss!',
|
|
17
|
+
* fullName: 'Alice Smith',
|
|
18
|
+
* });
|
|
19
|
+
* // Store session.sessionId and session.refreshToken in your app
|
|
20
|
+
*/
|
|
21
|
+
async signUp(payload, opts) {
|
|
22
|
+
return this.http.post(`${this.path}/signup`, payload, opts);
|
|
23
|
+
}
|
|
24
|
+
// ── Sign-in ────────────────────────────────────────────────────────────────
|
|
25
|
+
/**
|
|
26
|
+
* Authenticate with email + password. Returns user data and a new session.
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* const { data, session } = await db.auth.signIn({
|
|
30
|
+
* email: 'alice@example.com',
|
|
31
|
+
* password: 'Str0ngP@ss!',
|
|
32
|
+
* });
|
|
33
|
+
*/
|
|
34
|
+
async signIn(payload, opts) {
|
|
35
|
+
return this.http.post(`${this.path}/signin`, payload, opts);
|
|
36
|
+
}
|
|
37
|
+
// ── Sign-out ───────────────────────────────────────────────────────────────
|
|
38
|
+
/**
|
|
39
|
+
* Revoke a session (or all sessions for a user).
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* // Single device
|
|
43
|
+
* await db.auth.signOut({ sessionId: 'sess_...' });
|
|
44
|
+
*
|
|
45
|
+
* // All devices
|
|
46
|
+
* await db.auth.signOut({ allDevices: true, userId: 'user_...' });
|
|
47
|
+
*/
|
|
48
|
+
async signOut(payload, opts) {
|
|
49
|
+
return this.http.post(`${this.path}/signout`, payload, opts);
|
|
50
|
+
}
|
|
51
|
+
// ── Session: validate ──────────────────────────────────────────────────────
|
|
52
|
+
/**
|
|
53
|
+
* Validate a session token — use this on every protected request in your backend.
|
|
54
|
+
*
|
|
55
|
+
* @example
|
|
56
|
+
* try {
|
|
57
|
+
* const { data } = await db.auth.validateSession(sessionId);
|
|
58
|
+
* // data is the authenticated user
|
|
59
|
+
* } catch (err) {
|
|
60
|
+
* // Session expired or invalid
|
|
61
|
+
* }
|
|
62
|
+
*/
|
|
63
|
+
async validateSession(sessionId, opts) {
|
|
64
|
+
return this.http.post(`${this.path}/session/validate`, { sessionId }, opts);
|
|
65
|
+
}
|
|
66
|
+
// ── Session: refresh ───────────────────────────────────────────────────────
|
|
67
|
+
/**
|
|
68
|
+
* Exchange a refresh token for a new session (rotation).
|
|
69
|
+
* The old session is revoked.
|
|
70
|
+
*
|
|
71
|
+
* @example
|
|
72
|
+
* const { session } = await db.auth.refreshSession(refreshToken);
|
|
73
|
+
*/
|
|
74
|
+
async refreshSession(refreshToken, opts) {
|
|
75
|
+
return this.http.post(`${this.path}/session/refresh`, { refreshToken }, opts);
|
|
76
|
+
}
|
|
77
|
+
// ── User: get ──────────────────────────────────────────────────────────────
|
|
78
|
+
/**
|
|
79
|
+
* Fetch a user by their ID.
|
|
80
|
+
*
|
|
81
|
+
* @example
|
|
82
|
+
* const { data } = await db.auth.getUser('user_abc123');
|
|
83
|
+
*/
|
|
84
|
+
async getUser(userId, opts) {
|
|
85
|
+
return this.http.get(`${this.path}/user`, { userId }, opts);
|
|
86
|
+
}
|
|
87
|
+
// ── User: list ─────────────────────────────────────────────────────────────
|
|
88
|
+
/**
|
|
89
|
+
* List users with cursor-based pagination.
|
|
90
|
+
*
|
|
91
|
+
* @example
|
|
92
|
+
* const { data, meta } = await db.auth.listUsers({ limit: 50 });
|
|
93
|
+
*/
|
|
94
|
+
async listUsers(options) {
|
|
95
|
+
const params = {
|
|
96
|
+
limit: options?.limit
|
|
97
|
+
};
|
|
98
|
+
if (options?.cursor) params["cursor"] = options.cursor;
|
|
99
|
+
return this.http.get(`${this.path}/users`, params, options);
|
|
100
|
+
}
|
|
101
|
+
// ── User: update ───────────────────────────────────────────────────────────
|
|
102
|
+
/**
|
|
103
|
+
* Update user profile fields.
|
|
104
|
+
*
|
|
105
|
+
* @example
|
|
106
|
+
* await db.auth.updateUser({ userId: 'user_abc', updates: { fullName: 'Bob Smith' } });
|
|
107
|
+
*/
|
|
108
|
+
async updateUser(payload, opts) {
|
|
109
|
+
return this.http.patch(`${this.path}/user`, payload, opts);
|
|
110
|
+
}
|
|
111
|
+
// ── User: delete ───────────────────────────────────────────────────────────
|
|
112
|
+
/**
|
|
113
|
+
* Soft-delete a user. All their sessions are revoked automatically.
|
|
114
|
+
*
|
|
115
|
+
* @example
|
|
116
|
+
* await db.auth.deleteUser('user_abc123');
|
|
117
|
+
*/
|
|
118
|
+
async deleteUser(userId, opts) {
|
|
119
|
+
return this.http.delete(`${this.path}/user`, { userId }, opts);
|
|
120
|
+
}
|
|
121
|
+
// ── Password: change ───────────────────────────────────────────────────────
|
|
122
|
+
/**
|
|
123
|
+
* Change password for a signed-in user (requires old password).
|
|
124
|
+
* All sessions are revoked after success.
|
|
125
|
+
*
|
|
126
|
+
* @example
|
|
127
|
+
* await db.auth.changePassword({
|
|
128
|
+
* userId: 'user_abc',
|
|
129
|
+
* oldPassword: 'Old@Pass1',
|
|
130
|
+
* newPassword: 'New@Pass2',
|
|
131
|
+
* });
|
|
132
|
+
*/
|
|
133
|
+
async changePassword(payload, opts) {
|
|
134
|
+
return this.http.post(`${this.path}/password/change`, payload, opts);
|
|
135
|
+
}
|
|
136
|
+
// ── Password: reset request ────────────────────────────────────────────────
|
|
137
|
+
/**
|
|
138
|
+
* Request a password reset email.
|
|
139
|
+
* Always returns success to prevent email enumeration.
|
|
140
|
+
*
|
|
141
|
+
* @example
|
|
142
|
+
* await db.auth.requestPasswordReset({ email: 'alice@example.com' });
|
|
143
|
+
*/
|
|
144
|
+
async requestPasswordReset(payload, opts) {
|
|
145
|
+
return this.http.post(`${this.path}/password/reset/request`, payload, opts);
|
|
146
|
+
}
|
|
147
|
+
// ── Password: reset confirm ────────────────────────────────────────────────
|
|
148
|
+
/**
|
|
149
|
+
* Confirm a password reset using the token from the reset email.
|
|
150
|
+
*
|
|
151
|
+
* @example
|
|
152
|
+
* await db.auth.confirmPasswordReset({ resetToken: 'tok_...', newPassword: 'New@Pass2' });
|
|
153
|
+
*/
|
|
154
|
+
async confirmPasswordReset(payload, opts) {
|
|
155
|
+
return this.http.post(`${this.path}/password/reset/confirm`, payload, opts);
|
|
156
|
+
}
|
|
157
|
+
// ── Email: verify request ──────────────────────────────────────────────────
|
|
158
|
+
/**
|
|
159
|
+
* Send a verification email to the user.
|
|
160
|
+
*
|
|
161
|
+
* @example
|
|
162
|
+
* await db.auth.requestEmailVerification({ userId: 'user_abc' });
|
|
163
|
+
*/
|
|
164
|
+
async requestEmailVerification(payload, opts) {
|
|
165
|
+
return this.http.post(`${this.path}/email/verify/request`, payload, opts);
|
|
166
|
+
}
|
|
167
|
+
// ── Email: verify confirm ──────────────────────────────────────────────────
|
|
168
|
+
/**
|
|
169
|
+
* Confirm email address using the token from the verification email.
|
|
170
|
+
*
|
|
171
|
+
* @example
|
|
172
|
+
* await db.auth.confirmEmailVerification({ verifyToken: 'tok_...' });
|
|
173
|
+
*/
|
|
174
|
+
async confirmEmailVerification(payload, opts) {
|
|
175
|
+
return this.http.post(`${this.path}/email/verify/confirm`, payload, opts);
|
|
176
|
+
}
|
|
177
|
+
// ── Account: lock ──────────────────────────────────────────────────────────
|
|
178
|
+
/**
|
|
179
|
+
* Lock a user account for a given duration (default: 15 min).
|
|
180
|
+
*
|
|
181
|
+
* @example
|
|
182
|
+
* await db.auth.lockAccount({ userId: 'user_abc', duration: 30 * 60 * 1000 });
|
|
183
|
+
*/
|
|
184
|
+
async lockAccount(payload, opts) {
|
|
185
|
+
return this.http.post(`${this.path}/account/lock`, payload, opts);
|
|
186
|
+
}
|
|
187
|
+
// ── Account: unlock ────────────────────────────────────────────────────────
|
|
188
|
+
/**
|
|
189
|
+
* Unlock a previously locked user account.
|
|
190
|
+
*
|
|
191
|
+
* @example
|
|
192
|
+
* await db.auth.unlockAccount('user_abc');
|
|
193
|
+
*/
|
|
194
|
+
async unlockAccount(userId, opts) {
|
|
195
|
+
return this.http.post(`${this.path}/account/unlock`, { userId }, opts);
|
|
196
|
+
}
|
|
197
|
+
// ── Helpers ────────────────────────────────────────────────────────────────
|
|
198
|
+
/**
|
|
199
|
+
* Fetch all users, automatically following cursors.
|
|
200
|
+
*
|
|
201
|
+
* @example
|
|
202
|
+
* const users = await db.auth.listAllUsers();
|
|
203
|
+
*/
|
|
204
|
+
async listAllUsers(opts) {
|
|
205
|
+
const all = [];
|
|
206
|
+
let cursor = null;
|
|
207
|
+
do {
|
|
208
|
+
const result = await this.listUsers(cursor ? { cursor, ...opts } : { ...opts });
|
|
209
|
+
all.push(...result.data);
|
|
210
|
+
cursor = result.meta.nextCursor ?? null;
|
|
211
|
+
} while (cursor);
|
|
212
|
+
return all;
|
|
213
|
+
}
|
|
214
|
+
};
|
|
215
|
+
|
|
216
|
+
export { AuthClient };
|
|
217
|
+
//# sourceMappingURL=index.mjs.map
|
|
218
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/auth/client.ts"],"names":[],"mappings":";AAwBO,IAAM,aAAN,MAAiB;AAAA,EACtB,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAEhD,IAAY,IAAA,GAAO;AACjB,IAAA,OAAO,CAAA,MAAA,EAAS,IAAA,CAAK,IAAA,CAAK,SAAS,CAAA,CAAA;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,MAAM,MAAA,CAAO,OAAA,EAAwB,IAAA,EAAgD;AACnF,IAAA,OAAO,IAAA,CAAK,KAAK,IAAA,CAAqB,CAAA,EAAG,KAAK,IAAI,CAAA,OAAA,CAAA,EAAW,SAAS,IAAI,CAAA;AAAA,EAC5E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,MAAA,CAAO,OAAA,EAAwB,IAAA,EAAgD;AACnF,IAAA,OAAO,IAAA,CAAK,KAAK,IAAA,CAAqB,CAAA,EAAG,KAAK,IAAI,CAAA,OAAA,CAAA,EAAW,SAAS,IAAI,CAAA;AAAA,EAC5E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAM,OAAA,CAAQ,OAAA,EAAyB,IAAA,EAAoE;AACzG,IAAA,OAAO,IAAA,CAAK,KAAK,IAAA,CAAK,CAAA,EAAG,KAAK,IAAI,CAAA,QAAA,CAAA,EAAY,SAAS,IAAI,CAAA;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,MAAM,eAAA,CAAgB,SAAA,EAAmB,IAAA,EAAyD;AAChG,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAA8B,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,iBAAA,CAAA,EAAqB,EAAE,SAAA,EAAU,EAAG,IAAI,CAAA;AAAA,EACrG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,cAAA,CAAe,YAAA,EAAsB,IAAA,EAAwD;AACjG,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAA6B,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,gBAAA,CAAA,EAAoB,EAAE,YAAA,EAAa,EAAG,IAAI,CAAA;AAAA,EACtG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,OAAA,CAAQ,MAAA,EAAgB,IAAA,EAAiD;AAC7E,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAqB,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,KAAA,CAAA,EAAS,EAAE,MAAA,EAAO,EAAG,IAAI,CAAA;AAAA,EAC7E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,UAAU,OAAA,EAA4F;AAC1G,IAAA,MAAM,MAAA,GAAuE;AAAA,MAC3E,OAAO,OAAA,EAAS;AAAA,KAClB;AACA,IAAA,IAAI,OAAA,EAAS,MAAA,EAAQ,MAAA,CAAO,QAAQ,IAAI,OAAA,CAAQ,MAAA;AAChD,IAAA,OAAO,IAAA,CAAK,KAAK,GAAA,CAAuB,CAAA,EAAG,KAAK,IAAI,CAAA,MAAA,CAAA,EAAU,QAAQ,OAAO,CAAA;AAAA,EAC/E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,UAAA,CAAW,OAAA,EAA4B,IAAA,EAAoD;AAC/F,IAAA,OAAO,IAAA,CAAK,KAAK,KAAA,CAA0B,CAAA,EAAG,KAAK,IAAI,CAAA,KAAA,CAAA,EAAS,SAAS,IAAI,CAAA;AAAA,EAC/E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,UAAA,CAAW,MAAA,EAAgB,IAAA,EAAoE;AACnG,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,KAAA,CAAA,EAAS,EAAE,MAAA,EAAO,EAAG,IAAI,CAAA;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,MAAM,cAAA,CAAe,OAAA,EAAgC,IAAA,EAAoE;AACvH,IAAA,OAAO,IAAA,CAAK,KAAK,IAAA,CAAK,CAAA,EAAG,KAAK,IAAI,CAAA,gBAAA,CAAA,EAAoB,SAAS,IAAI,CAAA;AAAA,EACrE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,oBAAA,CAAqB,OAAA,EAAsC,IAAA,EAAoE;AACnI,IAAA,OAAO,IAAA,CAAK,KAAK,IAAA,CAAK,CAAA,EAAG,KAAK,IAAI,CAAA,uBAAA,CAAA,EAA2B,SAAS,IAAI,CAAA;AAAA,EAC5E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,oBAAA,CAAqB,OAAA,EAAsC,IAAA,EAAoE;AACnI,IAAA,OAAO,IAAA,CAAK,KAAK,IAAA,CAAK,CAAA,EAAG,KAAK,IAAI,CAAA,uBAAA,CAAA,EAA2B,SAAS,IAAI,CAAA;AAAA,EAC5E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,wBAAA,CAAyB,OAAA,EAAoC,IAAA,EAAoE;AACrI,IAAA,OAAO,IAAA,CAAK,KAAK,IAAA,CAAK,CAAA,EAAG,KAAK,IAAI,CAAA,qBAAA,CAAA,EAAyB,SAAS,IAAI,CAAA;AAAA,EAC1E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,wBAAA,CAAyB,OAAA,EAAoC,IAAA,EAAoE;AACrI,IAAA,OAAO,IAAA,CAAK,KAAK,IAAA,CAAK,CAAA,EAAG,KAAK,IAAI,CAAA,qBAAA,CAAA,EAAyB,SAAS,IAAI,CAAA;AAAA,EAC1E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,WAAA,CAAY,OAAA,EAA6B,IAAA,EAAqD;AAClG,IAAA,OAAO,IAAA,CAAK,KAAK,IAAA,CAA0B,CAAA,EAAG,KAAK,IAAI,CAAA,aAAA,CAAA,EAAiB,SAAS,IAAI,CAAA;AAAA,EACvF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,aAAA,CAAc,MAAA,EAAgB,IAAA,EAAoE;AACtG,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,eAAA,CAAA,EAAmB,EAAE,MAAA,EAAO,EAAG,IAAI,CAAA;AAAA,EACvE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,aAAa,IAAA,EAA4C;AAC7D,IAAA,MAAM,MAAkB,EAAC;AACzB,IAAA,IAAI,MAAA,GAAwB,IAAA;AAE5B,IAAA,GAAG;AACD,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,SAAA,CAAU,MAAA,GAAS,EAAE,MAAA,EAAQ,GAAG,IAAA,EAAK,GAAI,EAAE,GAAG,MAAM,CAAA;AAC9E,MAAA,GAAA,CAAI,IAAA,CAAK,GAAG,MAAA,CAAO,IAAI,CAAA;AACvB,MAAA,MAAA,GAAS,MAAA,CAAO,KAAK,UAAA,IAAc,IAAA;AAAA,IACrC,CAAA,QAAS,MAAA;AAET,IAAA,OAAO,GAAA;AAAA,EACT;AACF","file":"index.mjs","sourcesContent":["import type { HttpClient } from '../utils/http.js';\nimport type {\n SignUpPayload,\n SignUpResponse,\n SignInPayload,\n SignInResponse,\n SignOutPayload,\n ValidateSessionResponse,\n RefreshSessionResponse,\n GetUserResponse,\n ListUsersResponse,\n UpdateUserPayload,\n UpdateUserResponse,\n PasswordChangePayload,\n PasswordResetRequestPayload,\n PasswordResetConfirmPayload,\n EmailVerifyRequestPayload,\n EmailVerifyConfirmPayload,\n AccountLockPayload,\n AccountLockResponse,\n AuthUser,\n RequestOptions,\n} from '../types/index.js';\n\nexport class AuthClient {\n constructor(private readonly http: HttpClient) {}\n\n private get path() {\n return `/auth/${this.http.bucketKey}`;\n }\n\n // ── Sign-up ────────────────────────────────────────────────────────────────\n\n /**\n * Create a new user account. Returns the user and a session immediately.\n *\n * @example\n * const { data, session } = await db.auth.signUp({\n * email: 'alice@example.com',\n * password: 'Str0ngP@ss!',\n * fullName: 'Alice Smith',\n * });\n * // Store session.sessionId and session.refreshToken in your app\n */\n async signUp(payload: SignUpPayload, opts?: RequestOptions): Promise<SignUpResponse> {\n return this.http.post<SignUpResponse>(`${this.path}/signup`, payload, opts);\n }\n\n // ── Sign-in ────────────────────────────────────────────────────────────────\n\n /**\n * Authenticate with email + password. Returns user data and a new session.\n *\n * @example\n * const { data, session } = await db.auth.signIn({\n * email: 'alice@example.com',\n * password: 'Str0ngP@ss!',\n * });\n */\n async signIn(payload: SignInPayload, opts?: RequestOptions): Promise<SignInResponse> {\n return this.http.post<SignInResponse>(`${this.path}/signin`, payload, opts);\n }\n\n // ── Sign-out ───────────────────────────────────────────────────────────────\n\n /**\n * Revoke a session (or all sessions for a user).\n *\n * @example\n * // Single device\n * await db.auth.signOut({ sessionId: 'sess_...' });\n *\n * // All devices\n * await db.auth.signOut({ allDevices: true, userId: 'user_...' });\n */\n async signOut(payload: SignOutPayload, opts?: RequestOptions): Promise<{ success: true; message: string }> {\n return this.http.post(`${this.path}/signout`, payload, opts);\n }\n\n // ── Session: validate ──────────────────────────────────────────────────────\n\n /**\n * Validate a session token — use this on every protected request in your backend.\n *\n * @example\n * try {\n * const { data } = await db.auth.validateSession(sessionId);\n * // data is the authenticated user\n * } catch (err) {\n * // Session expired or invalid\n * }\n */\n async validateSession(sessionId: string, opts?: RequestOptions): Promise<ValidateSessionResponse> {\n return this.http.post<ValidateSessionResponse>(`${this.path}/session/validate`, { sessionId }, opts);\n }\n\n // ── Session: refresh ───────────────────────────────────────────────────────\n\n /**\n * Exchange a refresh token for a new session (rotation).\n * The old session is revoked.\n *\n * @example\n * const { session } = await db.auth.refreshSession(refreshToken);\n */\n async refreshSession(refreshToken: string, opts?: RequestOptions): Promise<RefreshSessionResponse> {\n return this.http.post<RefreshSessionResponse>(`${this.path}/session/refresh`, { refreshToken }, opts);\n }\n\n // ── User: get ──────────────────────────────────────────────────────────────\n\n /**\n * Fetch a user by their ID.\n *\n * @example\n * const { data } = await db.auth.getUser('user_abc123');\n */\n async getUser(userId: string, opts?: RequestOptions): Promise<GetUserResponse> {\n return this.http.get<GetUserResponse>(`${this.path}/user`, { userId }, opts);\n }\n\n // ── User: list ─────────────────────────────────────────────────────────────\n\n /**\n * List users with cursor-based pagination.\n *\n * @example\n * const { data, meta } = await db.auth.listUsers({ limit: 50 });\n */\n async listUsers(options?: { limit?: number; cursor?: string } & RequestOptions): Promise<ListUsersResponse> {\n const params: Record<string, string | number | boolean | undefined | null> = {\n limit: options?.limit,\n };\n if (options?.cursor) params['cursor'] = options.cursor;\n return this.http.get<ListUsersResponse>(`${this.path}/users`, params, options);\n }\n\n // ── User: update ───────────────────────────────────────────────────────────\n\n /**\n * Update user profile fields.\n *\n * @example\n * await db.auth.updateUser({ userId: 'user_abc', updates: { fullName: 'Bob Smith' } });\n */\n async updateUser(payload: UpdateUserPayload, opts?: RequestOptions): Promise<UpdateUserResponse> {\n return this.http.patch<UpdateUserResponse>(`${this.path}/user`, payload, opts);\n }\n\n // ── User: delete ───────────────────────────────────────────────────────────\n\n /**\n * Soft-delete a user. All their sessions are revoked automatically.\n *\n * @example\n * await db.auth.deleteUser('user_abc123');\n */\n async deleteUser(userId: string, opts?: RequestOptions): Promise<{ success: true; message: string }> {\n return this.http.delete(`${this.path}/user`, { userId }, opts);\n }\n\n // ── Password: change ───────────────────────────────────────────────────────\n\n /**\n * Change password for a signed-in user (requires old password).\n * All sessions are revoked after success.\n *\n * @example\n * await db.auth.changePassword({\n * userId: 'user_abc',\n * oldPassword: 'Old@Pass1',\n * newPassword: 'New@Pass2',\n * });\n */\n async changePassword(payload: PasswordChangePayload, opts?: RequestOptions): Promise<{ success: true; message: string }> {\n return this.http.post(`${this.path}/password/change`, payload, opts);\n }\n\n // ── Password: reset request ────────────────────────────────────────────────\n\n /**\n * Request a password reset email.\n * Always returns success to prevent email enumeration.\n *\n * @example\n * await db.auth.requestPasswordReset({ email: 'alice@example.com' });\n */\n async requestPasswordReset(payload: PasswordResetRequestPayload, opts?: RequestOptions): Promise<{ success: true; message: string }> {\n return this.http.post(`${this.path}/password/reset/request`, payload, opts);\n }\n\n // ── Password: reset confirm ────────────────────────────────────────────────\n\n /**\n * Confirm a password reset using the token from the reset email.\n *\n * @example\n * await db.auth.confirmPasswordReset({ resetToken: 'tok_...', newPassword: 'New@Pass2' });\n */\n async confirmPasswordReset(payload: PasswordResetConfirmPayload, opts?: RequestOptions): Promise<{ success: true; message: string }> {\n return this.http.post(`${this.path}/password/reset/confirm`, payload, opts);\n }\n\n // ── Email: verify request ──────────────────────────────────────────────────\n\n /**\n * Send a verification email to the user.\n *\n * @example\n * await db.auth.requestEmailVerification({ userId: 'user_abc' });\n */\n async requestEmailVerification(payload: EmailVerifyRequestPayload, opts?: RequestOptions): Promise<{ success: true; message: string }> {\n return this.http.post(`${this.path}/email/verify/request`, payload, opts);\n }\n\n // ── Email: verify confirm ──────────────────────────────────────────────────\n\n /**\n * Confirm email address using the token from the verification email.\n *\n * @example\n * await db.auth.confirmEmailVerification({ verifyToken: 'tok_...' });\n */\n async confirmEmailVerification(payload: EmailVerifyConfirmPayload, opts?: RequestOptions): Promise<{ success: true; message: string }> {\n return this.http.post(`${this.path}/email/verify/confirm`, payload, opts);\n }\n\n // ── Account: lock ──────────────────────────────────────────────────────────\n\n /**\n * Lock a user account for a given duration (default: 15 min).\n *\n * @example\n * await db.auth.lockAccount({ userId: 'user_abc', duration: 30 * 60 * 1000 });\n */\n async lockAccount(payload: AccountLockPayload, opts?: RequestOptions): Promise<AccountLockResponse> {\n return this.http.post<AccountLockResponse>(`${this.path}/account/lock`, payload, opts);\n }\n\n // ── Account: unlock ────────────────────────────────────────────────────────\n\n /**\n * Unlock a previously locked user account.\n *\n * @example\n * await db.auth.unlockAccount('user_abc');\n */\n async unlockAccount(userId: string, opts?: RequestOptions): Promise<{ success: true; message: string }> {\n return this.http.post(`${this.path}/account/unlock`, { userId }, opts);\n }\n\n // ── Helpers ────────────────────────────────────────────────────────────────\n\n /**\n * Fetch all users, automatically following cursors.\n *\n * @example\n * const users = await db.auth.listAllUsers();\n */\n async listAllUsers(opts?: RequestOptions): Promise<AuthUser[]> {\n const all: AuthUser[] = [];\n let cursor: string | null = null;\n\n do {\n const result = await this.listUsers(cursor ? { cursor, ...opts } : { ...opts });\n all.push(...result.data);\n cursor = result.meta.nextCursor ?? null;\n } while (cursor);\n\n return all;\n }\n}\n"]}
|