@baasix/sdk 0.1.1 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +108 -1
- package/dist/client-BHbM3KOy.d.cts +95 -0
- package/dist/client-D67LK80v.d.ts +95 -0
- package/dist/index.cjs +24 -30
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +99 -3
- package/dist/index.d.ts +99 -3
- package/dist/index.js +24 -30
- package/dist/index.js.map +1 -1
- package/dist/modules/auth.cjs +24 -30
- package/dist/modules/auth.cjs.map +1 -1
- package/dist/modules/auth.d.cts +15 -14
- package/dist/modules/auth.d.ts +15 -14
- package/dist/modules/auth.js +24 -30
- package/dist/modules/auth.js.map +1 -1
- package/dist/modules/files.d.cts +4 -2
- package/dist/modules/files.d.ts +4 -2
- package/dist/modules/items.d.cts +4 -3
- package/dist/modules/items.d.ts +4 -3
- package/dist/modules/schemas.d.cts +4 -2
- package/dist/modules/schemas.d.ts +4 -2
- package/package.json +4 -1
- package/dist/client-DeXa-R9w.d.ts +0 -680
- package/dist/client-VT7NckyI.d.cts +0 -680
package/dist/modules/auth.cjs
CHANGED
|
@@ -178,6 +178,19 @@ var AuthModule = class {
|
|
|
178
178
|
throw error;
|
|
179
179
|
}
|
|
180
180
|
}
|
|
181
|
+
/**
|
|
182
|
+
* Alias for getUser() - Get the current authenticated user from the server
|
|
183
|
+
* Calls the /auth/me endpoint
|
|
184
|
+
*
|
|
185
|
+
* @example
|
|
186
|
+
* ```typescript
|
|
187
|
+
* const user = await baasix.auth.me();
|
|
188
|
+
* console.log(user?.email);
|
|
189
|
+
* ```
|
|
190
|
+
*/
|
|
191
|
+
async me() {
|
|
192
|
+
return this.getUser();
|
|
193
|
+
}
|
|
181
194
|
/**
|
|
182
195
|
* Get the cached current user (does not make an API call)
|
|
183
196
|
*
|
|
@@ -326,7 +339,7 @@ var AuthModule = class {
|
|
|
326
339
|
*/
|
|
327
340
|
async forgotPassword(options) {
|
|
328
341
|
await this.client.post(
|
|
329
|
-
"/auth/
|
|
342
|
+
"/auth/password/reset",
|
|
330
343
|
{
|
|
331
344
|
email: options.email,
|
|
332
345
|
link: options.redirectUrl
|
|
@@ -344,8 +357,8 @@ var AuthModule = class {
|
|
|
344
357
|
*/
|
|
345
358
|
async resetPassword(token, newPassword) {
|
|
346
359
|
await this.client.post(
|
|
347
|
-
|
|
348
|
-
{
|
|
360
|
+
`/auth/password/reset/${encodeURIComponent(token)}`,
|
|
361
|
+
{ password: newPassword },
|
|
349
362
|
{ skipAuth: true }
|
|
350
363
|
);
|
|
351
364
|
}
|
|
@@ -358,28 +371,11 @@ var AuthModule = class {
|
|
|
358
371
|
* ```
|
|
359
372
|
*/
|
|
360
373
|
async changePassword(currentPassword, newPassword) {
|
|
361
|
-
await this.client.post("/auth/change
|
|
374
|
+
await this.client.post("/auth/password/change", {
|
|
362
375
|
currentPassword,
|
|
363
376
|
newPassword
|
|
364
377
|
});
|
|
365
378
|
}
|
|
366
|
-
/**
|
|
367
|
-
* Update the current user's profile
|
|
368
|
-
*
|
|
369
|
-
* @example
|
|
370
|
-
* ```typescript
|
|
371
|
-
* const updatedUser = await baasix.auth.updateProfile({
|
|
372
|
-
* firstName: 'Jane',
|
|
373
|
-
* lastName: 'Doe'
|
|
374
|
-
* });
|
|
375
|
-
* ```
|
|
376
|
-
*/
|
|
377
|
-
async updateProfile(data) {
|
|
378
|
-
const response = await this.client.patch("/auth/me", data);
|
|
379
|
-
await this.storage.set(STORAGE_KEYS.USER, JSON.stringify(response.data));
|
|
380
|
-
this.emitAuthStateChange("USER_UPDATED", response.data);
|
|
381
|
-
return response.data;
|
|
382
|
-
}
|
|
383
379
|
/**
|
|
384
380
|
* Get available tenants for the current user (multi-tenant mode)
|
|
385
381
|
*
|
|
@@ -390,7 +386,7 @@ var AuthModule = class {
|
|
|
390
386
|
*/
|
|
391
387
|
async getTenants() {
|
|
392
388
|
const response = await this.client.get("/auth/tenants");
|
|
393
|
-
return response.
|
|
389
|
+
return response.tenants;
|
|
394
390
|
}
|
|
395
391
|
/**
|
|
396
392
|
* Switch to a different tenant (multi-tenant mode)
|
|
@@ -511,7 +507,7 @@ var AuthModule = class {
|
|
|
511
507
|
* ```
|
|
512
508
|
*/
|
|
513
509
|
async requestEmailVerification(redirectUrl) {
|
|
514
|
-
await this.client.post("/auth/
|
|
510
|
+
await this.client.post("/auth/email/verify", {
|
|
515
511
|
link: redirectUrl
|
|
516
512
|
});
|
|
517
513
|
}
|
|
@@ -527,8 +523,7 @@ var AuthModule = class {
|
|
|
527
523
|
* ```
|
|
528
524
|
*/
|
|
529
525
|
async verifyEmail(token) {
|
|
530
|
-
await this.client.get(
|
|
531
|
-
params: { token },
|
|
526
|
+
await this.client.get(`/auth/email/verify/${encodeURIComponent(token)}`, {
|
|
532
527
|
skipAuth: true
|
|
533
528
|
});
|
|
534
529
|
}
|
|
@@ -543,7 +538,7 @@ var AuthModule = class {
|
|
|
543
538
|
async checkSession() {
|
|
544
539
|
try {
|
|
545
540
|
const response = await this.client.get("/auth/check");
|
|
546
|
-
return response.
|
|
541
|
+
return response.valid;
|
|
547
542
|
} catch {
|
|
548
543
|
return false;
|
|
549
544
|
}
|
|
@@ -588,16 +583,15 @@ var AuthModule = class {
|
|
|
588
583
|
*/
|
|
589
584
|
async verifyInvite(token, redirectUrl) {
|
|
590
585
|
const response = await this.client.get(
|
|
591
|
-
|
|
586
|
+
`/auth/verify-invite/${encodeURIComponent(token)}`,
|
|
592
587
|
{
|
|
593
588
|
params: {
|
|
594
|
-
token,
|
|
595
589
|
link: redirectUrl
|
|
596
590
|
},
|
|
597
591
|
skipAuth: true
|
|
598
592
|
}
|
|
599
593
|
);
|
|
600
|
-
return response
|
|
594
|
+
return response;
|
|
601
595
|
}
|
|
602
596
|
/**
|
|
603
597
|
* Accept an invitation (for existing users)
|
|
@@ -610,7 +604,7 @@ var AuthModule = class {
|
|
|
610
604
|
async acceptInvite(token) {
|
|
611
605
|
const response = await this.client.post(
|
|
612
606
|
"/auth/accept-invite",
|
|
613
|
-
{ token }
|
|
607
|
+
{ inviteToken: token }
|
|
614
608
|
);
|
|
615
609
|
await this.storeTokens(response);
|
|
616
610
|
this.emitAuthStateChange("SIGNED_IN", response.user);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/storage/types.ts","../../src/types.ts","../../src/modules/auth.ts"],"names":[],"mappings":"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","file":"auth.cjs","sourcesContent":["/**\n * Storage adapter interface for persisting authentication state.\n * Implement this interface to create custom storage solutions (e.g., AsyncStorage for React Native).\n */\nexport interface StorageAdapter {\n /**\n * Get a value from storage\n * @param key - The storage key\n * @returns The stored value or null if not found\n */\n get(key: string): Promise<string | null> | string | null;\n\n /**\n * Set a value in storage\n * @param key - The storage key\n * @param value - The value to store\n */\n set(key: string, value: string): Promise<void> | void;\n\n /**\n * Remove a value from storage\n * @param key - The storage key\n */\n remove(key: string): Promise<void> | void;\n\n /**\n * Clear all SDK-related values from storage\n */\n clear?(): Promise<void> | void;\n}\n\n/**\n * Storage keys used by the SDK\n */\nexport const STORAGE_KEYS = {\n ACCESS_TOKEN: \"baasix_access_token\",\n REFRESH_TOKEN: \"baasix_refresh_token\",\n TOKEN_EXPIRY: \"baasix_token_expiry\",\n USER: \"baasix_user\",\n TENANT: \"baasix_tenant\",\n} as const;\n\nexport type StorageKey = (typeof STORAGE_KEYS)[keyof typeof STORAGE_KEYS];\n","import type { StorageAdapter } from \"./storage/types\";\n\n// ============================================================================\n// Configuration Types\n// ============================================================================\n\n/**\n * Authentication mode for the SDK\n * - 'jwt': Use JWT tokens stored in the configured storage adapter (default)\n * - 'cookie': Use HTTP-only cookies (server handles token storage)\n */\nexport type AuthMode = \"jwt\" | \"cookie\";\n\n/**\n * SDK Configuration options\n */\nexport interface BaasixConfig {\n /**\n * The base URL of your Baasix instance\n * @example 'https://api.example.com' or 'http://localhost:8056'\n */\n url: string;\n\n /**\n * Authentication mode\n * @default 'jwt'\n */\n authMode?: AuthMode;\n\n /**\n * Storage adapter for persisting tokens and user data\n * @default LocalStorageAdapter (web) or MemoryStorageAdapter (SSR)\n */\n storage?: StorageAdapter;\n\n /**\n * Static access token (useful for server-side or service accounts)\n * When provided, this token is used instead of stored tokens\n */\n token?: string;\n\n /**\n * Custom headers to include in all requests\n */\n headers?: Record<string, string>;\n\n /**\n * Request timeout in milliseconds\n * @default 30000 (30 seconds)\n */\n timeout?: number;\n\n /**\n * Whether to automatically refresh tokens before expiry\n * @default true\n */\n autoRefresh?: boolean;\n\n /**\n * Credentials mode for fetch requests (important for cookies)\n * @default 'include' for cookie mode, 'same-origin' for jwt mode\n */\n credentials?: RequestCredentials;\n\n /**\n * Tenant ID for multi-tenant mode\n */\n tenantId?: string;\n\n /**\n * Global error handler\n */\n onError?: (error: BaasixError) => void;\n\n /**\n * Called when authentication state changes\n */\n onAuthStateChange?: (event: AuthStateEvent, user: User | null) => void;\n\n /**\n * WebSocket server URL for realtime features\n * @default Same as url\n */\n socketUrl?: string;\n\n /**\n * WebSocket path\n * @default '/socket'\n */\n socketPath?: string;\n}\n\n// ============================================================================\n// Authentication Types\n// ============================================================================\n\nexport interface User {\n id: string;\n email: string;\n firstName?: string;\n lastName?: string;\n avatar?: string;\n role?: Role;\n role_Id?: string;\n tenant_Id?: string;\n status?: string;\n createdAt?: string;\n updatedAt?: string;\n [key: string]: unknown;\n}\n\nexport interface Role {\n id: string;\n name: string;\n description?: string;\n [key: string]: unknown;\n}\n\nexport interface Tenant {\n id: string;\n name: string;\n [key: string]: unknown;\n}\n\nexport interface AuthTokens {\n accessToken: string;\n refreshToken?: string;\n expiresAt?: number;\n expiresIn?: number;\n}\n\nexport interface LoginCredentials {\n email: string;\n password: string;\n tenantId?: string;\n}\n\nexport interface RegisterData {\n email: string;\n password: string;\n firstName?: string;\n lastName?: string;\n [key: string]: unknown;\n}\n\nexport interface AuthResponse {\n token: string;\n refreshToken?: string;\n user: User;\n expiresIn?: number;\n}\n\nexport type AuthStateEvent =\n | \"SIGNED_IN\"\n | \"SIGNED_OUT\"\n | \"TOKEN_REFRESHED\"\n | \"USER_UPDATED\"\n | \"TENANT_SWITCHED\";\n\nexport interface AuthState {\n user: User | null;\n isAuthenticated: boolean;\n isLoading: boolean;\n error: BaasixError | null;\n}\n\nexport interface MagicLinkOptions {\n email: string;\n redirectUrl?: string;\n mode?: \"link\" | \"code\";\n}\n\nexport interface PasswordResetOptions {\n email: string;\n redirectUrl?: string;\n}\n\n// ============================================================================\n// Query Types\n// ============================================================================\n\n/**\n * Filter operators supported by Baasix\n */\nexport type FilterOperator =\n // Comparison\n | \"eq\"\n | \"ne\"\n | \"neq\"\n | \"gt\"\n | \"gte\"\n | \"lt\"\n | \"lte\"\n | \"is\"\n | \"not\"\n // Collection\n | \"in\"\n | \"notIn\"\n | \"nin\"\n // String patterns\n | \"like\"\n | \"notLike\"\n | \"iLike\"\n | \"notILike\"\n | \"ilike\"\n | \"contains\"\n | \"icontains\"\n | \"ncontains\"\n | \"startsWith\"\n | \"startsWiths\"\n | \"endsWith\"\n | \"endsWiths\"\n | \"nstartsWith\"\n | \"nstartsWiths\"\n | \"nendsWith\"\n | \"nendsWiths\"\n // Range\n | \"between\"\n | \"notBetween\"\n | \"nbetween\"\n // Null\n | \"isNull\"\n | \"isNotNull\"\n // Array (PostgreSQL)\n | \"arraycontains\"\n | \"arraycontained\"\n | \"arrayoverlap\"\n | \"arraylength\"\n // JSONB\n | \"jsonbContains\"\n | \"jsonbContainedBy\"\n | \"jsonbNotContains\"\n | \"jsonbHasKey\"\n | \"jsonbHasAnyKeys\"\n | \"jsonbHasAllKeys\"\n | \"jsonbKeyEquals\"\n | \"jsonbKeyNotEquals\"\n | \"jsonbKeyGt\"\n | \"jsonbKeyGte\"\n | \"jsonbKeyLt\"\n | \"jsonbKeyLte\"\n | \"jsonbKeyIn\"\n | \"jsonbKeyNotIn\"\n | \"jsonbKeyLike\"\n | \"jsonbKeyIsNull\"\n | \"jsonbKeyIsNotNull\"\n | \"jsonbPathExists\"\n | \"jsonbPathMatch\"\n | \"jsonbDeepValue\"\n | \"jsonbArrayLength\"\n | \"jsonbTypeOf\"\n // Geospatial (PostGIS)\n | \"within\"\n | \"containsGEO\"\n | \"intersects\"\n | \"nIntersects\"\n | \"dwithin\";\n\n/**\n * Filter value with operator\n */\nexport type FilterValue<T = unknown> =\n | T\n | { [K in FilterOperator]?: T | T[] }\n | { cast?: string };\n\n/**\n * Filter condition for a field\n */\nexport type FilterCondition = {\n [field: string]: FilterValue | FilterCondition;\n};\n\n/**\n * Logical filter operators\n */\nexport interface LogicalFilter {\n AND?: (FilterCondition | LogicalFilter)[];\n OR?: (FilterCondition | LogicalFilter)[];\n NOT?: FilterCondition | LogicalFilter;\n}\n\n/**\n * Complete filter type\n */\nexport type Filter = FilterCondition | LogicalFilter;\n\n/**\n * Sort direction\n */\nexport type SortDirection = \"asc\" | \"desc\" | \"ASC\" | \"DESC\";\n\n/**\n * Sort configuration\n */\nexport type Sort =\n | string\n | string[]\n | Record<string, SortDirection>\n | { column: string; order: SortDirection }[];\n\n/**\n * Aggregation function\n */\nexport type AggregateFunction = \"count\" | \"sum\" | \"avg\" | \"min\" | \"max\";\n\n/**\n * Aggregation configuration\n */\nexport interface AggregateConfig {\n function: AggregateFunction;\n field: string;\n}\n\nexport type Aggregate = Record<string, AggregateConfig>;\n\n/**\n * Query parameters for listing items\n */\nexport interface QueryParams<T = unknown> {\n /**\n * Fields to return\n * @example ['*'], ['id', 'name'], ['*', 'author.*']\n */\n fields?: string[];\n\n /**\n * Filter conditions\n */\n filter?: Filter;\n\n /**\n * Sorting configuration\n * @example { createdAt: 'desc' } or ['-createdAt', 'name']\n */\n sort?: Sort;\n\n /**\n * Number of items per page (-1 for all)\n * @default 10\n */\n limit?: number;\n\n /**\n * Page number (1-indexed)\n * @default 1\n */\n page?: number;\n\n /**\n * Number of items to skip\n */\n offset?: number;\n\n /**\n * Full-text search query\n */\n search?: string;\n\n /**\n * Fields to search in\n */\n searchFields?: string[];\n\n /**\n * Aggregation configuration\n */\n aggregate?: Aggregate;\n\n /**\n * Fields to group by (used with aggregate)\n */\n groupBy?: string[];\n\n /**\n * Include soft-deleted items\n * @default false\n */\n paranoid?: boolean;\n\n /**\n * Filter conditions for related items (O2M/M2M)\n */\n relConditions?: Record<string, Filter>;\n\n /**\n * Additional metadata\n */\n meta?: T;\n}\n\n// ============================================================================\n// Response Types\n// ============================================================================\n\n/**\n * Paginated response\n */\nexport interface PaginatedResponse<T> {\n data: T[];\n totalCount?: number;\n page?: number;\n limit?: number;\n totalPages?: number;\n}\n\n/**\n * Single item response\n */\nexport interface SingleResponse<T> {\n data: T;\n}\n\n/**\n * Create/Update response\n */\nexport interface MutationResponse<T = string> {\n data: T;\n message?: string;\n}\n\n/**\n * Delete response\n */\nexport interface DeleteResponse {\n data: { deleted: boolean; count?: number };\n message?: string;\n}\n\n/**\n * Bulk operation response\n */\nexport interface BulkResponse<T = string[]> {\n data: T;\n message?: string;\n errors?: Array<{ index: number; error: string }>;\n}\n\n// ============================================================================\n// Schema Types\n// ============================================================================\n\nexport type FieldType =\n | \"String\"\n | \"Text\"\n | \"HTML\"\n | \"Integer\"\n | \"BigInt\"\n | \"Float\"\n | \"Real\"\n | \"Double\"\n | \"Decimal\"\n | \"Boolean\"\n | \"Date\"\n | \"DateTime\"\n | \"Time\"\n | \"UUID\"\n | \"SUID\"\n | \"JSON\"\n | \"JSONB\"\n | \"Array\"\n | \"Geometry\"\n | \"Point\"\n | \"LineString\"\n | \"Polygon\"\n | \"Enum\";\n\n/**\n * Default value types supported by Baasix\n */\nexport type DefaultValueType =\n | { type: \"UUIDV4\" }\n | { type: \"SUID\" }\n | { type: \"NOW\" }\n | { type: \"AUTOINCREMENT\" }\n | { type: \"SQL\"; value: string }\n | { type: \"CURRENT_USER\" }\n | { type: \"CURRENT_TENANT\" };\n\nexport interface FieldDefinition {\n type: FieldType;\n primaryKey?: boolean;\n allowNull?: boolean;\n unique?: boolean;\n /**\n * Default value for the field\n * Can be a static value or a dynamic type\n * @example\n * // Static values\n * defaultValue: \"active\"\n * defaultValue: 0\n * defaultValue: false\n * defaultValue: []\n * \n * // Dynamic types\n * defaultValue: { type: \"UUIDV4\" }\n * defaultValue: { type: \"SUID\" }\n * defaultValue: { type: \"NOW\" }\n * defaultValue: { type: \"AUTOINCREMENT\" }\n * defaultValue: { type: \"SQL\", value: \"CURRENT_DATE\" }\n */\n defaultValue?: DefaultValueType | string | number | boolean | null | unknown[] | Record<string, unknown>;\n values?: {\n length?: number;\n precision?: number;\n scale?: number;\n type?: string;\n values?: string[]; // For Enum\n };\n validate?: {\n /** Minimum value for numeric fields */\n min?: number;\n /** Maximum value for numeric fields */\n max?: number;\n /** Validate as integer */\n isInt?: boolean;\n /** String must not be empty */\n notEmpty?: boolean;\n /** Validate email format */\n isEmail?: boolean;\n /** Validate URL format */\n isUrl?: boolean;\n /** String length range [min, max] */\n len?: [number, number];\n /** Pattern matching with regex (alias: matches) */\n is?: string;\n /** Pattern matching with regex (alias: is) */\n matches?: string;\n /** @deprecated Use 'is' or 'matches' instead */\n regex?: string;\n };\n comment?: string;\n}\n\nexport interface SchemaDefinition {\n name: string;\n timestamps?: boolean;\n paranoid?: boolean;\n /** \n * True for M2M/M2A junction tables (system-generated)\n * Junction tables are auto-created when defining M2M or M2A relationships\n */\n isJunction?: boolean;\n fields: Record<string, FieldDefinition>;\n indexes?: IndexDefinition[];\n}\n\nexport interface IndexDefinition {\n name: string;\n fields: string[];\n unique?: boolean;\n /** When true, NULL values are considered equal for unique indexes (PostgreSQL 15+) */\n nullsNotDistinct?: boolean;\n}\n\nexport type RelationshipType = \"M2O\" | \"O2M\" | \"M2M\" | \"M2A\" | \"O2O\";\n\nexport interface RelationshipDefinition {\n type: RelationshipType;\n target: string;\n name: string;\n alias?: string;\n /** \n * Custom junction table name for M2M/M2A relationships (max 63 chars for PostgreSQL)\n * If not provided, auto-generated as: {source}_{target}_{name}_junction\n * @example \"product_tags\" or \"comment_refs\"\n */\n through?: string;\n onDelete?: \"CASCADE\" | \"RESTRICT\" | \"SET NULL\";\n onUpdate?: \"CASCADE\" | \"RESTRICT\" | \"SET NULL\";\n /** Target tables for M2A (polymorphic) relationships */\n tables?: string[];\n}\n\nexport interface SchemaInfo {\n collectionName: string;\n schema: SchemaDefinition;\n relationships?: RelationshipDefinition[];\n}\n\n// ============================================================================\n// File Types\n// ============================================================================\n\nexport interface FileMetadata {\n id: string;\n title?: string;\n description?: string;\n filename: string;\n mimeType: string;\n size: number;\n width?: number;\n height?: number;\n duration?: number;\n storage: string;\n path: string;\n isPublic?: boolean;\n uploadedBy?: string;\n createdAt: string;\n updatedAt?: string;\n [key: string]: unknown;\n}\n\nexport interface UploadOptions {\n title?: string;\n description?: string;\n folder?: string;\n storage?: \"local\" | \"s3\";\n isPublic?: boolean;\n metadata?: Record<string, unknown>;\n onProgress?: (progress: number) => void;\n /** Request timeout in milliseconds (default: 30000). Set to 0 for no timeout. */\n timeout?: number;\n}\n\nexport interface AssetTransformOptions {\n width?: number;\n height?: number;\n fit?: \"cover\" | \"contain\" | \"fill\" | \"inside\" | \"outside\";\n quality?: number;\n format?: \"jpeg\" | \"png\" | \"webp\" | \"avif\";\n}\n\n// ============================================================================\n// Permission Types\n// ============================================================================\n\nexport type PermissionAction = \"create\" | \"read\" | \"update\" | \"delete\";\n\nexport interface Permission {\n id: string;\n role_Id: string;\n collection: string;\n action: PermissionAction;\n fields?: string[];\n conditions?: Filter;\n defaultValues?: Record<string, unknown>;\n relConditions?: Record<string, Filter>;\n}\n\nexport interface CreatePermissionData {\n role_Id: string;\n collection: string;\n action: PermissionAction;\n fields?: string[];\n conditions?: Filter;\n defaultValues?: Record<string, unknown>;\n relConditions?: Record<string, Filter>;\n}\n\n// ============================================================================\n// Notification Types\n// ============================================================================\n\nexport interface Notification {\n id: string;\n type: string;\n title: string;\n message: string;\n data?: Record<string, unknown>;\n seen: boolean;\n user_Id: string;\n createdAt: string;\n}\n\nexport interface SendNotificationData {\n type?: string;\n title: string;\n message: string;\n data?: Record<string, unknown>;\n userIds: string[];\n}\n\n// ============================================================================\n// Workflow Types\n// ============================================================================\n\nexport interface Workflow {\n id: string;\n name: string;\n description?: string;\n trigger: WorkflowTrigger;\n nodes: WorkflowNode[];\n edges: WorkflowEdge[];\n isActive: boolean;\n createdAt: string;\n updatedAt?: string;\n}\n\nexport interface WorkflowTrigger {\n type: \"manual\" | \"webhook\" | \"schedule\" | \"hook\";\n config?: Record<string, unknown>;\n}\n\nexport interface WorkflowNode {\n id: string;\n type: string;\n config: Record<string, unknown>;\n position?: { x: number; y: number };\n}\n\nexport interface WorkflowEdge {\n id: string;\n source: string;\n target: string;\n condition?: string;\n}\n\nexport interface WorkflowExecution {\n id: string;\n workflow_Id: string;\n status: \"pending\" | \"running\" | \"completed\" | \"failed\";\n triggerData?: Record<string, unknown>;\n result?: Record<string, unknown>;\n error?: string;\n startedAt: string;\n completedAt?: string;\n}\n\n// ============================================================================\n// Report Types\n// ============================================================================\n\nexport interface ReportConfig {\n collection: string;\n filter?: Filter;\n groupBy?: string;\n aggregate?: Aggregate;\n dateRange?: {\n start: string;\n end: string;\n field?: string;\n };\n}\n\nexport interface ReportResult {\n data: Record<string, unknown>[];\n summary?: Record<string, unknown>;\n}\n\n// ============================================================================\n// Error Types\n// ============================================================================\n\nexport interface BaasixErrorDetails {\n code?: string;\n field?: string;\n message?: string;\n [key: string]: unknown;\n}\n\nexport class BaasixError extends Error {\n public readonly status: number;\n public readonly code?: string;\n public readonly details?: BaasixErrorDetails[];\n public readonly isRetryable: boolean;\n\n constructor(\n message: string,\n status = 500,\n code?: string,\n details?: BaasixErrorDetails[]\n ) {\n super(message);\n this.name = \"BaasixError\";\n this.status = status;\n this.code = code;\n this.details = details;\n this.isRetryable = status >= 500 || status === 429;\n\n // Maintains proper stack trace for where error was thrown\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, BaasixError);\n }\n }\n\n toJSON() {\n return {\n name: this.name,\n message: this.message,\n status: this.status,\n code: this.code,\n details: this.details,\n };\n }\n}\n\n// ============================================================================\n// Utility Types\n// ============================================================================\n\n/**\n * Make all properties of T optional recursively\n */\nexport type DeepPartial<T> = {\n [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];\n};\n\n/**\n * Extract the item type from a collection\n */\nexport type CollectionItem<T> = T extends Array<infer U> ? U : T;\n\n/**\n * Generic record type with ID\n */\nexport interface BaseItem {\n id: string;\n createdAt?: string;\n updatedAt?: string;\n deletedAt?: string;\n [key: string]: unknown;\n}\n\n/**\n * Settings configuration\n */\nexport interface Settings {\n [key: string]: unknown;\n}\n","import type { HttpClient } from \"../client\";\nimport type { StorageAdapter } from \"../storage/types\";\nimport { STORAGE_KEYS } from \"../storage/types\";\nimport type {\n AuthMode,\n AuthResponse,\n AuthState,\n AuthStateEvent,\n AuthTokens,\n LoginCredentials,\n MagicLinkOptions,\n PasswordResetOptions,\n RegisterData,\n Tenant,\n User,\n} from \"../types\";\nimport { BaasixError } from \"../types\";\n\nexport type OAuthProvider = \"google\" | \"facebook\" | \"apple\" | \"github\";\n\nexport interface OAuthOptions {\n provider: OAuthProvider;\n redirectUrl: string;\n scopes?: string[];\n state?: string;\n}\n\nexport interface InviteOptions {\n email: string;\n roleId: string;\n tenantId?: string;\n redirectUrl: string;\n}\n\nexport interface VerifyInviteResult {\n valid: boolean;\n email?: string;\n tenantId?: string;\n roleId?: string;\n}\n\nexport interface AuthModuleConfig {\n client: HttpClient;\n storage: StorageAdapter;\n authMode: AuthMode;\n onAuthStateChange?: (event: AuthStateEvent, user: User | null) => void;\n}\n\n/**\n * Authentication module for handling user authentication, sessions, and token management.\n *\n * @example\n * ```typescript\n * // Login\n * const { user, token } = await baasix.auth.login({\n * email: 'user@example.com',\n * password: 'password123'\n * });\n *\n * // Get current user\n * const user = await baasix.auth.getUser();\n *\n * // Logout\n * await baasix.auth.logout();\n * ```\n */\nexport class AuthModule {\n private client: HttpClient;\n private storage: StorageAdapter;\n private authMode: AuthMode;\n private onAuthStateChange?: (event: AuthStateEvent, user: User | null) => void;\n private currentUser: User | null = null;\n\n constructor(config: AuthModuleConfig) {\n this.client = config.client;\n this.storage = config.storage;\n this.authMode = config.authMode;\n this.onAuthStateChange = config.onAuthStateChange;\n }\n\n /**\n * Emit an authentication state change event\n */\n private emitAuthStateChange(event: AuthStateEvent, user: User | null): void {\n this.currentUser = user;\n this.onAuthStateChange?.(event, user);\n }\n\n /**\n * Store authentication tokens\n */\n private async storeTokens(response: AuthResponse): Promise<void> {\n if (this.authMode === \"jwt\") {\n await this.storage.set(STORAGE_KEYS.ACCESS_TOKEN, response.token);\n\n if (response.refreshToken) {\n await this.storage.set(STORAGE_KEYS.REFRESH_TOKEN, response.refreshToken);\n }\n\n if (response.expiresIn) {\n const expiresAt = Date.now() + response.expiresIn * 1000;\n await this.storage.set(STORAGE_KEYS.TOKEN_EXPIRY, expiresAt.toString());\n }\n }\n\n // Store user info\n if (response.user) {\n await this.storage.set(STORAGE_KEYS.USER, JSON.stringify(response.user));\n }\n }\n\n /**\n * Clear stored authentication data\n */\n private async clearAuth(): Promise<void> {\n await this.storage.remove(STORAGE_KEYS.ACCESS_TOKEN);\n await this.storage.remove(STORAGE_KEYS.REFRESH_TOKEN);\n await this.storage.remove(STORAGE_KEYS.TOKEN_EXPIRY);\n await this.storage.remove(STORAGE_KEYS.USER);\n await this.storage.remove(STORAGE_KEYS.TENANT);\n this.currentUser = null;\n }\n\n /**\n * Register a new user\n *\n * @example\n * ```typescript\n * const { user, token } = await baasix.auth.register({\n * email: 'newuser@example.com',\n * password: 'securepassword',\n * firstName: 'John',\n * lastName: 'Doe'\n * });\n * ```\n */\n async register(data: RegisterData): Promise<AuthResponse> {\n const response = await this.client.post<AuthResponse>(\"/auth/register\", data, {\n skipAuth: true,\n });\n\n await this.storeTokens(response);\n this.emitAuthStateChange(\"SIGNED_IN\", response.user);\n\n return response;\n }\n\n /**\n * Login with email and password\n *\n * @example\n * ```typescript\n * const { user, token } = await baasix.auth.login({\n * email: 'user@example.com',\n * password: 'password123'\n * });\n *\n * // Login with tenant (multi-tenant mode)\n * const result = await baasix.auth.login({\n * email: 'user@example.com',\n * password: 'password123',\n * tenantId: 'tenant-uuid'\n * });\n * ```\n */\n async login(credentials: LoginCredentials): Promise<AuthResponse> {\n const response = await this.client.post<AuthResponse>(\n \"/auth/login\",\n {\n email: credentials.email,\n password: credentials.password,\n tenant_Id: credentials.tenantId,\n },\n { skipAuth: true }\n );\n\n await this.storeTokens(response);\n this.emitAuthStateChange(\"SIGNED_IN\", response.user);\n\n return response;\n }\n\n /**\n * Logout the current user\n *\n * @example\n * ```typescript\n * await baasix.auth.logout();\n * ```\n */\n async logout(): Promise<void> {\n try {\n await this.client.get(\"/auth/logout\");\n } catch {\n // Ignore logout errors - we still want to clear local state\n }\n\n await this.clearAuth();\n this.emitAuthStateChange(\"SIGNED_OUT\", null);\n }\n\n /**\n * Get the current authenticated user from the server\n *\n * @example\n * ```typescript\n * const user = await baasix.auth.getUser();\n * console.log(user?.email);\n * ```\n */\n async getUser(): Promise<User | null> {\n try {\n const response = await this.client.get<{ data: User }>(\"/auth/me\");\n this.currentUser = response.data;\n await this.storage.set(STORAGE_KEYS.USER, JSON.stringify(response.data));\n return response.data;\n } catch (error) {\n if (error instanceof BaasixError && error.status === 401) {\n await this.clearAuth();\n return null;\n }\n throw error;\n }\n }\n\n /**\n * Get the cached current user (does not make an API call)\n *\n * @example\n * ```typescript\n * const user = await baasix.auth.getCachedUser();\n * ```\n */\n async getCachedUser(): Promise<User | null> {\n if (this.currentUser) {\n return this.currentUser;\n }\n\n const userJson = await this.storage.get(STORAGE_KEYS.USER);\n if (userJson) {\n try {\n this.currentUser = JSON.parse(userJson);\n return this.currentUser;\n } catch {\n return null;\n }\n }\n\n return null;\n }\n\n /**\n * Check if user is authenticated (has valid token)\n *\n * @example\n * ```typescript\n * if (await baasix.auth.isAuthenticated()) {\n * // User is logged in\n * }\n * ```\n */\n async isAuthenticated(): Promise<boolean> {\n if (this.authMode === \"cookie\") {\n // For cookie mode, try to get user\n const user = await this.getCachedUser();\n return user !== null;\n }\n\n const token = await this.storage.get(STORAGE_KEYS.ACCESS_TOKEN);\n if (!token) return false;\n\n // Check expiry\n const expiry = await this.storage.get(STORAGE_KEYS.TOKEN_EXPIRY);\n if (expiry && Date.now() >= parseInt(expiry, 10)) {\n // Token expired, check if we have refresh token\n const refreshToken = await this.storage.get(STORAGE_KEYS.REFRESH_TOKEN);\n return !!refreshToken;\n }\n\n return true;\n }\n\n /**\n * Get the current access token\n *\n * @example\n * ```typescript\n * const token = await baasix.auth.getToken();\n * ```\n */\n async getToken(): Promise<string | null> {\n if (this.authMode === \"cookie\") {\n return null;\n }\n return await this.storage.get(STORAGE_KEYS.ACCESS_TOKEN);\n }\n\n /**\n * Set a static token (useful for server-side or service accounts)\n *\n * @example\n * ```typescript\n * baasix.auth.setToken('your-api-token');\n * ```\n */\n async setToken(token: string): Promise<void> {\n await this.storage.set(STORAGE_KEYS.ACCESS_TOKEN, token);\n }\n\n /**\n * Refresh the current token\n *\n * @example\n * ```typescript\n * const tokens = await baasix.auth.refreshToken();\n * ```\n */\n async refreshToken(): Promise<AuthTokens> {\n const refreshToken = await this.storage.get(STORAGE_KEYS.REFRESH_TOKEN);\n\n const response = await this.client.post<AuthResponse>(\n \"/auth/refresh\",\n this.authMode === \"jwt\" ? { refreshToken } : undefined\n );\n\n await this.storeTokens(response);\n\n const tokens: AuthTokens = {\n accessToken: response.token,\n refreshToken: response.refreshToken,\n expiresIn: response.expiresIn,\n expiresAt: response.expiresIn\n ? Date.now() + response.expiresIn * 1000\n : undefined,\n };\n\n this.emitAuthStateChange(\"TOKEN_REFRESHED\", response.user);\n\n return tokens;\n }\n\n /**\n * Request a magic link for passwordless login\n *\n * @example\n * ```typescript\n * await baasix.auth.sendMagicLink({\n * email: 'user@example.com',\n * redirectUrl: 'https://myapp.com/auth/callback'\n * });\n * ```\n */\n async sendMagicLink(options: MagicLinkOptions): Promise<void> {\n await this.client.post(\n \"/auth/magiclink\",\n {\n email: options.email,\n link: options.redirectUrl,\n mode: options.mode || \"link\",\n },\n { skipAuth: true }\n );\n }\n\n /**\n * Verify magic link/code and complete login\n *\n * @example\n * ```typescript\n * const { user, token } = await baasix.auth.verifyMagicLink('verification-token');\n * ```\n */\n async verifyMagicLink(token: string): Promise<AuthResponse> {\n const response = await this.client.get<AuthResponse>(\n `/auth/magiclink/${encodeURIComponent(token)}`,\n { skipAuth: true }\n );\n\n await this.storeTokens(response);\n this.emitAuthStateChange(\"SIGNED_IN\", response.user);\n\n return response;\n }\n\n /**\n * Request a password reset\n *\n * @example\n * ```typescript\n * await baasix.auth.forgotPassword({\n * email: 'user@example.com',\n * redirectUrl: 'https://myapp.com/reset-password'\n * });\n * ```\n */\n async forgotPassword(options: PasswordResetOptions): Promise<void> {\n await this.client.post(\n \"/auth/forgot-password\",\n {\n email: options.email,\n link: options.redirectUrl,\n },\n { skipAuth: true }\n );\n }\n\n /**\n * Reset password using a reset token\n *\n * @example\n * ```typescript\n * await baasix.auth.resetPassword('reset-token', 'newpassword123');\n * ```\n */\n async resetPassword(token: string, newPassword: string): Promise<void> {\n await this.client.post(\n \"/auth/reset-password\",\n { token, password: newPassword },\n { skipAuth: true }\n );\n }\n\n /**\n * Change the current user's password\n *\n * @example\n * ```typescript\n * await baasix.auth.changePassword('currentPassword', 'newPassword');\n * ```\n */\n async changePassword(\n currentPassword: string,\n newPassword: string\n ): Promise<void> {\n await this.client.post(\"/auth/change-password\", {\n currentPassword,\n newPassword,\n });\n }\n\n /**\n * Update the current user's profile\n *\n * @example\n * ```typescript\n * const updatedUser = await baasix.auth.updateProfile({\n * firstName: 'Jane',\n * lastName: 'Doe'\n * });\n * ```\n */\n async updateProfile(data: Partial<User>): Promise<User> {\n const response = await this.client.patch<{ data: User }>(\"/auth/me\", data);\n await this.storage.set(STORAGE_KEYS.USER, JSON.stringify(response.data));\n this.emitAuthStateChange(\"USER_UPDATED\", response.data);\n return response.data;\n }\n\n /**\n * Get available tenants for the current user (multi-tenant mode)\n *\n * @example\n * ```typescript\n * const tenants = await baasix.auth.getTenants();\n * ```\n */\n async getTenants(): Promise<Tenant[]> {\n const response = await this.client.get<{ data: Tenant[] }>(\"/auth/tenants\");\n return response.data;\n }\n\n /**\n * Switch to a different tenant (multi-tenant mode)\n *\n * @example\n * ```typescript\n * const { user, token } = await baasix.auth.switchTenant('tenant-uuid');\n * ```\n */\n async switchTenant(tenantId: string): Promise<AuthResponse> {\n const response = await this.client.post<AuthResponse>(\"/auth/switch-tenant\", {\n tenant_Id: tenantId,\n });\n\n await this.storeTokens(response);\n await this.storage.set(STORAGE_KEYS.TENANT, tenantId);\n this.emitAuthStateChange(\"TENANT_SWITCHED\", response.user);\n\n return response;\n }\n\n /**\n * Get the current authentication state\n *\n * @example\n * ```typescript\n * const state = await baasix.auth.getState();\n * console.log(state.isAuthenticated, state.user);\n * ```\n */\n async getState(): Promise<AuthState> {\n const isAuthenticated = await this.isAuthenticated();\n const user = await this.getCachedUser();\n\n return {\n user,\n isAuthenticated,\n isLoading: false,\n error: null,\n };\n }\n\n /**\n * Initialize authentication state from storage\n * Call this on app startup to restore previous session\n *\n * @example\n * ```typescript\n * await baasix.auth.initialize();\n * ```\n */\n async initialize(): Promise<AuthState> {\n const state = await this.getState();\n\n if (state.isAuthenticated && state.user) {\n this.emitAuthStateChange(\"SIGNED_IN\", state.user);\n }\n\n return state;\n }\n\n // ===================\n // OAuth / Social Login\n // ===================\n\n /**\n * Get the OAuth authorization URL for a provider\n * Redirect the user to this URL to start the OAuth flow\n * \n * @example\n * ```typescript\n * const url = baasix.auth.getOAuthUrl({\n * provider: 'google',\n * redirectUrl: 'https://myapp.com/auth/callback'\n * });\n * window.location.href = url;\n * ```\n */\n getOAuthUrl(options: OAuthOptions): string {\n const baseUrl = this.client.getBaseUrl();\n const params = new URLSearchParams({\n redirect_url: options.redirectUrl,\n });\n \n if (options.scopes?.length) {\n params.set(\"scopes\", options.scopes.join(\",\"));\n }\n if (options.state) {\n params.set(\"state\", options.state);\n }\n\n return `${baseUrl}/auth/signin/${options.provider}?${params.toString()}`;\n }\n\n /**\n * Handle OAuth callback and complete login\n * Call this from your callback page with the token from URL\n * \n * @example\n * ```typescript\n * // In your callback page\n * const params = new URLSearchParams(window.location.search);\n * const token = params.get('token');\n * \n * if (token) {\n * await baasix.auth.handleOAuthCallback(token);\n * }\n * ```\n */\n async handleOAuthCallback(token: string): Promise<AuthResponse> {\n // Store the token\n await this.storage.set(STORAGE_KEYS.ACCESS_TOKEN, token);\n \n // Get user info\n const user = await this.getUser();\n \n const response: AuthResponse = {\n token,\n user: user!,\n };\n \n this.emitAuthStateChange(\"SIGNED_IN\", user);\n return response;\n }\n\n // ===================\n // Email Verification\n // ===================\n\n /**\n * Request email verification\n * Sends a verification email to the current user\n * \n * @example\n * ```typescript\n * await baasix.auth.requestEmailVerification('https://myapp.com/verify-email');\n * ```\n */\n async requestEmailVerification(redirectUrl: string): Promise<void> {\n await this.client.post(\"/auth/request-verify-email\", {\n link: redirectUrl,\n });\n }\n\n /**\n * Verify email with token\n * \n * @example\n * ```typescript\n * const params = new URLSearchParams(window.location.search);\n * const token = params.get('token');\n * \n * await baasix.auth.verifyEmail(token);\n * ```\n */\n async verifyEmail(token: string): Promise<void> {\n await this.client.get(\"/auth/verify-email\", {\n params: { token },\n skipAuth: true,\n });\n }\n\n /**\n * Check if current session/token is valid\n * \n * @example\n * ```typescript\n * const isValid = await baasix.auth.checkSession();\n * ```\n */\n async checkSession(): Promise<boolean> {\n try {\n const response = await this.client.get<{ data: { valid: boolean } }>(\"/auth/check\");\n return response.data.valid;\n } catch {\n return false;\n }\n }\n\n // ===================\n // Invitation System\n // ===================\n\n /**\n * Send an invitation to a user (multi-tenant mode)\n * \n * @example\n * ```typescript\n * await baasix.auth.sendInvite({\n * email: 'newuser@example.com',\n * roleId: 'role-uuid',\n * tenantId: 'tenant-uuid',\n * redirectUrl: 'https://myapp.com/accept-invite'\n * });\n * ```\n */\n async sendInvite(options: InviteOptions): Promise<void> {\n await this.client.post(\"/auth/invite\", {\n email: options.email,\n role_Id: options.roleId,\n tenant_Id: options.tenantId,\n link: options.redirectUrl,\n });\n }\n\n /**\n * Verify an invitation token\n * \n * @example\n * ```typescript\n * const params = new URLSearchParams(window.location.search);\n * const token = params.get('token');\n * \n * const result = await baasix.auth.verifyInvite(token);\n * if (result.valid) {\n * // Show registration form with pre-filled email\n * }\n * ```\n */\n async verifyInvite(token: string, redirectUrl?: string): Promise<VerifyInviteResult> {\n const response = await this.client.get<{ data: VerifyInviteResult }>(\n \"/auth/verify-invite\",\n {\n params: { \n token,\n link: redirectUrl,\n },\n skipAuth: true,\n }\n );\n return response.data;\n }\n\n /**\n * Accept an invitation (for existing users)\n * \n * @example\n * ```typescript\n * await baasix.auth.acceptInvite(token);\n * ```\n */\n async acceptInvite(token: string): Promise<AuthResponse> {\n const response = await this.client.post<AuthResponse>(\n \"/auth/accept-invite\",\n { token }\n );\n \n await this.storeTokens(response);\n this.emitAuthStateChange(\"SIGNED_IN\", response.user);\n \n return response;\n }\n\n /**\n * Register with an invitation token\n * \n * @example\n * ```typescript\n * const { user, token } = await baasix.auth.registerWithInvite({\n * email: 'user@example.com',\n * password: 'password',\n * firstName: 'John',\n * lastName: 'Doe',\n * inviteToken: 'invite-token'\n * });\n * ```\n */\n async registerWithInvite(data: RegisterData & { inviteToken: string }): Promise<AuthResponse> {\n const response = await this.client.post<AuthResponse>(\n \"/auth/register\",\n {\n ...data,\n inviteToken: data.inviteToken,\n },\n { skipAuth: true }\n );\n\n await this.storeTokens(response);\n this.emitAuthStateChange(\"SIGNED_IN\", response.user);\n\n return response;\n }\n}\n\n// Re-export types from types.ts\nexport type {\n AuthResponse,\n AuthState,\n AuthStateEvent,\n AuthTokens,\n LoginCredentials,\n MagicLinkOptions,\n PasswordResetOptions,\n RegisterData,\n Tenant,\n User,\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/storage/types.ts","../../src/types.ts","../../src/modules/auth.ts"],"names":[],"mappings":"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","file":"auth.cjs","sourcesContent":["/**\n * Storage adapter interface for persisting authentication state.\n * Implement this interface to create custom storage solutions (e.g., AsyncStorage for React Native).\n */\nexport interface StorageAdapter {\n /**\n * Get a value from storage\n * @param key - The storage key\n * @returns The stored value or null if not found\n */\n get(key: string): Promise<string | null> | string | null;\n\n /**\n * Set a value in storage\n * @param key - The storage key\n * @param value - The value to store\n */\n set(key: string, value: string): Promise<void> | void;\n\n /**\n * Remove a value from storage\n * @param key - The storage key\n */\n remove(key: string): Promise<void> | void;\n\n /**\n * Clear all SDK-related values from storage\n */\n clear?(): Promise<void> | void;\n}\n\n/**\n * Storage keys used by the SDK\n */\nexport const STORAGE_KEYS = {\n ACCESS_TOKEN: \"baasix_access_token\",\n REFRESH_TOKEN: \"baasix_refresh_token\",\n TOKEN_EXPIRY: \"baasix_token_expiry\",\n USER: \"baasix_user\",\n TENANT: \"baasix_tenant\",\n} as const;\n\nexport type StorageKey = (typeof STORAGE_KEYS)[keyof typeof STORAGE_KEYS];\n","/**\n * Baasix SDK Types\n *\n * This file re-exports shared types from @baasix/types and defines\n * SDK-specific types that are not shared with other packages.\n */\n\nimport type { StorageAdapter } from \"./storage/types\";\n\n// ============================================================================\n// Re-export shared types from @baasix/types\n// ============================================================================\n\n// Auth types\nexport type {\n User,\n UserWithPassword,\n UserWithRolesAndPermissions,\n Role,\n PermissionAction,\n Permission,\n PermissionData,\n CreatePermissionData,\n Tenant,\n Session,\n AuthTokens,\n JWTPayload,\n Accountability,\n LoginCredentials,\n RegisterData,\n AuthResponse,\n AuthStateEvent,\n AuthState,\n MagicLinkOptions,\n PasswordResetOptions,\n OAuth2Tokens,\n OAuth2UserInfo,\n} from \"@baasix/types\";\n\n// Schema types\nexport type {\n FieldType,\n DefaultValueType,\n FieldValidationRules,\n FieldValues,\n FieldDefinition,\n FlattenedField,\n FieldInfo,\n IndexDefinition,\n SchemaDefinition,\n SchemaInfo,\n SchemaValidation,\n FieldValidation,\n ValidationResult,\n RelationshipType,\n AssociationType,\n RelationshipDefinition,\n AssociationDefinition,\n IncludeConfig,\n ProcessedInclude,\n} from \"@baasix/types\";\n\n// Query types\nexport type {\n FilterOperator,\n FilterValue,\n FilterCondition,\n LogicalFilter,\n Filter,\n FilterObject,\n SortDirection,\n Sort,\n SortItem,\n SortObject,\n PaginationOptions,\n PaginationMetadata,\n AggregateFunction,\n AggregateConfig,\n Aggregate,\n DatePart,\n DateTruncPrecision,\n QueryParams,\n QueryOptions,\n QueryContext,\n} from \"@baasix/types\";\n\n// Response types\nexport type {\n PaginatedResponse,\n SingleResponse,\n MutationResponse,\n DeleteResponse,\n BulkResponse,\n ReadResult,\n ErrorResponse,\n} from \"@baasix/types\";\n\n// File types\nexport type {\n FileMetadata,\n FileData,\n UploadOptions,\n InternalUploadedFile,\n AssetTransformOptions,\n AssetQuery,\n ProcessedImage,\n StorageProvider,\n} from \"@baasix/types\";\n\n// Workflow types\nexport type {\n WorkflowTriggerType,\n WorkflowStatus,\n Workflow,\n WorkflowFlowData,\n WorkflowTrigger,\n WorkflowNode,\n WorkflowNodeData,\n WorkflowEdge,\n WorkflowExecutionStatus,\n WorkflowExecution,\n WorkflowExecutionLog,\n} from \"@baasix/types\";\n\n// Notification types\nexport type {\n NotificationType,\n Notification,\n NotificationOptions,\n SendNotificationData,\n} from \"@baasix/types\";\n\n// Common types\nexport type {\n BaseItem,\n TimestampedItem,\n SoftDeletableItem,\n DeepPartial,\n CollectionItem,\n WithRequired,\n WithOptional,\n KeysOfType,\n AnyRecord,\n Settings,\n TenantSettings,\n // Import/Export types\n UploadedFile,\n ImportOptions,\n ExportOptions,\n ImportResult,\n ExportResult,\n // Stats types\n StatsQuery,\n StatsResult,\n // Task types\n BackgroundTask,\n // Report types\n ReportConfig,\n ReportResult,\n // Spatial types\n GeoJSONPoint,\n GeoJSONLineString,\n GeoJSONPolygon,\n GeoJSONGeometry,\n // Hook types\n HookEvent,\n HookContext,\n HookHandler,\n Hook,\n // HTTP types\n HttpMethod,\n // Mail types\n MailOptions,\n SenderConfig,\n // Seed types\n SeedData,\n SeedResult,\n // Cache types\n CacheConfig,\n CacheStrategy,\n} from \"@baasix/types\";\n\n// Import types needed for SDK-specific interfaces\nimport type { User, AuthStateEvent } from \"@baasix/types\";\n\n// Auth mode (re-exported from @baasix/types)\nexport type { AuthMode } from \"@baasix/types\";\n\n// Import for internal use\nimport type { AuthMode } from \"@baasix/types\";\n\n// ============================================================================\n// SDK-Specific Types (not shared)\n// ============================================================================\n\n/**\n * SDK Configuration options\n */\nexport interface BaasixConfig {\n /**\n * The base URL of your Baasix instance\n * @example 'https://api.example.com' or 'http://localhost:8056'\n */\n url: string;\n\n /**\n * Authentication mode\n * @default 'jwt'\n */\n authMode?: AuthMode;\n\n /**\n * Storage adapter for persisting tokens and user data\n * @default LocalStorageAdapter (web) or MemoryStorageAdapter (SSR)\n */\n storage?: StorageAdapter;\n\n /**\n * Static access token (useful for server-side or service accounts)\n * When provided, this token is used instead of stored tokens\n */\n token?: string;\n\n /**\n * Custom headers to include in all requests\n */\n headers?: Record<string, string>;\n\n /**\n * Request timeout in milliseconds\n * @default 30000 (30 seconds)\n */\n timeout?: number;\n\n /**\n * Whether to automatically refresh tokens before expiry\n * @default true\n */\n autoRefresh?: boolean;\n\n /**\n * Credentials mode for fetch requests (important for cookies)\n * @default 'include' for cookie mode, 'same-origin' for jwt mode\n */\n credentials?: RequestCredentials;\n\n /**\n * Tenant ID for multi-tenant mode\n */\n tenantId?: string;\n\n /**\n * Global error handler\n */\n onError?: (error: BaasixError) => void;\n\n /**\n * Called when authentication state changes\n */\n onAuthStateChange?: (event: AuthStateEvent, user: User | null) => void;\n\n /**\n * WebSocket server URL for realtime features\n * @default Same as url\n */\n socketUrl?: string;\n\n /**\n * WebSocket path\n * @default '/socket'\n */\n socketPath?: string;\n}\n\n// ============================================================================\n// Error Types (SDK-specific implementation)\n// ============================================================================\n\nexport interface BaasixErrorDetails {\n code?: string;\n field?: string;\n message?: string;\n [key: string]: unknown;\n}\n\nexport class BaasixError extends Error {\n public readonly status: number;\n public readonly code?: string;\n public readonly details?: BaasixErrorDetails[];\n public readonly isRetryable: boolean;\n\n constructor(\n message: string,\n status = 500,\n code?: string,\n details?: BaasixErrorDetails[]\n ) {\n super(message);\n this.name = \"BaasixError\";\n this.status = status;\n this.code = code;\n this.details = details;\n this.isRetryable = status >= 500 || status === 429;\n\n // Maintains proper stack trace for where error was thrown\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, BaasixError);\n }\n }\n\n toJSON() {\n return {\n name: this.name,\n message: this.message,\n status: this.status,\n code: this.code,\n details: this.details,\n };\n }\n}\n","import type { HttpClient } from \"../client\";\nimport type { StorageAdapter } from \"../storage/types\";\nimport { STORAGE_KEYS } from \"../storage/types\";\nimport type {\n AuthMode,\n AuthResponse,\n AuthState,\n AuthStateEvent,\n AuthTokens,\n LoginCredentials,\n MagicLinkOptions,\n PasswordResetOptions,\n RegisterData,\n Tenant,\n User,\n} from \"../types\";\nimport { BaasixError } from \"../types\";\n\nexport type OAuthProvider = \"google\" | \"facebook\" | \"apple\" | \"github\";\n\nexport interface OAuthOptions {\n provider: OAuthProvider;\n redirectUrl: string;\n scopes?: string[];\n state?: string;\n}\n\nexport interface InviteOptions {\n email: string;\n roleId: string;\n tenantId?: string;\n redirectUrl: string;\n}\n\nexport interface VerifyInviteResult {\n valid: boolean;\n email?: string;\n tenantId?: string;\n roleId?: string;\n}\n\nexport interface AuthModuleConfig {\n client: HttpClient;\n storage: StorageAdapter;\n authMode: AuthMode;\n onAuthStateChange?: (event: AuthStateEvent, user: User | null) => void;\n}\n\n/**\n * Authentication module for handling user authentication, sessions, and token management.\n *\n * @example\n * ```typescript\n * // Login\n * const { user, token } = await baasix.auth.login({\n * email: 'user@example.com',\n * password: 'password123'\n * });\n *\n * // Get current user\n * const user = await baasix.auth.getUser();\n *\n * // Logout\n * await baasix.auth.logout();\n * ```\n */\nexport class AuthModule {\n private client: HttpClient;\n private storage: StorageAdapter;\n private authMode: AuthMode;\n private onAuthStateChange?: (event: AuthStateEvent, user: User | null) => void;\n private currentUser: User | null = null;\n\n constructor(config: AuthModuleConfig) {\n this.client = config.client;\n this.storage = config.storage;\n this.authMode = config.authMode;\n this.onAuthStateChange = config.onAuthStateChange;\n }\n\n /**\n * Emit an authentication state change event\n */\n private emitAuthStateChange(event: AuthStateEvent, user: User | null): void {\n this.currentUser = user;\n this.onAuthStateChange?.(event, user);\n }\n\n /**\n * Store authentication tokens\n */\n private async storeTokens(response: AuthResponse): Promise<void> {\n if (this.authMode === \"jwt\") {\n await this.storage.set(STORAGE_KEYS.ACCESS_TOKEN, response.token);\n\n if (response.refreshToken) {\n await this.storage.set(STORAGE_KEYS.REFRESH_TOKEN, response.refreshToken);\n }\n\n if (response.expiresIn) {\n const expiresAt = Date.now() + response.expiresIn * 1000;\n await this.storage.set(STORAGE_KEYS.TOKEN_EXPIRY, expiresAt.toString());\n }\n }\n\n // Store user info\n if (response.user) {\n await this.storage.set(STORAGE_KEYS.USER, JSON.stringify(response.user));\n }\n }\n\n /**\n * Clear stored authentication data\n */\n private async clearAuth(): Promise<void> {\n await this.storage.remove(STORAGE_KEYS.ACCESS_TOKEN);\n await this.storage.remove(STORAGE_KEYS.REFRESH_TOKEN);\n await this.storage.remove(STORAGE_KEYS.TOKEN_EXPIRY);\n await this.storage.remove(STORAGE_KEYS.USER);\n await this.storage.remove(STORAGE_KEYS.TENANT);\n this.currentUser = null;\n }\n\n /**\n * Register a new user\n *\n * @example\n * ```typescript\n * const { user, token } = await baasix.auth.register({\n * email: 'newuser@example.com',\n * password: 'securepassword',\n * firstName: 'John',\n * lastName: 'Doe'\n * });\n * ```\n */\n async register(data: RegisterData): Promise<AuthResponse> {\n const response = await this.client.post<AuthResponse>(\"/auth/register\", data, {\n skipAuth: true,\n });\n\n await this.storeTokens(response);\n this.emitAuthStateChange(\"SIGNED_IN\", response.user);\n\n return response;\n }\n\n /**\n * Login with email and password\n *\n * @example\n * ```typescript\n * const { user, token } = await baasix.auth.login({\n * email: 'user@example.com',\n * password: 'password123'\n * });\n *\n * // Login with tenant (multi-tenant mode)\n * const result = await baasix.auth.login({\n * email: 'user@example.com',\n * password: 'password123',\n * tenantId: 'tenant-uuid'\n * });\n * ```\n */\n async login(credentials: LoginCredentials): Promise<AuthResponse> {\n const response = await this.client.post<AuthResponse>(\n \"/auth/login\",\n {\n email: credentials.email,\n password: credentials.password,\n tenant_Id: credentials.tenantId,\n },\n { skipAuth: true }\n );\n\n await this.storeTokens(response);\n this.emitAuthStateChange(\"SIGNED_IN\", response.user);\n\n return response;\n }\n\n /**\n * Logout the current user\n *\n * @example\n * ```typescript\n * await baasix.auth.logout();\n * ```\n */\n async logout(): Promise<void> {\n try {\n await this.client.get(\"/auth/logout\");\n } catch {\n // Ignore logout errors - we still want to clear local state\n }\n\n await this.clearAuth();\n this.emitAuthStateChange(\"SIGNED_OUT\", null);\n }\n\n /**\n * Get the current authenticated user from the server\n *\n * @example\n * ```typescript\n * const user = await baasix.auth.getUser();\n * console.log(user?.email);\n * ```\n */\n async getUser(): Promise<User | null> {\n try {\n const response = await this.client.get<{ data: User }>(\"/auth/me\");\n this.currentUser = response.data;\n await this.storage.set(STORAGE_KEYS.USER, JSON.stringify(response.data));\n return response.data;\n } catch (error) {\n if (error instanceof BaasixError && error.status === 401) {\n await this.clearAuth();\n return null;\n }\n throw error;\n }\n }\n\n /**\n * Alias for getUser() - Get the current authenticated user from the server\n * Calls the /auth/me endpoint\n *\n * @example\n * ```typescript\n * const user = await baasix.auth.me();\n * console.log(user?.email);\n * ```\n */\n async me(): Promise<User | null> {\n return this.getUser();\n }\n\n /**\n * Get the cached current user (does not make an API call)\n *\n * @example\n * ```typescript\n * const user = await baasix.auth.getCachedUser();\n * ```\n */\n async getCachedUser(): Promise<User | null> {\n if (this.currentUser) {\n return this.currentUser;\n }\n\n const userJson = await this.storage.get(STORAGE_KEYS.USER);\n if (userJson) {\n try {\n this.currentUser = JSON.parse(userJson);\n return this.currentUser;\n } catch {\n return null;\n }\n }\n\n return null;\n }\n\n /**\n * Check if user is authenticated (has valid token)\n *\n * @example\n * ```typescript\n * if (await baasix.auth.isAuthenticated()) {\n * // User is logged in\n * }\n * ```\n */\n async isAuthenticated(): Promise<boolean> {\n if (this.authMode === \"cookie\") {\n // For cookie mode, try to get user\n const user = await this.getCachedUser();\n return user !== null;\n }\n\n const token = await this.storage.get(STORAGE_KEYS.ACCESS_TOKEN);\n if (!token) return false;\n\n // Check expiry\n const expiry = await this.storage.get(STORAGE_KEYS.TOKEN_EXPIRY);\n if (expiry && Date.now() >= parseInt(expiry, 10)) {\n // Token expired, check if we have refresh token\n const refreshToken = await this.storage.get(STORAGE_KEYS.REFRESH_TOKEN);\n return !!refreshToken;\n }\n\n return true;\n }\n\n /**\n * Get the current access token\n *\n * @example\n * ```typescript\n * const token = await baasix.auth.getToken();\n * ```\n */\n async getToken(): Promise<string | null> {\n if (this.authMode === \"cookie\") {\n return null;\n }\n return await this.storage.get(STORAGE_KEYS.ACCESS_TOKEN);\n }\n\n /**\n * Set a static token (useful for server-side or service accounts)\n *\n * @example\n * ```typescript\n * baasix.auth.setToken('your-api-token');\n * ```\n */\n async setToken(token: string): Promise<void> {\n await this.storage.set(STORAGE_KEYS.ACCESS_TOKEN, token);\n }\n\n /**\n * Refresh the current token\n *\n * @example\n * ```typescript\n * const tokens = await baasix.auth.refreshToken();\n * ```\n */\n async refreshToken(): Promise<AuthTokens> {\n const refreshToken = await this.storage.get(STORAGE_KEYS.REFRESH_TOKEN);\n\n const response = await this.client.post<AuthResponse>(\n \"/auth/refresh\",\n this.authMode === \"jwt\" ? { refreshToken } : undefined\n );\n\n await this.storeTokens(response);\n\n const tokens: AuthTokens = {\n accessToken: response.token,\n refreshToken: response.refreshToken,\n expiresIn: response.expiresIn,\n expiresAt: response.expiresIn\n ? Date.now() + response.expiresIn * 1000\n : undefined,\n };\n\n this.emitAuthStateChange(\"TOKEN_REFRESHED\", response.user);\n\n return tokens;\n }\n\n /**\n * Request a magic link for passwordless login\n *\n * @example\n * ```typescript\n * await baasix.auth.sendMagicLink({\n * email: 'user@example.com',\n * redirectUrl: 'https://myapp.com/auth/callback'\n * });\n * ```\n */\n async sendMagicLink(options: MagicLinkOptions): Promise<void> {\n await this.client.post(\n \"/auth/magiclink\",\n {\n email: options.email,\n link: options.redirectUrl,\n mode: options.mode || \"link\",\n },\n { skipAuth: true }\n );\n }\n\n /**\n * Verify magic link/code and complete login\n *\n * @example\n * ```typescript\n * const { user, token } = await baasix.auth.verifyMagicLink('verification-token');\n * ```\n */\n async verifyMagicLink(token: string): Promise<AuthResponse> {\n const response = await this.client.get<AuthResponse>(\n `/auth/magiclink/${encodeURIComponent(token)}`,\n { skipAuth: true }\n );\n\n await this.storeTokens(response);\n this.emitAuthStateChange(\"SIGNED_IN\", response.user);\n\n return response;\n }\n\n /**\n * Request a password reset\n *\n * @example\n * ```typescript\n * await baasix.auth.forgotPassword({\n * email: 'user@example.com',\n * redirectUrl: 'https://myapp.com/reset-password'\n * });\n * ```\n */\n async forgotPassword(options: PasswordResetOptions): Promise<void> {\n await this.client.post(\n \"/auth/password/reset\",\n {\n email: options.email,\n link: options.redirectUrl,\n },\n { skipAuth: true }\n );\n }\n\n /**\n * Reset password using a reset token\n *\n * @example\n * ```typescript\n * await baasix.auth.resetPassword('reset-token', 'newpassword123');\n * ```\n */\n async resetPassword(token: string, newPassword: string): Promise<void> {\n await this.client.post(\n `/auth/password/reset/${encodeURIComponent(token)}`,\n { password: newPassword },\n { skipAuth: true }\n );\n }\n\n /**\n * Change the current user's password\n *\n * @example\n * ```typescript\n * await baasix.auth.changePassword('currentPassword', 'newPassword');\n * ```\n */\n async changePassword(\n currentPassword: string,\n newPassword: string\n ): Promise<void> {\n await this.client.post(\"/auth/password/change\", {\n currentPassword,\n newPassword,\n });\n }\n\n /**\n * Get available tenants for the current user (multi-tenant mode)\n *\n * @example\n * ```typescript\n * const tenants = await baasix.auth.getTenants();\n * ```\n */\n async getTenants(): Promise<Tenant[]> {\n const response = await this.client.get<{ tenants: Tenant[] }>(\"/auth/tenants\");\n return response.tenants;\n }\n\n /**\n * Switch to a different tenant (multi-tenant mode)\n *\n * @example\n * ```typescript\n * const { user, token } = await baasix.auth.switchTenant('tenant-uuid');\n * ```\n */\n async switchTenant(tenantId: string): Promise<AuthResponse> {\n const response = await this.client.post<AuthResponse>(\"/auth/switch-tenant\", {\n tenant_Id: tenantId,\n });\n\n await this.storeTokens(response);\n await this.storage.set(STORAGE_KEYS.TENANT, tenantId);\n this.emitAuthStateChange(\"TENANT_SWITCHED\", response.user);\n\n return response;\n }\n\n /**\n * Get the current authentication state\n *\n * @example\n * ```typescript\n * const state = await baasix.auth.getState();\n * console.log(state.isAuthenticated, state.user);\n * ```\n */\n async getState(): Promise<AuthState> {\n const isAuthenticated = await this.isAuthenticated();\n const user = await this.getCachedUser();\n\n return {\n user,\n isAuthenticated,\n isLoading: false,\n error: null,\n };\n }\n\n /**\n * Initialize authentication state from storage\n * Call this on app startup to restore previous session\n *\n * @example\n * ```typescript\n * await baasix.auth.initialize();\n * ```\n */\n async initialize(): Promise<AuthState> {\n const state = await this.getState();\n\n if (state.isAuthenticated && state.user) {\n this.emitAuthStateChange(\"SIGNED_IN\", state.user);\n }\n\n return state;\n }\n\n // ===================\n // OAuth / Social Login\n // ===================\n\n /**\n * Get the OAuth authorization URL for a provider\n * Redirect the user to this URL to start the OAuth flow\n * \n * @example\n * ```typescript\n * const url = baasix.auth.getOAuthUrl({\n * provider: 'google',\n * redirectUrl: 'https://myapp.com/auth/callback'\n * });\n * window.location.href = url;\n * ```\n */\n getOAuthUrl(options: OAuthOptions): string {\n const baseUrl = this.client.getBaseUrl();\n const params = new URLSearchParams({\n redirect_url: options.redirectUrl,\n });\n \n if (options.scopes?.length) {\n params.set(\"scopes\", options.scopes.join(\",\"));\n }\n if (options.state) {\n params.set(\"state\", options.state);\n }\n\n return `${baseUrl}/auth/signin/${options.provider}?${params.toString()}`;\n }\n\n /**\n * Handle OAuth callback and complete login\n * Call this from your callback page with the token from URL\n * \n * @example\n * ```typescript\n * // In your callback page\n * const params = new URLSearchParams(window.location.search);\n * const token = params.get('token');\n * \n * if (token) {\n * await baasix.auth.handleOAuthCallback(token);\n * }\n * ```\n */\n async handleOAuthCallback(token: string): Promise<AuthResponse> {\n // Store the token\n await this.storage.set(STORAGE_KEYS.ACCESS_TOKEN, token);\n \n // Get user info\n const user = await this.getUser();\n \n const response: AuthResponse = {\n token,\n user: user!,\n };\n \n this.emitAuthStateChange(\"SIGNED_IN\", user);\n return response;\n }\n\n // ===================\n // Email Verification\n // ===================\n\n /**\n * Request email verification\n * Sends a verification email to the current user\n * \n * @example\n * ```typescript\n * await baasix.auth.requestEmailVerification('https://myapp.com/verify-email');\n * ```\n */\n async requestEmailVerification(redirectUrl: string): Promise<void> {\n await this.client.post(\"/auth/email/verify\", {\n link: redirectUrl,\n });\n }\n\n /**\n * Verify email with token\n * \n * @example\n * ```typescript\n * const params = new URLSearchParams(window.location.search);\n * const token = params.get('token');\n * \n * await baasix.auth.verifyEmail(token);\n * ```\n */\n async verifyEmail(token: string): Promise<void> {\n await this.client.get(`/auth/email/verify/${encodeURIComponent(token)}`, {\n skipAuth: true,\n });\n }\n\n /**\n * Check if current session/token is valid\n * \n * @example\n * ```typescript\n * const isValid = await baasix.auth.checkSession();\n * ```\n */\n async checkSession(): Promise<boolean> {\n try {\n const response = await this.client.get<{ valid: boolean }>(\"/auth/check\");\n return response.valid;\n } catch {\n return false;\n }\n }\n\n // ===================\n // Invitation System\n // ===================\n\n /**\n * Send an invitation to a user (multi-tenant mode)\n * \n * @example\n * ```typescript\n * await baasix.auth.sendInvite({\n * email: 'newuser@example.com',\n * roleId: 'role-uuid',\n * tenantId: 'tenant-uuid',\n * redirectUrl: 'https://myapp.com/accept-invite'\n * });\n * ```\n */\n async sendInvite(options: InviteOptions): Promise<void> {\n await this.client.post(\"/auth/invite\", {\n email: options.email,\n role_Id: options.roleId,\n tenant_Id: options.tenantId,\n link: options.redirectUrl,\n });\n }\n\n /**\n * Verify an invitation token\n * \n * @example\n * ```typescript\n * const params = new URLSearchParams(window.location.search);\n * const token = params.get('token');\n * \n * const result = await baasix.auth.verifyInvite(token);\n * if (result.valid) {\n * // Show registration form with pre-filled email\n * }\n * ```\n */\n async verifyInvite(token: string, redirectUrl?: string): Promise<VerifyInviteResult> {\n const response = await this.client.get<VerifyInviteResult>(\n `/auth/verify-invite/${encodeURIComponent(token)}`,\n {\n params: {\n link: redirectUrl,\n },\n skipAuth: true,\n }\n );\n return response;\n }\n\n /**\n * Accept an invitation (for existing users)\n * \n * @example\n * ```typescript\n * await baasix.auth.acceptInvite(token);\n * ```\n */\n async acceptInvite(token: string): Promise<AuthResponse> {\n const response = await this.client.post<AuthResponse>(\n \"/auth/accept-invite\",\n { inviteToken: token }\n );\n\n await this.storeTokens(response);\n this.emitAuthStateChange(\"SIGNED_IN\", response.user);\n\n return response;\n }\n\n /**\n * Register with an invitation token\n * \n * @example\n * ```typescript\n * const { user, token } = await baasix.auth.registerWithInvite({\n * email: 'user@example.com',\n * password: 'password',\n * firstName: 'John',\n * lastName: 'Doe',\n * inviteToken: 'invite-token'\n * });\n * ```\n */\n async registerWithInvite(data: RegisterData & { inviteToken: string }): Promise<AuthResponse> {\n const response = await this.client.post<AuthResponse>(\n \"/auth/register\",\n {\n ...data,\n inviteToken: data.inviteToken,\n },\n { skipAuth: true }\n );\n\n await this.storeTokens(response);\n this.emitAuthStateChange(\"SIGNED_IN\", response.user);\n\n return response;\n }\n}\n\n// Re-export types from types.ts\nexport type {\n AuthResponse,\n AuthState,\n AuthStateEvent,\n AuthTokens,\n LoginCredentials,\n MagicLinkOptions,\n PasswordResetOptions,\n RegisterData,\n Tenant,\n User,\n};\n"]}
|
package/dist/modules/auth.d.cts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
import { H as HttpClient
|
|
1
|
+
import { H as HttpClient } from '../client-BHbM3KOy.cjs';
|
|
2
2
|
import { S as StorageAdapter } from '../types-BdjsGANq.cjs';
|
|
3
|
+
import { AuthMode, AuthStateEvent, User, RegisterData, AuthResponse, LoginCredentials, AuthTokens, MagicLinkOptions, PasswordResetOptions, Tenant, AuthState } from '@baasix/types';
|
|
4
|
+
export { AuthResponse, AuthState, AuthStateEvent, AuthTokens, LoginCredentials, MagicLinkOptions, PasswordResetOptions, RegisterData, Tenant, User } from '@baasix/types';
|
|
3
5
|
|
|
4
6
|
type OAuthProvider = "google" | "facebook" | "apple" | "github";
|
|
5
7
|
interface OAuthOptions {
|
|
@@ -115,6 +117,17 @@ declare class AuthModule {
|
|
|
115
117
|
* ```
|
|
116
118
|
*/
|
|
117
119
|
getUser(): Promise<User | null>;
|
|
120
|
+
/**
|
|
121
|
+
* Alias for getUser() - Get the current authenticated user from the server
|
|
122
|
+
* Calls the /auth/me endpoint
|
|
123
|
+
*
|
|
124
|
+
* @example
|
|
125
|
+
* ```typescript
|
|
126
|
+
* const user = await baasix.auth.me();
|
|
127
|
+
* console.log(user?.email);
|
|
128
|
+
* ```
|
|
129
|
+
*/
|
|
130
|
+
me(): Promise<User | null>;
|
|
118
131
|
/**
|
|
119
132
|
* Get the cached current user (does not make an API call)
|
|
120
133
|
*
|
|
@@ -213,18 +226,6 @@ declare class AuthModule {
|
|
|
213
226
|
* ```
|
|
214
227
|
*/
|
|
215
228
|
changePassword(currentPassword: string, newPassword: string): Promise<void>;
|
|
216
|
-
/**
|
|
217
|
-
* Update the current user's profile
|
|
218
|
-
*
|
|
219
|
-
* @example
|
|
220
|
-
* ```typescript
|
|
221
|
-
* const updatedUser = await baasix.auth.updateProfile({
|
|
222
|
-
* firstName: 'Jane',
|
|
223
|
-
* lastName: 'Doe'
|
|
224
|
-
* });
|
|
225
|
-
* ```
|
|
226
|
-
*/
|
|
227
|
-
updateProfile(data: Partial<User>): Promise<User>;
|
|
228
229
|
/**
|
|
229
230
|
* Get available tenants for the current user (multi-tenant mode)
|
|
230
231
|
*
|
|
@@ -381,4 +382,4 @@ declare class AuthModule {
|
|
|
381
382
|
}): Promise<AuthResponse>;
|
|
382
383
|
}
|
|
383
384
|
|
|
384
|
-
export { AuthModule, type AuthModuleConfig,
|
|
385
|
+
export { AuthModule, type AuthModuleConfig, type InviteOptions, type OAuthOptions, type OAuthProvider, type VerifyInviteResult };
|
package/dist/modules/auth.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
import { H as HttpClient
|
|
1
|
+
import { H as HttpClient } from '../client-D67LK80v.js';
|
|
2
2
|
import { S as StorageAdapter } from '../types-BdjsGANq.js';
|
|
3
|
+
import { AuthMode, AuthStateEvent, User, RegisterData, AuthResponse, LoginCredentials, AuthTokens, MagicLinkOptions, PasswordResetOptions, Tenant, AuthState } from '@baasix/types';
|
|
4
|
+
export { AuthResponse, AuthState, AuthStateEvent, AuthTokens, LoginCredentials, MagicLinkOptions, PasswordResetOptions, RegisterData, Tenant, User } from '@baasix/types';
|
|
3
5
|
|
|
4
6
|
type OAuthProvider = "google" | "facebook" | "apple" | "github";
|
|
5
7
|
interface OAuthOptions {
|
|
@@ -115,6 +117,17 @@ declare class AuthModule {
|
|
|
115
117
|
* ```
|
|
116
118
|
*/
|
|
117
119
|
getUser(): Promise<User | null>;
|
|
120
|
+
/**
|
|
121
|
+
* Alias for getUser() - Get the current authenticated user from the server
|
|
122
|
+
* Calls the /auth/me endpoint
|
|
123
|
+
*
|
|
124
|
+
* @example
|
|
125
|
+
* ```typescript
|
|
126
|
+
* const user = await baasix.auth.me();
|
|
127
|
+
* console.log(user?.email);
|
|
128
|
+
* ```
|
|
129
|
+
*/
|
|
130
|
+
me(): Promise<User | null>;
|
|
118
131
|
/**
|
|
119
132
|
* Get the cached current user (does not make an API call)
|
|
120
133
|
*
|
|
@@ -213,18 +226,6 @@ declare class AuthModule {
|
|
|
213
226
|
* ```
|
|
214
227
|
*/
|
|
215
228
|
changePassword(currentPassword: string, newPassword: string): Promise<void>;
|
|
216
|
-
/**
|
|
217
|
-
* Update the current user's profile
|
|
218
|
-
*
|
|
219
|
-
* @example
|
|
220
|
-
* ```typescript
|
|
221
|
-
* const updatedUser = await baasix.auth.updateProfile({
|
|
222
|
-
* firstName: 'Jane',
|
|
223
|
-
* lastName: 'Doe'
|
|
224
|
-
* });
|
|
225
|
-
* ```
|
|
226
|
-
*/
|
|
227
|
-
updateProfile(data: Partial<User>): Promise<User>;
|
|
228
229
|
/**
|
|
229
230
|
* Get available tenants for the current user (multi-tenant mode)
|
|
230
231
|
*
|
|
@@ -381,4 +382,4 @@ declare class AuthModule {
|
|
|
381
382
|
}): Promise<AuthResponse>;
|
|
382
383
|
}
|
|
383
384
|
|
|
384
|
-
export { AuthModule, type AuthModuleConfig,
|
|
385
|
+
export { AuthModule, type AuthModuleConfig, type InviteOptions, type OAuthOptions, type OAuthProvider, type VerifyInviteResult };
|
package/dist/modules/auth.js
CHANGED
|
@@ -176,6 +176,19 @@ var AuthModule = class {
|
|
|
176
176
|
throw error;
|
|
177
177
|
}
|
|
178
178
|
}
|
|
179
|
+
/**
|
|
180
|
+
* Alias for getUser() - Get the current authenticated user from the server
|
|
181
|
+
* Calls the /auth/me endpoint
|
|
182
|
+
*
|
|
183
|
+
* @example
|
|
184
|
+
* ```typescript
|
|
185
|
+
* const user = await baasix.auth.me();
|
|
186
|
+
* console.log(user?.email);
|
|
187
|
+
* ```
|
|
188
|
+
*/
|
|
189
|
+
async me() {
|
|
190
|
+
return this.getUser();
|
|
191
|
+
}
|
|
179
192
|
/**
|
|
180
193
|
* Get the cached current user (does not make an API call)
|
|
181
194
|
*
|
|
@@ -324,7 +337,7 @@ var AuthModule = class {
|
|
|
324
337
|
*/
|
|
325
338
|
async forgotPassword(options) {
|
|
326
339
|
await this.client.post(
|
|
327
|
-
"/auth/
|
|
340
|
+
"/auth/password/reset",
|
|
328
341
|
{
|
|
329
342
|
email: options.email,
|
|
330
343
|
link: options.redirectUrl
|
|
@@ -342,8 +355,8 @@ var AuthModule = class {
|
|
|
342
355
|
*/
|
|
343
356
|
async resetPassword(token, newPassword) {
|
|
344
357
|
await this.client.post(
|
|
345
|
-
|
|
346
|
-
{
|
|
358
|
+
`/auth/password/reset/${encodeURIComponent(token)}`,
|
|
359
|
+
{ password: newPassword },
|
|
347
360
|
{ skipAuth: true }
|
|
348
361
|
);
|
|
349
362
|
}
|
|
@@ -356,28 +369,11 @@ var AuthModule = class {
|
|
|
356
369
|
* ```
|
|
357
370
|
*/
|
|
358
371
|
async changePassword(currentPassword, newPassword) {
|
|
359
|
-
await this.client.post("/auth/change
|
|
372
|
+
await this.client.post("/auth/password/change", {
|
|
360
373
|
currentPassword,
|
|
361
374
|
newPassword
|
|
362
375
|
});
|
|
363
376
|
}
|
|
364
|
-
/**
|
|
365
|
-
* Update the current user's profile
|
|
366
|
-
*
|
|
367
|
-
* @example
|
|
368
|
-
* ```typescript
|
|
369
|
-
* const updatedUser = await baasix.auth.updateProfile({
|
|
370
|
-
* firstName: 'Jane',
|
|
371
|
-
* lastName: 'Doe'
|
|
372
|
-
* });
|
|
373
|
-
* ```
|
|
374
|
-
*/
|
|
375
|
-
async updateProfile(data) {
|
|
376
|
-
const response = await this.client.patch("/auth/me", data);
|
|
377
|
-
await this.storage.set(STORAGE_KEYS.USER, JSON.stringify(response.data));
|
|
378
|
-
this.emitAuthStateChange("USER_UPDATED", response.data);
|
|
379
|
-
return response.data;
|
|
380
|
-
}
|
|
381
377
|
/**
|
|
382
378
|
* Get available tenants for the current user (multi-tenant mode)
|
|
383
379
|
*
|
|
@@ -388,7 +384,7 @@ var AuthModule = class {
|
|
|
388
384
|
*/
|
|
389
385
|
async getTenants() {
|
|
390
386
|
const response = await this.client.get("/auth/tenants");
|
|
391
|
-
return response.
|
|
387
|
+
return response.tenants;
|
|
392
388
|
}
|
|
393
389
|
/**
|
|
394
390
|
* Switch to a different tenant (multi-tenant mode)
|
|
@@ -509,7 +505,7 @@ var AuthModule = class {
|
|
|
509
505
|
* ```
|
|
510
506
|
*/
|
|
511
507
|
async requestEmailVerification(redirectUrl) {
|
|
512
|
-
await this.client.post("/auth/
|
|
508
|
+
await this.client.post("/auth/email/verify", {
|
|
513
509
|
link: redirectUrl
|
|
514
510
|
});
|
|
515
511
|
}
|
|
@@ -525,8 +521,7 @@ var AuthModule = class {
|
|
|
525
521
|
* ```
|
|
526
522
|
*/
|
|
527
523
|
async verifyEmail(token) {
|
|
528
|
-
await this.client.get(
|
|
529
|
-
params: { token },
|
|
524
|
+
await this.client.get(`/auth/email/verify/${encodeURIComponent(token)}`, {
|
|
530
525
|
skipAuth: true
|
|
531
526
|
});
|
|
532
527
|
}
|
|
@@ -541,7 +536,7 @@ var AuthModule = class {
|
|
|
541
536
|
async checkSession() {
|
|
542
537
|
try {
|
|
543
538
|
const response = await this.client.get("/auth/check");
|
|
544
|
-
return response.
|
|
539
|
+
return response.valid;
|
|
545
540
|
} catch {
|
|
546
541
|
return false;
|
|
547
542
|
}
|
|
@@ -586,16 +581,15 @@ var AuthModule = class {
|
|
|
586
581
|
*/
|
|
587
582
|
async verifyInvite(token, redirectUrl) {
|
|
588
583
|
const response = await this.client.get(
|
|
589
|
-
|
|
584
|
+
`/auth/verify-invite/${encodeURIComponent(token)}`,
|
|
590
585
|
{
|
|
591
586
|
params: {
|
|
592
|
-
token,
|
|
593
587
|
link: redirectUrl
|
|
594
588
|
},
|
|
595
589
|
skipAuth: true
|
|
596
590
|
}
|
|
597
591
|
);
|
|
598
|
-
return response
|
|
592
|
+
return response;
|
|
599
593
|
}
|
|
600
594
|
/**
|
|
601
595
|
* Accept an invitation (for existing users)
|
|
@@ -608,7 +602,7 @@ var AuthModule = class {
|
|
|
608
602
|
async acceptInvite(token) {
|
|
609
603
|
const response = await this.client.post(
|
|
610
604
|
"/auth/accept-invite",
|
|
611
|
-
{ token }
|
|
605
|
+
{ inviteToken: token }
|
|
612
606
|
);
|
|
613
607
|
await this.storeTokens(response);
|
|
614
608
|
this.emitAuthStateChange("SIGNED_IN", response.user);
|