@tenxyte/core 0.1.5

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/dist/index.cjs ADDED
@@ -0,0 +1,497 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ AuthModule: () => AuthModule,
24
+ RbacModule: () => RbacModule,
25
+ SecurityModule: () => SecurityModule,
26
+ TenxyteClient: () => TenxyteClient,
27
+ TenxyteHttpClient: () => TenxyteHttpClient,
28
+ UserModule: () => UserModule
29
+ });
30
+ module.exports = __toCommonJS(index_exports);
31
+
32
+ // src/http/client.ts
33
+ var TenxyteHttpClient = class {
34
+ baseUrl;
35
+ defaultHeaders;
36
+ // Interceptors
37
+ requestInterceptors = [];
38
+ responseInterceptors = [];
39
+ constructor(options) {
40
+ this.baseUrl = options.baseUrl.replace(/\/$/, "");
41
+ this.defaultHeaders = {
42
+ "Content-Type": "application/json",
43
+ Accept: "application/json",
44
+ ...options.headers
45
+ };
46
+ }
47
+ // Interceptor Registration
48
+ addRequestInterceptor(interceptor) {
49
+ this.requestInterceptors.push(interceptor);
50
+ }
51
+ addResponseInterceptor(interceptor) {
52
+ this.responseInterceptors.push(interceptor);
53
+ }
54
+ /**
55
+ * Main request method wrapping fetch
56
+ */
57
+ async request(endpoint, config = {}) {
58
+ const urlStr = endpoint.startsWith("http") ? endpoint : `${this.baseUrl}${endpoint.startsWith("/") ? "" : "/"}${endpoint}`;
59
+ let urlObj = new URL(urlStr);
60
+ if (config.params) {
61
+ Object.entries(config.params).forEach(([key, value]) => {
62
+ if (value !== void 0 && value !== null) {
63
+ urlObj.searchParams.append(key, String(value));
64
+ }
65
+ });
66
+ }
67
+ let requestContext = {
68
+ url: urlObj.toString(),
69
+ ...config,
70
+ headers: { ...this.defaultHeaders, ...config.headers || {} }
71
+ };
72
+ if (typeof FormData !== "undefined" && requestContext.body instanceof FormData) {
73
+ const headers = requestContext.headers;
74
+ delete headers["Content-Type"];
75
+ delete headers["content-type"];
76
+ } else if (requestContext.body && typeof requestContext.body === "object") {
77
+ const contentType = requestContext.headers["Content-Type"] || "";
78
+ if (contentType.toLowerCase().includes("application/json")) {
79
+ requestContext.body = JSON.stringify(requestContext.body);
80
+ }
81
+ }
82
+ for (const interceptor of this.requestInterceptors) {
83
+ requestContext = await interceptor(requestContext);
84
+ }
85
+ const { url, ...fetchConfig } = requestContext;
86
+ try {
87
+ let response = await fetch(url, fetchConfig);
88
+ for (const interceptor of this.responseInterceptors) {
89
+ response = await interceptor(response, { url, config: fetchConfig });
90
+ }
91
+ if (!response.ok) {
92
+ throw await this.normalizeError(response);
93
+ }
94
+ if (response.status === 204) {
95
+ return {};
96
+ }
97
+ const contentType = response.headers.get("content-type");
98
+ if (contentType && contentType.includes("application/json")) {
99
+ return await response.json();
100
+ }
101
+ return await response.text();
102
+ } catch (error) {
103
+ if (error && error.code) {
104
+ throw error;
105
+ }
106
+ throw {
107
+ error: error.message || "Network request failed",
108
+ code: "NETWORK_ERROR",
109
+ details: String(error)
110
+ };
111
+ }
112
+ }
113
+ async normalizeError(response) {
114
+ try {
115
+ const body = await response.json();
116
+ return {
117
+ error: body.error || body.detail || "API request failed",
118
+ code: body.code || `HTTP_${response.status}`,
119
+ details: body.details || body,
120
+ retry_after: response.headers.has("Retry-After") ? parseInt(response.headers.get("Retry-After"), 10) : void 0
121
+ };
122
+ } catch (e) {
123
+ return {
124
+ error: `HTTP Error ${response.status}: ${response.statusText}`,
125
+ code: `HTTP_${response.status}`
126
+ };
127
+ }
128
+ }
129
+ // Convenience methods
130
+ get(endpoint, config) {
131
+ return this.request(endpoint, { ...config, method: "GET" });
132
+ }
133
+ post(endpoint, data, config) {
134
+ return this.request(endpoint, { ...config, method: "POST", body: data });
135
+ }
136
+ put(endpoint, data, config) {
137
+ return this.request(endpoint, { ...config, method: "PUT", body: data });
138
+ }
139
+ patch(endpoint, data, config) {
140
+ return this.request(endpoint, { ...config, method: "PATCH", body: data });
141
+ }
142
+ delete(endpoint, config) {
143
+ return this.request(endpoint, { ...config, method: "DELETE" });
144
+ }
145
+ };
146
+
147
+ // src/modules/auth.ts
148
+ var AuthModule = class {
149
+ constructor(client) {
150
+ this.client = client;
151
+ }
152
+ /**
153
+ * Authenticate user with email and password
154
+ */
155
+ async loginWithEmail(data) {
156
+ return this.client.post("/api/v1/auth/login/email/", data);
157
+ }
158
+ /**
159
+ * Authenticate user with international phone number and password
160
+ */
161
+ async loginWithPhone(data) {
162
+ return this.client.post("/api/v1/auth/login/phone/", data);
163
+ }
164
+ /**
165
+ * Register a new user
166
+ */
167
+ async register(data) {
168
+ return this.client.post("/api/v1/auth/register/", data);
169
+ }
170
+ /**
171
+ * Logout from the current session
172
+ */
173
+ async logout(refreshToken) {
174
+ return this.client.post("/api/v1/auth/logout/", { refresh_token: refreshToken });
175
+ }
176
+ /**
177
+ * Logout from all sessions (revokes all refresh tokens)
178
+ */
179
+ async logoutAll() {
180
+ return this.client.post("/api/v1/auth/logout/all/");
181
+ }
182
+ /**
183
+ * Request a magic link for sign-in
184
+ */
185
+ async requestMagicLink(data) {
186
+ return this.client.post("/api/v1/auth/magic-link/request/", data);
187
+ }
188
+ /**
189
+ * Verify a magic link token
190
+ */
191
+ async verifyMagicLink(token) {
192
+ return this.client.get(`/api/v1/auth/magic-link/verify/`, { params: { token } });
193
+ }
194
+ /**
195
+ * Perform OAuth2 Social Authentication (e.g. Google, GitHub)
196
+ */
197
+ async loginWithSocial(provider, data) {
198
+ return this.client.post(`/api/v1/auth/social/${provider}/`, data);
199
+ }
200
+ /**
201
+ * Handle Social Auth Callback (authorization code flow)
202
+ */
203
+ async handleSocialCallback(provider, code, redirectUri) {
204
+ return this.client.get(`/api/v1/auth/social/${provider}/callback/`, {
205
+ params: { code, redirect_uri: redirectUri }
206
+ });
207
+ }
208
+ };
209
+
210
+ // src/modules/security.ts
211
+ var SecurityModule = class {
212
+ constructor(client) {
213
+ this.client = client;
214
+ }
215
+ // --- OTP Verification --- //
216
+ async requestOtp(data) {
217
+ return this.client.post("/api/v1/auth/otp/request/", data);
218
+ }
219
+ async verifyOtpEmail(data) {
220
+ return this.client.post("/api/v1/auth/otp/verify/email/", data);
221
+ }
222
+ async verifyOtpPhone(data) {
223
+ return this.client.post("/api/v1/auth/otp/verify/phone/", data);
224
+ }
225
+ // --- TOTP / 2FA --- //
226
+ async get2FAStatus() {
227
+ return this.client.get("/api/v1/auth/2fa/status/");
228
+ }
229
+ async setup2FA() {
230
+ return this.client.post("/api/v1/auth/2fa/setup/");
231
+ }
232
+ async confirm2FA(totp_code) {
233
+ return this.client.post("/api/v1/auth/2fa/confirm/", { totp_code });
234
+ }
235
+ async disable2FA(totp_code, password) {
236
+ return this.client.post("/api/v1/auth/2fa/disable/", { totp_code, password });
237
+ }
238
+ async regenerateBackupCodes(totp_code) {
239
+ return this.client.post("/api/v1/auth/2fa/backup-codes/", { totp_code });
240
+ }
241
+ // --- Password Management --- //
242
+ async resetPasswordRequest(data) {
243
+ return this.client.post("/api/v1/auth/password/reset/request/", data);
244
+ }
245
+ async resetPasswordConfirm(data) {
246
+ return this.client.post("/api/v1/auth/password/reset/confirm/", data);
247
+ }
248
+ async changePassword(data) {
249
+ return this.client.post("/api/v1/auth/password/change/", data);
250
+ }
251
+ async checkPasswordStrength(data) {
252
+ return this.client.post("/api/v1/auth/password/strength/", data);
253
+ }
254
+ async getPasswordRequirements() {
255
+ return this.client.get("/api/v1/auth/password/requirements/");
256
+ }
257
+ // --- WebAuthn / Passkeys --- //
258
+ async registerWebAuthnBegin() {
259
+ return this.client.post("/api/v1/auth/webauthn/register/begin/");
260
+ }
261
+ async registerWebAuthnComplete(data) {
262
+ return this.client.post("/api/v1/auth/webauthn/register/complete/", data);
263
+ }
264
+ async authenticateWebAuthnBegin(data) {
265
+ return this.client.post("/api/v1/auth/webauthn/authenticate/begin/", data || {});
266
+ }
267
+ async authenticateWebAuthnComplete(data) {
268
+ return this.client.post("/api/v1/auth/webauthn/authenticate/complete/", data);
269
+ }
270
+ async listWebAuthnCredentials() {
271
+ return this.client.get("/api/v1/auth/webauthn/credentials/");
272
+ }
273
+ async deleteWebAuthnCredential(credentialId) {
274
+ return this.client.delete(`/api/v1/auth/webauthn/credentials/${credentialId}/`);
275
+ }
276
+ };
277
+
278
+ // src/utils/jwt.ts
279
+ function decodeJwt(token) {
280
+ try {
281
+ const parts = token.split(".");
282
+ if (parts.length !== 3) {
283
+ return null;
284
+ }
285
+ let base64Url = parts[1];
286
+ if (!base64Url) return null;
287
+ let base64 = base64Url.replace(/-/g, "+").replace(/_/g, "/");
288
+ while (base64.length % 4) {
289
+ base64 += "=";
290
+ }
291
+ const isBrowser = typeof window !== "undefined" && typeof window.atob === "function";
292
+ let jsonPayload;
293
+ if (isBrowser) {
294
+ jsonPayload = decodeURIComponent(
295
+ window.atob(base64).split("").map((c) => "%" + ("00" + c.charCodeAt(0).toString(16)).slice(-2)).join("")
296
+ );
297
+ } else {
298
+ jsonPayload = Buffer.from(base64, "base64").toString("utf8");
299
+ }
300
+ return JSON.parse(jsonPayload);
301
+ } catch (e) {
302
+ return null;
303
+ }
304
+ }
305
+
306
+ // src/modules/rbac.ts
307
+ var RbacModule = class {
308
+ constructor(client) {
309
+ this.client = client;
310
+ }
311
+ cachedToken = null;
312
+ /**
313
+ * Cache a token to use for parameter-less synchronous checks.
314
+ */
315
+ setToken(token) {
316
+ this.cachedToken = token;
317
+ }
318
+ getDecodedToken(token) {
319
+ const t = token || this.cachedToken;
320
+ if (!t) return null;
321
+ return decodeJwt(t);
322
+ }
323
+ // --- Synchronous Checks --- //
324
+ hasRole(role, token) {
325
+ const decoded = this.getDecodedToken(token);
326
+ if (!decoded?.roles) return false;
327
+ return decoded.roles.includes(role);
328
+ }
329
+ hasAnyRole(roles, token) {
330
+ const decoded = this.getDecodedToken(token);
331
+ if (!decoded?.roles) return false;
332
+ return roles.some((r) => decoded.roles.includes(r));
333
+ }
334
+ hasAllRoles(roles, token) {
335
+ const decoded = this.getDecodedToken(token);
336
+ if (!decoded?.roles) return false;
337
+ return roles.every((r) => decoded.roles.includes(r));
338
+ }
339
+ hasPermission(permission, token) {
340
+ const decoded = this.getDecodedToken(token);
341
+ if (!decoded?.permissions) return false;
342
+ return decoded.permissions.includes(permission);
343
+ }
344
+ hasAnyPermission(permissions, token) {
345
+ const decoded = this.getDecodedToken(token);
346
+ if (!decoded?.permissions) return false;
347
+ return permissions.some((p) => decoded.permissions.includes(p));
348
+ }
349
+ hasAllPermissions(permissions, token) {
350
+ const decoded = this.getDecodedToken(token);
351
+ if (!decoded?.permissions) return false;
352
+ return permissions.every((p) => decoded.permissions.includes(p));
353
+ }
354
+ // --- Roles CRUD --- //
355
+ async listRoles() {
356
+ return this.client.get("/api/v1/auth/roles/");
357
+ }
358
+ async createRole(data) {
359
+ return this.client.post("/api/v1/auth/roles/", data);
360
+ }
361
+ async getRole(roleId) {
362
+ return this.client.get(`/api/v1/auth/roles/${roleId}/`);
363
+ }
364
+ async updateRole(roleId, data) {
365
+ return this.client.put(`/api/v1/auth/roles/${roleId}/`, data);
366
+ }
367
+ async deleteRole(roleId) {
368
+ return this.client.delete(`/api/v1/auth/roles/${roleId}/`);
369
+ }
370
+ // --- Role Permissions Management --- //
371
+ async getRolePermissions(roleId) {
372
+ return this.client.get(`/api/v1/auth/roles/${roleId}/permissions/`);
373
+ }
374
+ async addPermissionsToRole(roleId, permission_codes) {
375
+ return this.client.post(`/api/v1/auth/roles/${roleId}/permissions/`, { permission_codes });
376
+ }
377
+ async removePermissionsFromRole(roleId, permission_codes) {
378
+ return this.client.delete(`/api/v1/auth/roles/${roleId}/permissions/`, {
379
+ // Note: DELETE request with body is supported via our fetch wrapper if enabled,
380
+ // or we might need to rely on query strings. The schema specifies body or query.
381
+ // Let's pass it in body via a custom config or URL params.
382
+ body: { permission_codes }
383
+ });
384
+ }
385
+ // --- Permissions CRUD --- //
386
+ async listPermissions() {
387
+ return this.client.get("/api/v1/auth/permissions/");
388
+ }
389
+ async createPermission(data) {
390
+ return this.client.post("/api/v1/auth/permissions/", data);
391
+ }
392
+ async getPermission(permissionId) {
393
+ return this.client.get(`/api/v1/auth/permissions/${permissionId}/`);
394
+ }
395
+ async updatePermission(permissionId, data) {
396
+ return this.client.put(`/api/v1/auth/permissions/${permissionId}/`, data);
397
+ }
398
+ async deletePermission(permissionId) {
399
+ return this.client.delete(`/api/v1/auth/permissions/${permissionId}/`);
400
+ }
401
+ // --- Direct Assignment (Users) --- //
402
+ async assignRoleToUser(userId, roleCode) {
403
+ return this.client.post(`/api/v1/auth/users/${userId}/roles/`, { role_code: roleCode });
404
+ }
405
+ async removeRoleFromUser(userId, roleCode) {
406
+ return this.client.delete(`/api/v1/auth/users/${userId}/roles/`, {
407
+ params: { role_code: roleCode }
408
+ });
409
+ }
410
+ async assignPermissionsToUser(userId, permissionCodes) {
411
+ return this.client.post(`/api/v1/auth/users/${userId}/permissions/`, { permission_codes: permissionCodes });
412
+ }
413
+ async removePermissionsFromUser(userId, permissionCodes) {
414
+ return this.client.delete(`/api/v1/auth/users/${userId}/permissions/`, {
415
+ body: { permission_codes: permissionCodes }
416
+ });
417
+ }
418
+ };
419
+
420
+ // src/modules/user.ts
421
+ var UserModule = class {
422
+ constructor(client) {
423
+ this.client = client;
424
+ }
425
+ // --- Standard Profile Actions --- //
426
+ async getProfile() {
427
+ return this.client.get("/api/v1/auth/me/");
428
+ }
429
+ async updateProfile(data) {
430
+ return this.client.patch("/api/v1/auth/me/", data);
431
+ }
432
+ /**
433
+ * Upload an avatar using FormData.
434
+ * Ensure the environment supports FormData (browser or Node.js v18+).
435
+ * @param formData The FormData object containing the 'avatar' field.
436
+ */
437
+ async uploadAvatar(formData) {
438
+ return this.client.patch("/api/v1/auth/me/", formData);
439
+ }
440
+ async deleteAccount(password, otpCode) {
441
+ return this.client.post("/api/v1/auth/request-account-deletion/", {
442
+ password,
443
+ otp_code: otpCode
444
+ });
445
+ }
446
+ // --- Admin Actions Mapping --- //
447
+ async listUsers(params) {
448
+ return this.client.get("/api/v1/auth/admin/users/", { params });
449
+ }
450
+ async getUser(userId) {
451
+ return this.client.get(`/api/v1/auth/admin/users/${userId}/`);
452
+ }
453
+ async adminUpdateUser(userId, data) {
454
+ return this.client.patch(`/api/v1/auth/admin/users/${userId}/`, data);
455
+ }
456
+ async adminDeleteUser(userId) {
457
+ return this.client.delete(`/api/v1/auth/admin/users/${userId}/`);
458
+ }
459
+ async banUser(userId, reason = "") {
460
+ return this.client.post(`/api/v1/auth/admin/users/${userId}/ban/`, { reason });
461
+ }
462
+ async unbanUser(userId) {
463
+ return this.client.post(`/api/v1/auth/admin/users/${userId}/unban/`);
464
+ }
465
+ async lockUser(userId, durationMinutes = 30, reason = "") {
466
+ return this.client.post(`/api/v1/auth/admin/users/${userId}/lock/`, { duration_minutes: durationMinutes, reason });
467
+ }
468
+ async unlockUser(userId) {
469
+ return this.client.post(`/api/v1/auth/admin/users/${userId}/unlock/`);
470
+ }
471
+ };
472
+
473
+ // src/client.ts
474
+ var TenxyteClient = class {
475
+ http;
476
+ auth;
477
+ security;
478
+ rbac;
479
+ user;
480
+ constructor(options) {
481
+ this.http = new TenxyteHttpClient(options);
482
+ this.auth = new AuthModule(this.http);
483
+ this.security = new SecurityModule(this.http);
484
+ this.rbac = new RbacModule(this.http);
485
+ this.user = new UserModule(this.http);
486
+ }
487
+ };
488
+ // Annotate the CommonJS export names for ESM import in node:
489
+ 0 && (module.exports = {
490
+ AuthModule,
491
+ RbacModule,
492
+ SecurityModule,
493
+ TenxyteClient,
494
+ TenxyteHttpClient,
495
+ UserModule
496
+ });
497
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/http/client.ts","../src/modules/auth.ts","../src/modules/security.ts","../src/utils/jwt.ts","../src/modules/rbac.ts","../src/modules/user.ts","../src/client.ts"],"sourcesContent":["export * from './client';\r\nexport * from './http/client';\r\nexport * from './modules/auth';\r\nexport * from './modules/security';\r\nexport * from './modules/rbac';\r\nexport * from './modules/user';\r\nexport * from './types';\r\n","import type { TenxyteError } from '../types';\r\n\r\nexport interface HttpClientOptions {\r\n baseUrl: string;\r\n timeoutMs?: number;\r\n headers?: Record<string, string>;\r\n}\r\n\r\nexport type RequestConfig = Omit<RequestInit, 'body' | 'headers'> & {\r\n body?: unknown;\r\n headers?: Record<string, string>;\r\n params?: Record<string, string | number | boolean>;\r\n};\r\n\r\n/**\r\n * Core HTTP Client underlying the SDK.\r\n * Handles JSON parsing, standard headers, simple request processing,\r\n * and normalizing errors into TenxyteError format.\r\n */\r\nexport class TenxyteHttpClient {\r\n private baseUrl: string;\r\n private defaultHeaders: Record<string, string>;\r\n\r\n // Interceptors\r\n private requestInterceptors: Array<(config: RequestConfig & { url: string }) => Promise<RequestConfig & { url: string }> | (RequestConfig & { url: string })> = [];\r\n private responseInterceptors: Array<(response: Response, request: { url: string; config: RequestConfig }) => Promise<Response> | Response> = [];\r\n\r\n constructor(options: HttpClientOptions) {\r\n this.baseUrl = options.baseUrl.replace(/\\/$/, ''); // Remove trailing slash\r\n this.defaultHeaders = {\r\n 'Content-Type': 'application/json',\r\n Accept: 'application/json',\r\n ...options.headers,\r\n };\r\n }\r\n\r\n // Interceptor Registration\r\n addRequestInterceptor(interceptor: typeof this.requestInterceptors[0]) {\r\n this.requestInterceptors.push(interceptor);\r\n }\r\n\r\n addResponseInterceptor(interceptor: typeof this.responseInterceptors[0]) {\r\n this.responseInterceptors.push(interceptor);\r\n }\r\n\r\n /**\r\n * Main request method wrapping fetch\r\n */\r\n async request<T>(endpoint: string, config: RequestConfig = {}): Promise<T> {\r\n const urlStr = endpoint.startsWith('http')\r\n ? endpoint\r\n : `${this.baseUrl}${endpoint.startsWith('/') ? '' : '/'}${endpoint}`;\r\n\r\n let urlObj = new URL(urlStr);\r\n\r\n if (config.params) {\r\n Object.entries(config.params).forEach(([key, value]) => {\r\n if (value !== undefined && value !== null) {\r\n urlObj.searchParams.append(key, String(value));\r\n }\r\n });\r\n }\r\n\r\n let requestContext: any = {\r\n url: urlObj.toString(),\r\n ...config,\r\n headers: { ...this.defaultHeaders, ...(config.headers || {}) } as Record<string, string>,\r\n };\r\n\r\n // Handle FormData implicitly for multipart requests\r\n if (typeof FormData !== 'undefined' && requestContext.body instanceof FormData) {\r\n const headers = requestContext.headers as Record<string, string>;\r\n // Explicitly remove Content-Type so fetch can auto-assign the multipart boundary\r\n delete headers['Content-Type'];\r\n delete headers['content-type'];\r\n } else if (requestContext.body && typeof requestContext.body === 'object') {\r\n const contentType = (requestContext.headers as Record<string, string>)['Content-Type'] || '';\r\n if (contentType.toLowerCase().includes('application/json')) {\r\n requestContext.body = JSON.stringify(requestContext.body);\r\n }\r\n }\r\n\r\n // Run Request Interceptors\r\n for (const interceptor of this.requestInterceptors) {\r\n requestContext = await interceptor(requestContext);\r\n }\r\n\r\n const { url, ...fetchConfig } = requestContext as any;\r\n\r\n try {\r\n let response = await fetch(url, fetchConfig as RequestInit);\r\n\r\n // Run Response Interceptors (e.g., token refresh logic)\r\n for (const interceptor of this.responseInterceptors) {\r\n response = await interceptor(response, { url, config: fetchConfig as RequestConfig });\r\n }\r\n\r\n if (!response.ok) {\r\n throw await this.normalizeError(response);\r\n }\r\n\r\n // Handle NoContent\r\n if (response.status === 204) {\r\n return {} as T;\r\n }\r\n\r\n const contentType = response.headers.get('content-type');\r\n if (contentType && contentType.includes('application/json')) {\r\n return (await response.json()) as T;\r\n }\r\n\r\n return (await response.text()) as unknown as T;\r\n } catch (error: any) {\r\n if (error && error.code) {\r\n throw error; // Already normalized\r\n }\r\n throw {\r\n error: error.message || 'Network request failed',\r\n code: 'NETWORK_ERROR' as unknown as import('../types').TenxyteErrorCode,\r\n details: String(error)\r\n } as TenxyteError;\r\n }\r\n }\r\n\r\n private async normalizeError(response: Response): Promise<TenxyteError> {\r\n try {\r\n const body = await response.json();\r\n return {\r\n error: body.error || body.detail || 'API request failed',\r\n code: body.code || `HTTP_${response.status}`,\r\n details: body.details || body,\r\n retry_after: response.headers.has('Retry-After') ? parseInt(response.headers.get('Retry-After')!, 10) : undefined,\r\n } as TenxyteError;\r\n } catch (e) {\r\n return {\r\n error: `HTTP Error ${response.status}: ${response.statusText}`,\r\n code: `HTTP_${response.status}` as unknown as import('../types').TenxyteErrorCode,\r\n } as TenxyteError;\r\n }\r\n }\r\n\r\n // Convenience methods\r\n get<T>(endpoint: string, config?: Omit<RequestConfig, 'method' | 'body'>) {\r\n return this.request<T>(endpoint, { ...config, method: 'GET' });\r\n }\r\n\r\n post<T>(endpoint: string, data?: unknown, config?: Omit<RequestConfig, 'method' | 'body'>) {\r\n return this.request<T>(endpoint, { ...config, method: 'POST', body: data });\r\n }\r\n\r\n put<T>(endpoint: string, data?: unknown, config?: Omit<RequestConfig, 'method' | 'body'>) {\r\n return this.request<T>(endpoint, { ...config, method: 'PUT', body: data });\r\n }\r\n\r\n patch<T>(endpoint: string, data?: unknown, config?: Omit<RequestConfig, 'method' | 'body'>) {\r\n return this.request<T>(endpoint, { ...config, method: 'PATCH', body: data });\r\n }\r\n\r\n delete<T>(endpoint: string, config?: Omit<RequestConfig, 'method' | 'body'>) {\r\n return this.request<T>(endpoint, { ...config, method: 'DELETE' });\r\n }\r\n}\r\n","import { TenxyteHttpClient } from '../http/client';\r\nimport { TokenPair, GeneratedSchema } from '../types';\r\n\r\nexport interface LoginEmailOptions {\r\n totp_code?: string;\r\n}\r\n\r\nexport interface LoginPhoneOptions {\r\n totp_code?: string;\r\n}\r\n\r\nexport type RegisterRequest = any;\r\n\r\nexport interface MagicLinkRequest {\r\n email: string;\r\n}\r\n\r\nexport interface SocialLoginRequest {\r\n access_token?: string;\r\n authorization_code?: string;\r\n id_token?: string;\r\n}\r\n\r\nexport class AuthModule {\r\n constructor(private client: TenxyteHttpClient) { }\r\n\r\n /**\r\n * Authenticate user with email and password\r\n */\r\n async loginWithEmail(\r\n data: GeneratedSchema['LoginEmail'],\r\n ): Promise<TokenPair> {\r\n return this.client.post<TokenPair>('/api/v1/auth/login/email/', data);\r\n }\r\n\r\n /**\r\n * Authenticate user with international phone number and password\r\n */\r\n async loginWithPhone(\r\n data: GeneratedSchema['LoginPhone'],\r\n ): Promise<TokenPair> {\r\n return this.client.post<TokenPair>('/api/v1/auth/login/phone/', data);\r\n }\r\n\r\n /**\r\n * Register a new user\r\n */\r\n async register(data: RegisterRequest): Promise<any> {\r\n return this.client.post<any>('/api/v1/auth/register/', data);\r\n }\r\n\r\n /**\r\n * Logout from the current session\r\n */\r\n async logout(refreshToken: string): Promise<void> {\r\n return this.client.post<void>('/api/v1/auth/logout/', { refresh_token: refreshToken });\r\n }\r\n\r\n /**\r\n * Logout from all sessions (revokes all refresh tokens)\r\n */\r\n async logoutAll(): Promise<void> {\r\n return this.client.post<void>('/api/v1/auth/logout/all/');\r\n }\r\n\r\n /**\r\n * Request a magic link for sign-in\r\n */\r\n async requestMagicLink(data: MagicLinkRequest): Promise<void> {\r\n return this.client.post<void>('/api/v1/auth/magic-link/request/', data);\r\n }\r\n\r\n /**\r\n * Verify a magic link token\r\n */\r\n async verifyMagicLink(token: string): Promise<TokenPair> {\r\n return this.client.get<TokenPair>(`/api/v1/auth/magic-link/verify/`, { params: { token } });\r\n }\r\n\r\n /**\r\n * Perform OAuth2 Social Authentication (e.g. Google, GitHub)\r\n */\r\n async loginWithSocial(provider: 'google' | 'github' | 'microsoft' | 'facebook', data: SocialLoginRequest): Promise<TokenPair> {\r\n return this.client.post<TokenPair>(`/api/v1/auth/social/${provider}/`, data);\r\n }\r\n\r\n /**\r\n * Handle Social Auth Callback (authorization code flow)\r\n */\r\n async handleSocialCallback(provider: 'google' | 'github' | 'microsoft' | 'facebook', code: string, redirectUri: string): Promise<TokenPair> {\r\n return this.client.get<TokenPair>(`/api/v1/auth/social/${provider}/callback/`, {\r\n params: { code, redirect_uri: redirectUri },\r\n });\r\n }\r\n}\r\n","import { TenxyteHttpClient } from '../http/client';\r\nimport { TokenPair } from '../types';\r\n\r\nexport interface OtpRequestParams {\r\n email?: string;\r\n phone_country_code?: string;\r\n phone_number?: string;\r\n type: 'email_verification' | 'phone_verification' | 'password_reset';\r\n}\r\n\r\nexport interface VerifyOtpEmailParams {\r\n email: string;\r\n code: string;\r\n}\r\n\r\nexport interface VerifyOtpPhoneParams {\r\n phone_country_code: string;\r\n phone_number: string;\r\n code: string;\r\n}\r\n\r\nexport interface Setup2FAResponse {\r\n qr_code_url: string;\r\n secret: string;\r\n backup_codes: string[];\r\n}\r\n\r\nexport interface WebAuthnRegisterBeginResponse {\r\n publicKey: any; // CredentialCreationOptions\r\n}\r\n\r\nexport interface WebAuthnAuthenticateBeginResponse {\r\n publicKey: any; // CredentialRequestOptions\r\n}\r\n\r\nexport class SecurityModule {\r\n constructor(private client: TenxyteHttpClient) { }\r\n\r\n // --- OTP Verification --- //\r\n\r\n async requestOtp(data: OtpRequestParams): Promise<void> {\r\n return this.client.post<void>('/api/v1/auth/otp/request/', data);\r\n }\r\n\r\n async verifyOtpEmail(data: VerifyOtpEmailParams): Promise<void> {\r\n return this.client.post<void>('/api/v1/auth/otp/verify/email/', data);\r\n }\r\n\r\n async verifyOtpPhone(data: VerifyOtpPhoneParams): Promise<void> {\r\n return this.client.post<void>('/api/v1/auth/otp/verify/phone/', data);\r\n }\r\n\r\n // --- TOTP / 2FA --- //\r\n\r\n async get2FAStatus(): Promise<{ is_enabled: boolean; backup_codes_remaining: number }> {\r\n return this.client.get('/api/v1/auth/2fa/status/');\r\n }\r\n\r\n async setup2FA(): Promise<Setup2FAResponse> {\r\n return this.client.post<Setup2FAResponse>('/api/v1/auth/2fa/setup/');\r\n }\r\n\r\n async confirm2FA(totp_code: string): Promise<void> {\r\n return this.client.post<void>('/api/v1/auth/2fa/confirm/', { totp_code });\r\n }\r\n\r\n async disable2FA(totp_code: string, password?: string): Promise<void> {\r\n return this.client.post<void>('/api/v1/auth/2fa/disable/', { totp_code, password });\r\n }\r\n\r\n async regenerateBackupCodes(totp_code: string): Promise<{ backup_codes: string[] }> {\r\n return this.client.post('/api/v1/auth/2fa/backup-codes/', { totp_code });\r\n }\r\n\r\n // --- Password Management --- //\r\n\r\n async resetPasswordRequest(data: { email?: string; phone_country_code?: string; phone_number?: string }): Promise<void> {\r\n return this.client.post<void>('/api/v1/auth/password/reset/request/', data);\r\n }\r\n\r\n async resetPasswordConfirm(data: { otp_code: string; new_password: string; email?: string; phone_country_code?: string; phone_number?: string }): Promise<void> {\r\n return this.client.post<void>('/api/v1/auth/password/reset/confirm/', data);\r\n }\r\n\r\n async changePassword(data: { current_password: string; new_password: string }): Promise<void> {\r\n return this.client.post<void>('/api/v1/auth/password/change/', data);\r\n }\r\n\r\n async checkPasswordStrength(data: { password: string; email?: string }): Promise<{ score: number; feedback: string[] }> {\r\n return this.client.post('/api/v1/auth/password/strength/', data);\r\n }\r\n\r\n async getPasswordRequirements(): Promise<any> {\r\n return this.client.get('/api/v1/auth/password/requirements/');\r\n }\r\n\r\n // --- WebAuthn / Passkeys --- //\r\n\r\n async registerWebAuthnBegin(): Promise<WebAuthnRegisterBeginResponse> {\r\n return this.client.post<WebAuthnRegisterBeginResponse>('/api/v1/auth/webauthn/register/begin/');\r\n }\r\n\r\n async registerWebAuthnComplete(data: any): Promise<void> {\r\n return this.client.post<void>('/api/v1/auth/webauthn/register/complete/', data);\r\n }\r\n\r\n async authenticateWebAuthnBegin(data?: { email?: string }): Promise<WebAuthnAuthenticateBeginResponse> {\r\n return this.client.post<WebAuthnAuthenticateBeginResponse>('/api/v1/auth/webauthn/authenticate/begin/', data || {});\r\n }\r\n\r\n async authenticateWebAuthnComplete(data: any): Promise<TokenPair> {\r\n return this.client.post<TokenPair>('/api/v1/auth/webauthn/authenticate/complete/', data);\r\n }\r\n\r\n async listWebAuthnCredentials(): Promise<any[]> {\r\n return this.client.get<any[]>('/api/v1/auth/webauthn/credentials/');\r\n }\r\n\r\n async deleteWebAuthnCredential(credentialId: string): Promise<void> {\r\n return this.client.delete<void>(`/api/v1/auth/webauthn/credentials/${credentialId}/`);\r\n }\r\n}\r\n","export interface DecodedTenxyteToken {\r\n exp?: number;\r\n iat?: number;\r\n sub?: string;\r\n roles?: string[];\r\n permissions?: string[];\r\n [key: string]: any;\r\n}\r\n\r\n/**\r\n * Decodes the payload of a JWT without verifying the signature.\r\n * Suitable for client-side routing and UI state.\r\n */\r\nexport function decodeJwt(token: string): DecodedTenxyteToken | null {\r\n try {\r\n const parts = token.split('.');\r\n if (parts.length !== 3) {\r\n return null;\r\n }\r\n\r\n let base64Url = parts[1];\r\n if (!base64Url) return null;\r\n\r\n let base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');\r\n\r\n // Pad with standard base64 padding\r\n while (base64.length % 4) {\r\n base64 += '=';\r\n }\r\n\r\n const isBrowser = typeof window !== 'undefined' && typeof window.atob === 'function';\r\n let jsonPayload: string;\r\n\r\n if (isBrowser) {\r\n // Browser decode\r\n jsonPayload = decodeURIComponent(\r\n window.atob(base64)\r\n .split('')\r\n .map((c) => '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2))\r\n .join('')\r\n );\r\n } else {\r\n // Node.js decode\r\n jsonPayload = Buffer.from(base64, 'base64').toString('utf8');\r\n }\r\n\r\n return JSON.parse(jsonPayload);\r\n } catch (e) {\r\n return null;\r\n }\r\n}\r\n","import { TenxyteHttpClient } from '../http/client';\r\nimport { decodeJwt, DecodedTenxyteToken } from '../utils/jwt';\r\n\r\nexport interface Role {\r\n id: string;\r\n name: string;\r\n description?: string;\r\n is_default?: boolean;\r\n permissions?: string[];\r\n}\r\n\r\nexport interface Permission {\r\n id: string;\r\n code: string;\r\n name: string;\r\n description?: string;\r\n}\r\n\r\nexport class RbacModule {\r\n private cachedToken: string | null = null;\r\n\r\n constructor(private client: TenxyteHttpClient) { }\r\n\r\n /**\r\n * Cache a token to use for parameter-less synchronous checks.\r\n */\r\n setToken(token: string | null) {\r\n this.cachedToken = token;\r\n }\r\n\r\n private getDecodedToken(token?: string): DecodedTenxyteToken | null {\r\n const t = token || this.cachedToken;\r\n if (!t) return null;\r\n return decodeJwt(t);\r\n }\r\n\r\n // --- Synchronous Checks --- //\r\n\r\n hasRole(role: string, token?: string): boolean {\r\n const decoded = this.getDecodedToken(token);\r\n if (!decoded?.roles) return false;\r\n return decoded.roles.includes(role);\r\n }\r\n\r\n hasAnyRole(roles: string[], token?: string): boolean {\r\n const decoded = this.getDecodedToken(token);\r\n if (!decoded?.roles) return false;\r\n return roles.some(r => decoded.roles!.includes(r));\r\n }\r\n\r\n hasAllRoles(roles: string[], token?: string): boolean {\r\n const decoded = this.getDecodedToken(token);\r\n if (!decoded?.roles) return false;\r\n return roles.every(r => decoded.roles!.includes(r));\r\n }\r\n\r\n hasPermission(permission: string, token?: string): boolean {\r\n const decoded = this.getDecodedToken(token);\r\n if (!decoded?.permissions) return false;\r\n // Check exact match or wildcard, assuming backend handles wildcard expansion in JWT\r\n return decoded.permissions.includes(permission);\r\n }\r\n\r\n hasAnyPermission(permissions: string[], token?: string): boolean {\r\n const decoded = this.getDecodedToken(token);\r\n if (!decoded?.permissions) return false;\r\n return permissions.some(p => decoded.permissions!.includes(p));\r\n }\r\n\r\n hasAllPermissions(permissions: string[], token?: string): boolean {\r\n const decoded = this.getDecodedToken(token);\r\n if (!decoded?.permissions) return false;\r\n return permissions.every(p => decoded.permissions!.includes(p));\r\n }\r\n\r\n // --- Roles CRUD --- //\r\n\r\n async listRoles(): Promise<Role[]> {\r\n return this.client.get<Role[]>('/api/v1/auth/roles/');\r\n }\r\n\r\n async createRole(data: { name: string; description?: string; permission_codes?: string[]; is_default?: boolean }): Promise<Role> {\r\n return this.client.post<Role>('/api/v1/auth/roles/', data);\r\n }\r\n\r\n async getRole(roleId: string): Promise<Role> {\r\n return this.client.get<Role>(`/api/v1/auth/roles/${roleId}/`);\r\n }\r\n\r\n async updateRole(roleId: string, data: { name?: string; description?: string; permission_codes?: string[]; is_default?: boolean }): Promise<Role> {\r\n return this.client.put<Role>(`/api/v1/auth/roles/${roleId}/`, data);\r\n }\r\n\r\n async deleteRole(roleId: string): Promise<void> {\r\n return this.client.delete<void>(`/api/v1/auth/roles/${roleId}/`);\r\n }\r\n\r\n // --- Role Permissions Management --- //\r\n\r\n async getRolePermissions(roleId: string): Promise<Permission[]> {\r\n return this.client.get<Permission[]>(`/api/v1/auth/roles/${roleId}/permissions/`);\r\n }\r\n\r\n async addPermissionsToRole(roleId: string, permission_codes: string[]): Promise<void> {\r\n return this.client.post<void>(`/api/v1/auth/roles/${roleId}/permissions/`, { permission_codes });\r\n }\r\n\r\n async removePermissionsFromRole(roleId: string, permission_codes: string[]): Promise<void> {\r\n return this.client.delete<void>(`/api/v1/auth/roles/${roleId}/permissions/`, {\r\n // Note: DELETE request with body is supported via our fetch wrapper if enabled,\r\n // or we might need to rely on query strings. The schema specifies body or query.\r\n // Let's pass it in body via a custom config or URL params.\r\n body: { permission_codes }\r\n } as any);\r\n }\r\n\r\n // --- Permissions CRUD --- //\r\n\r\n async listPermissions(): Promise<Permission[]> {\r\n return this.client.get<Permission[]>('/api/v1/auth/permissions/');\r\n }\r\n\r\n async createPermission(data: { code: string; name: string; description?: string; parent_code?: string }): Promise<Permission> {\r\n return this.client.post<Permission>('/api/v1/auth/permissions/', data);\r\n }\r\n\r\n async getPermission(permissionId: string): Promise<Permission> {\r\n return this.client.get<Permission>(`/api/v1/auth/permissions/${permissionId}/`);\r\n }\r\n\r\n async updatePermission(permissionId: string, data: { name?: string; description?: string }): Promise<Permission> {\r\n return this.client.put<Permission>(`/api/v1/auth/permissions/${permissionId}/`, data);\r\n }\r\n\r\n async deletePermission(permissionId: string): Promise<void> {\r\n return this.client.delete<void>(`/api/v1/auth/permissions/${permissionId}/`);\r\n }\r\n\r\n // --- Direct Assignment (Users) --- //\r\n\r\n async assignRoleToUser(userId: string, roleCode: string): Promise<void> {\r\n return this.client.post<void>(`/api/v1/auth/users/${userId}/roles/`, { role_code: roleCode });\r\n }\r\n\r\n async removeRoleFromUser(userId: string, roleCode: string): Promise<void> {\r\n return this.client.delete<void>(`/api/v1/auth/users/${userId}/roles/`, {\r\n params: { role_code: roleCode }\r\n });\r\n }\r\n\r\n async assignPermissionsToUser(userId: string, permissionCodes: string[]): Promise<void> {\r\n return this.client.post<void>(`/api/v1/auth/users/${userId}/permissions/`, { permission_codes: permissionCodes });\r\n }\r\n\r\n async removePermissionsFromUser(userId: string, permissionCodes: string[]): Promise<void> {\r\n return this.client.delete<void>(`/api/v1/auth/users/${userId}/permissions/`, {\r\n body: { permission_codes: permissionCodes }\r\n } as any);\r\n }\r\n}\r\n","import { TenxyteHttpClient } from '../http/client';\r\n\r\nexport interface UpdateProfileParams {\r\n first_name?: string;\r\n last_name?: string;\r\n [key: string]: any; // Allow custom metadata updates\r\n}\r\n\r\nexport interface AdminUpdateUserParams {\r\n first_name?: string;\r\n last_name?: string;\r\n is_active?: boolean;\r\n is_locked?: boolean;\r\n max_sessions?: number;\r\n max_devices?: number;\r\n}\r\n\r\nexport class UserModule {\r\n constructor(private client: TenxyteHttpClient) { }\r\n\r\n // --- Standard Profile Actions --- //\r\n\r\n async getProfile(): Promise<any> {\r\n return this.client.get('/api/v1/auth/me/');\r\n }\r\n\r\n async updateProfile(data: UpdateProfileParams): Promise<any> {\r\n return this.client.patch('/api/v1/auth/me/', data);\r\n }\r\n\r\n /**\r\n * Upload an avatar using FormData.\r\n * Ensure the environment supports FormData (browser or Node.js v18+).\r\n * @param formData The FormData object containing the 'avatar' field.\r\n */\r\n async uploadAvatar(formData: FormData): Promise<any> {\r\n return this.client.patch('/api/v1/auth/me/', formData);\r\n }\r\n\r\n async deleteAccount(password: string, otpCode?: string): Promise<void> {\r\n return this.client.post<void>('/api/v1/auth/request-account-deletion/', {\r\n password,\r\n otp_code: otpCode\r\n });\r\n }\r\n\r\n // --- Admin Actions Mapping --- //\r\n\r\n async listUsers(params?: Record<string, any>): Promise<any[]> {\r\n return this.client.get<any[]>('/api/v1/auth/admin/users/', { params });\r\n }\r\n\r\n async getUser(userId: string): Promise<any> {\r\n return this.client.get(`/api/v1/auth/admin/users/${userId}/`);\r\n }\r\n\r\n async adminUpdateUser(userId: string, data: AdminUpdateUserParams): Promise<any> {\r\n return this.client.patch(`/api/v1/auth/admin/users/${userId}/`, data);\r\n }\r\n\r\n async adminDeleteUser(userId: string): Promise<void> {\r\n return this.client.delete<void>(`/api/v1/auth/admin/users/${userId}/`);\r\n }\r\n\r\n async banUser(userId: string, reason: string = ''): Promise<void> {\r\n return this.client.post<void>(`/api/v1/auth/admin/users/${userId}/ban/`, { reason });\r\n }\r\n\r\n async unbanUser(userId: string): Promise<void> {\r\n return this.client.post<void>(`/api/v1/auth/admin/users/${userId}/unban/`);\r\n }\r\n\r\n async lockUser(userId: string, durationMinutes: number = 30, reason: string = ''): Promise<void> {\r\n return this.client.post<void>(`/api/v1/auth/admin/users/${userId}/lock/`, { duration_minutes: durationMinutes, reason });\r\n }\r\n\r\n async unlockUser(userId: string): Promise<void> {\r\n return this.client.post<void>(`/api/v1/auth/admin/users/${userId}/unlock/`);\r\n }\r\n}\r\n","import { TenxyteHttpClient, HttpClientOptions } from './http/client';\r\nimport { AuthModule } from './modules/auth';\r\nimport { SecurityModule } from './modules/security';\r\nimport { RbacModule } from './modules/rbac';\r\nimport { UserModule } from './modules/user';\r\n\r\nexport class TenxyteClient {\r\n public http: TenxyteHttpClient;\r\n public auth: AuthModule;\r\n public security: SecurityModule;\r\n public rbac: RbacModule;\r\n public user: UserModule;\r\n\r\n constructor(options: HttpClientOptions) {\r\n this.http = new TenxyteHttpClient(options);\r\n this.auth = new AuthModule(this.http);\r\n this.security = new SecurityModule(this.http);\r\n this.rbac = new RbacModule(this.http);\r\n this.user = new UserModule(this.http);\r\n }\r\n}\r\n"],"mappings":"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","names":[]}