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.
@@ -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":"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","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"]}