@urbackend/sdk 0.2.4 → 0.2.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 +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +8 -6
- /package/dist/{index.d.mts → index.d.cts} +0 -0
package/dist/index.cjs
CHANGED
|
@@ -489,7 +489,7 @@ var UrBackendClient = class {
|
|
|
489
489
|
const url = `${this.baseUrl}${path}`;
|
|
490
490
|
const headers = {
|
|
491
491
|
"x-api-key": this.apiKey,
|
|
492
|
-
"User-Agent": `urbackend-sdk-js/0.2.
|
|
492
|
+
"User-Agent": `urbackend-sdk-js/0.2.2`,
|
|
493
493
|
...this.headers
|
|
494
494
|
};
|
|
495
495
|
if (options.token) {
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/modules/auth.ts","../src/modules/database.ts","../src/modules/storage.ts","../src/modules/schema.ts","../src/modules/mail.ts","../src/client.ts"],"sourcesContent":["import { UrBackendClient } from './client';\r\nimport { UrBackendConfig } from './types';\r\nimport { AuthModule } from './modules/auth';\r\nimport { DatabaseModule } from './modules/database';\r\nimport { StorageModule } from './modules/storage';\r\nimport { SchemaModule } from './modules/schema';\r\nimport { MailModule } from './modules/mail';\r\n\r\nexport * from './types';\r\nexport * from './errors';\r\nexport { UrBackendClient, AuthModule, DatabaseModule, StorageModule, SchemaModule, MailModule };\r\n\r\n/**\r\n * Factory function to create a new urBackend client\r\n */\r\nexport default function urBackend(config: UrBackendConfig): UrBackendClient {\r\n return new UrBackendClient(config);\r\n}\r\n","export class UrBackendError extends Error {\r\n constructor(\r\n public message: string,\r\n public statusCode: number,\r\n public endpoint: string,\r\n ) {\r\n super(message);\r\n this.name = 'UrBackendError';\r\n }\r\n}\r\n\r\nexport class AuthError extends UrBackendError {\r\n constructor(message: string, statusCode: number, endpoint: string) {\r\n super(message, statusCode, endpoint);\r\n this.name = 'AuthError';\r\n }\r\n}\r\n\r\nexport class NotFoundError extends UrBackendError {\r\n constructor(message: string, endpoint: string) {\r\n super(message, 404, endpoint);\r\n this.name = 'NotFoundError';\r\n }\r\n}\r\n\r\nexport class RateLimitError extends UrBackendError {\r\n public retryAfter?: number;\r\n\r\n constructor(message: string, endpoint: string, retryAfter?: number) {\r\n super(message, 429, endpoint);\r\n this.name = 'RateLimitError';\r\n this.retryAfter = retryAfter;\r\n }\r\n}\r\n\r\nexport class StorageError extends UrBackendError {\r\n constructor(message: string, statusCode: number, endpoint: string) {\r\n super(message, statusCode, endpoint);\r\n this.name = 'StorageError';\r\n }\r\n}\r\n\r\nexport class ValidationError extends UrBackendError {\r\n constructor(message: string, endpoint: string) {\r\n super(message, 400, endpoint);\r\n this.name = 'ValidationError';\r\n }\r\n}\r\n\r\nexport async function parseApiError(response: Response): Promise<UrBackendError> {\r\n const endpoint = new URL(response.url).pathname;\r\n let message = 'An unexpected error occurred';\r\n let data: unknown;\r\n\r\n try {\r\n data = await response.json();\r\n if (typeof data === 'object' && data !== null && 'message' in data) {\r\n message = (data as { message: string }).message || message;\r\n }\r\n } catch {\r\n // If not JSON, use status text\r\n message = response.statusText || message;\r\n }\r\n\r\n const status = response.status;\r\n\r\n if (status === 401 || status === 403) {\r\n return new AuthError(message, status, endpoint);\r\n }\r\n\r\n if (status === 404) {\r\n return new NotFoundError(message, endpoint);\r\n }\r\n\r\n if (status === 429) {\r\n const retryAfter = response.headers.get('Retry-After');\r\n return new RateLimitError(message, endpoint, retryAfter ? parseInt(retryAfter, 10) : undefined);\r\n }\r\n\r\n if (status === 400) {\r\n return new ValidationError(message, endpoint);\r\n }\r\n\r\n // Default for 5xx or other 4xx\r\n if (endpoint.includes('/api/storage')) {\r\n return new StorageError(message, status, endpoint);\r\n }\r\n\r\n return new UrBackendError(message, status, endpoint);\r\n}\r\n","import { UrBackendClient } from '../client';\r\nimport {\r\n AuthUser,\r\n AuthResponse,\r\n SignUpPayload,\r\n LoginPayload,\r\n UpdateProfilePayload,\r\n ChangePasswordPayload,\r\n VerifyEmailPayload,\r\n ResendOtpPayload,\r\n RequestPasswordResetPayload,\r\n ResetPasswordPayload,\r\n SocialExchangePayload,\r\n SocialExchangeResponse,\r\n RequestOptions,\r\n} from '../types';\r\nimport { AuthError } from '../errors';\r\n\r\nexport class AuthModule {\r\n private sessionToken?: string;\r\n\r\n constructor(private client: UrBackendClient) {}\r\n\r\n /**\r\n * Create a new user account\r\n */\r\n public async signUp(payload: SignUpPayload): Promise<AuthUser> {\r\n return this.client.request<AuthUser>('POST', '/api/userAuth/signup', { body: payload });\r\n }\r\n\r\n /**\r\n * Log in an existing user and store the session token\r\n */\r\n public async login(payload: LoginPayload): Promise<AuthResponse> {\r\n const response = await this.client.request<AuthResponse>('POST', '/api/userAuth/login', {\r\n body: payload,\r\n });\r\n\r\n this.sessionToken = response.accessToken || response.token;\r\n\r\n if (!response.accessToken && response.token) {\r\n console.warn(\r\n 'urbackend-sdk: The server returned \"token\" which is deprecated. Please update your backend to return \"accessToken\".',\r\n );\r\n }\r\n\r\n return response;\r\n }\r\n\r\n /**\r\n * Get the current authenticated user's profile\r\n */\r\n public async me(token?: string): Promise<AuthUser> {\r\n const activeToken = token || this.sessionToken;\r\n\r\n if (!activeToken) {\r\n throw new AuthError(\r\n 'Authentication token is required for /me endpoint',\r\n 401,\r\n '/api/userAuth/me',\r\n );\r\n }\r\n\r\n return this.client.request<AuthUser>('GET', '/api/userAuth/me', { token: activeToken });\r\n }\r\n\r\n /**\r\n * Update the current authenticated user's profile\r\n */\r\n public async updateProfile(payload: UpdateProfilePayload, token?: string): Promise<{ message: string }> {\r\n const activeToken = token || this.sessionToken;\r\n if (!activeToken) {\r\n throw new AuthError('Authentication token is required to update profile', 401, '/api/userAuth/update-profile');\r\n }\r\n return this.client.request<{ message: string }>('PUT', '/api/userAuth/update-profile', {\r\n body: payload,\r\n token: activeToken,\r\n });\r\n }\r\n\r\n /**\r\n * Change the current authenticated user's password\r\n */\r\n public async changePassword(payload: ChangePasswordPayload, token?: string): Promise<{ message: string }> {\r\n const activeToken = token || this.sessionToken;\r\n if (!activeToken) {\r\n throw new AuthError('Authentication token is required to change password', 401, '/api/userAuth/change-password');\r\n }\r\n return this.client.request<{ message: string }>('PUT', '/api/userAuth/change-password', {\r\n body: payload,\r\n token: activeToken,\r\n });\r\n }\r\n\r\n /**\r\n * Verify user email with OTP\r\n */\r\n public async verifyEmail(payload: VerifyEmailPayload): Promise<{ message: string }> {\r\n return this.client.request<{ message: string }>('POST', '/api/userAuth/verify-email', {\r\n body: payload,\r\n });\r\n }\r\n\r\n /**\r\n * Resend verification OTP\r\n */\r\n public async resendVerificationOtp(payload: ResendOtpPayload): Promise<{ message: string }> {\r\n return this.client.request<{ message: string }>('POST', '/api/userAuth/resend-verification-otp', {\r\n body: payload,\r\n });\r\n }\r\n\r\n /**\r\n * Request password reset OTP\r\n */\r\n public async requestPasswordReset(payload: RequestPasswordResetPayload): Promise<{ message: string }> {\r\n return this.client.request<{ message: string }>('POST', '/api/userAuth/request-password-reset', {\r\n body: payload,\r\n });\r\n }\r\n\r\n /**\r\n * Reset user password with OTP\r\n */\r\n public async resetPassword(payload: ResetPasswordPayload): Promise<{ message: string }> {\r\n return this.client.request<{ message: string }>('POST', '/api/userAuth/reset-password', {\r\n body: payload,\r\n });\r\n }\r\n\r\n /**\r\n * Get public-safe profile by username\r\n */\r\n public async publicProfile(username: string): Promise<AuthUser> {\r\n return this.client.request<AuthUser>('GET', `/api/userAuth/public/${username}`);\r\n }\r\n\r\n /**\r\n * Refresh the access token\r\n * @param refreshToken Optional refresh token for header mode. If omitted, uses cookie mode.\r\n */\r\n public async refreshToken(refreshToken?: string): Promise<AuthResponse> {\r\n const options: RequestOptions = {};\r\n if (refreshToken) {\r\n options.headers = { 'x-refresh-token': refreshToken, 'x-refresh-token-mode': 'header' };\r\n } else {\r\n options.credentials = 'include';\r\n }\r\n\r\n const response = await this.client.request<AuthResponse>('POST', '/api/userAuth/refresh-token', options);\r\n this.sessionToken = response.accessToken || response.token;\r\n return response;\r\n }\r\n\r\n /**\r\n * Returns the start URL for social authentication.\r\n * Redirect the user's browser to this URL to begin the flow.\r\n */\r\n public socialStart(provider: 'github' | 'google'): string {\r\n return `${this.client.getBaseUrl()}/api/userAuth/social/${provider}/start?key=${this.client.getApiKey()}`;\r\n }\r\n\r\n /**\r\n * Exchange social auth rtCode for a refresh token\r\n */\r\n public async socialExchange(payload: SocialExchangePayload): Promise<SocialExchangeResponse> {\r\n return this.client.request<SocialExchangeResponse>('POST', '/api/userAuth/social/exchange', {\r\n body: payload,\r\n });\r\n }\r\n\r\n /**\r\n * Revoke the current session and clear local state\r\n */\r\n public async logout(token?: string): Promise<{ success: boolean; message: string }> {\r\n const activeToken = token || this.sessionToken;\r\n let result = { success: true, message: 'Logged out locally' };\r\n\r\n if (activeToken) {\r\n try {\r\n result = await this.client.request<{ success: boolean; message: string }>(\r\n 'POST',\r\n '/api/userAuth/logout',\r\n { token: activeToken, credentials: 'include' },\r\n );\r\n } catch (e) {\r\n // Silently fail if server logout fails, we still want to clear local state\r\n console.warn('urbackend-sdk: Server logout failed', e);\r\n }\r\n }\r\n\r\n this.sessionToken = undefined;\r\n return result;\r\n }\r\n\r\n /**\r\n * Manually set the session token (e.g. after social auth exchange)\r\n */\r\n public setToken(token: string): void {\r\n this.sessionToken = token;\r\n }\r\n\r\n /**\r\n * Get the current stored session token\r\n */\r\n public getToken(): string | undefined {\r\n return this.sessionToken;\r\n }\r\n}\r\n","import { UrBackendClient } from '../client';\r\nimport { DocumentData, InsertPayload, UpdatePayload, PatchPayload, QueryParams } from '../types';\r\nimport { NotFoundError } from '../errors';\r\n\r\nexport class DatabaseModule {\r\n constructor(private client: UrBackendClient) {}\r\n\r\n /**\r\n * Fetch all documents from a collection with optional query parameters\r\n */\r\n public async getAll<T extends DocumentData>(collection: string, params: QueryParams = {}): Promise<T[]> {\r\n const queryString = this.buildQueryString(params);\r\n const path = `/api/data/${collection}${queryString}`;\r\n \r\n try {\r\n return await this.client.request<T[]>('GET', path);\r\n } catch (e) {\r\n if (e instanceof NotFoundError) {\r\n return [] as T[];\r\n }\r\n throw e;\r\n }\r\n }\r\n\r\n /**\r\n * Fetch a single document by its ID\r\n */\r\n public async getOne<T extends DocumentData>(\r\n collection: string, \r\n id: string, \r\n options: { populate?: string | string[]; expand?: string | string[] } = {}\r\n ): Promise<T> {\r\n const queryString = this.buildQueryString(options);\r\n return this.client.request<T>('GET', `/api/data/${collection}/${id}${queryString}`);\r\n }\r\n\r\n /**\r\n * Insert a new document into a collection\r\n */\r\n public async insert<T extends DocumentData>(\r\n collection: string, \r\n data: InsertPayload, \r\n token?: string\r\n ): Promise<T> {\r\n return this.client.request<T>('POST', `/api/data/${collection}`, { \r\n body: data,\r\n token \r\n });\r\n }\r\n\r\n /**\r\n * Update an existing document by its ID (Full replacement)\r\n */\r\n public async update<T extends DocumentData>(\r\n collection: string,\r\n id: string,\r\n data: UpdatePayload,\r\n token?: string\r\n ): Promise<T> {\r\n return this.client.request<T>('PUT', `/api/data/${collection}/${id}`, { \r\n body: data,\r\n token\r\n });\r\n }\r\n\r\n /**\r\n * Partially update an existing document by its ID\r\n */\r\n public async patch<T extends DocumentData>(\r\n collection: string,\r\n id: string,\r\n data: PatchPayload,\r\n token?: string\r\n ): Promise<T> {\r\n return this.client.request<T>('PATCH', `/api/data/${collection}/${id}`, { \r\n body: data,\r\n token\r\n });\r\n }\r\n\r\n /**\r\n * Delete a document by its ID\r\n */\r\n public async delete(collection: string, id: string, token?: string): Promise<{ deleted: boolean }> {\r\n const result = await this.client.request<{ message?: string; id?: string } | null>(\r\n 'DELETE',\r\n `/api/data/${collection}/${id}`,\r\n { token },\r\n );\r\n\r\n const deleted =\r\n typeof result === 'object' &&\r\n result !== null &&\r\n (result.id === id || result.message === 'Document deleted');\r\n\r\n return { deleted };\r\n }\r\n\r\n /**\r\n * Internal helper to build query string from QueryParams\r\n */\r\n private buildQueryString(params: QueryParams): string {\r\n const searchParams = new URLSearchParams();\r\n\r\n Object.entries(params).forEach(([key, value]) => {\r\n if (value === undefined || value === null) return;\r\n\r\n if (key === 'filter' && typeof value === 'object') {\r\n Object.entries(value as Record<string, unknown>).forEach(([fKey, fValue]) => {\r\n if (fValue !== undefined && fValue !== null) {\r\n searchParams.append(fKey, String(fValue));\r\n }\r\n });\r\n } else if ((key === 'populate' || key === 'expand') && Array.isArray(value)) {\r\n searchParams.append(key, value.join(','));\r\n } else {\r\n searchParams.append(key, String(value));\r\n }\r\n });\r\n\r\n const str = searchParams.toString();\r\n return str ? `?${str}` : '';\r\n }\r\n}\r\n","/// <reference lib=\"dom\" />\r\nimport { UrBackendClient } from '../client';\r\nimport { UploadResponse } from '../types';\r\n\r\nexport class StorageModule {\r\n constructor(private client: UrBackendClient) {}\r\n\r\n /**\r\n * Upload a file to storage\r\n */\r\n public async upload(file: unknown, filename?: string): Promise<UploadResponse> {\r\n const formData = new FormData();\r\n\r\n if (\r\n typeof window === 'undefined' &&\r\n typeof Buffer !== 'undefined' &&\r\n Buffer.isBuffer(file)\r\n ) {\r\n // In Node.js environment, convert Buffer to Blob for standard FormData\r\n const blob = new Blob([file as unknown as BlobPart]);\r\n formData.append('file', blob, filename || 'file');\r\n } else {\r\n // Browser File/Blob or Node.js Blob/File\r\n formData.append('file', file as unknown as Blob, filename);\r\n }\r\n\r\n return this.client.request<UploadResponse>('POST', '/api/storage/upload', {\r\n body: formData,\r\n isMultipart: true,\r\n });\r\n }\r\n\r\n /**\r\n * Delete a file from storage by its path\r\n */\r\n public async deleteFile(path: string): Promise<{ deleted: boolean }> {\r\n return this.client.request<{ deleted: boolean }>('DELETE', '/api/storage/file', {\r\n body: { path },\r\n });\r\n }\r\n}\r\n","import { UrBackendClient } from '../client';\r\nimport { CollectionSchema } from '../types';\r\n\r\nexport class SchemaModule {\r\n constructor(private client: UrBackendClient) {}\r\n\r\n /**\r\n * Fetch the schema definition for a collection\r\n */\r\n public async getSchema(collection: string): Promise<CollectionSchema> {\r\n const trimmedCollection = collection.trim();\r\n if (trimmedCollection === '') {\r\n throw new Error('Collection name cannot be empty or whitespace-only');\r\n }\r\n\r\n const encodedCollection = encodeURIComponent(trimmedCollection);\r\n const response = await this.client.request<{\r\n message: string;\r\n collection: CollectionSchema;\r\n }>('GET', `/api/schemas/${encodedCollection}`);\r\n\r\n return response.collection;\r\n }\r\n}","import { UrBackendClient } from '../client';\r\nimport { SendMailPayload, SendMailResponse } from '../types';\r\n\r\nexport class MailModule {\r\n constructor(private client: UrBackendClient) {}\r\n\r\n /**\r\n * Send an email using the urBackend mail service.\r\n * Note: This requires a Secret Key (sk_live_...) and should be called from a server environment.\r\n */\r\n public async send(payload: SendMailPayload): Promise<SendMailResponse> {\r\n return this.client.request<SendMailResponse>('POST', '/api/mail/send', {\r\n body: payload,\r\n });\r\n }\r\n}\r\n","import { UrBackendConfig, RequestOptions } from './types';\r\nimport { UrBackendError, parseApiError } from './errors';\r\nimport { AuthModule } from './modules/auth';\r\nimport { DatabaseModule } from './modules/database';\r\nimport { StorageModule } from './modules/storage';\r\nimport { SchemaModule } from './modules/schema';\r\nimport { MailModule } from './modules/mail';\r\n\r\nexport class UrBackendClient {\r\n private apiKey: string;\r\n private baseUrl: string;\r\n private _auth?: AuthModule;\r\n private _db?: DatabaseModule;\r\n private _storage?: StorageModule;\r\n private _schema?: SchemaModule;\r\n private _mail?: MailModule;\r\n private headers: Record<string, string>;\r\n\r\n constructor(config: UrBackendConfig) {\r\n this.apiKey = config.apiKey;\r\n this.baseUrl = config.baseUrl || 'https://api.ub.bitbros.in';\r\n this.headers = config.headers || {};\r\n\r\n if (typeof window !== 'undefined' && this.apiKey.startsWith('sk_live_')) {\r\n console.warn(\r\n '⚠️ urbackend-sdk: Avoid exposing your Secret Key (sk_live_...) in client-side code. This can lead to unauthorized access to your account and data. Use your Publishable Key (pk_live_...) instead.',\r\n );\r\n }\r\n }\r\n\r\n get auth(): AuthModule {\r\n if (!this._auth) {\r\n this._auth = new AuthModule(this);\r\n }\r\n return this._auth;\r\n }\r\n\r\n get db(): DatabaseModule {\r\n if (!this._db) {\r\n this._db = new DatabaseModule(this);\r\n }\r\n return this._db;\r\n }\r\n\r\n get storage(): StorageModule {\r\n if (!this._storage) {\r\n this._storage = new StorageModule(this);\r\n }\r\n return this._storage;\r\n }\r\n\r\n get schema(): SchemaModule {\r\n if (!this._schema) {\r\n this._schema = new SchemaModule(this);\r\n }\r\n return this._schema;\r\n }\r\n\r\n get mail(): MailModule {\r\n if (!this._mail) {\r\n this._mail = new MailModule(this);\r\n }\r\n return this._mail;\r\n }\r\n\r\n public getBaseUrl(): string {\r\n return this.baseUrl;\r\n }\r\n\r\n public getApiKey(): string {\r\n return this.apiKey;\r\n }\r\n\r\n /**\r\n * Internal request handler\r\n */\r\n public async request<T>(\r\n method: string,\r\n path: string,\r\n options: RequestOptions = {},\r\n ): Promise<T> {\r\n const url = `${this.baseUrl}${path}`;\r\n const headers: Record<string, string> = {\r\n 'x-api-key': this.apiKey,\r\n 'User-Agent': `urbackend-sdk-js/0.2.0`,\r\n ...this.headers,\r\n };\r\n\r\n if (options.token) {\r\n headers['Authorization'] = `Bearer ${options.token}`;\r\n }\r\n\r\n // Merge custom headers from options if provided\r\n if (options.headers) {\r\n Object.assign(headers, options.headers);\r\n }\r\n\r\n let requestBody: BodyInit | undefined;\r\n\r\n if (options.isMultipart) {\r\n // Fetch handles FormData content type and boundary\r\n requestBody = options.body as FormData;\r\n } else if (options.body) {\r\n headers['Content-Type'] = 'application/json';\r\n requestBody = JSON.stringify(options.body);\r\n }\r\n\r\n try {\r\n const response = await fetch(url, {\r\n method,\r\n headers,\r\n body: requestBody,\r\n credentials: options.credentials,\r\n });\r\n\r\n if (!response.ok) {\r\n throw await parseApiError(response);\r\n }\r\n\r\n const contentType = response.headers.get('content-type');\r\n if (contentType && contentType.includes('application/json')) {\r\n const json = await response.json();\r\n // The API returns { data, success, message }\r\n // If data is present, return it. If success/message are present but no data, return the whole object (for exchange/logout etc)\r\n if (json.data !== undefined) {\r\n return json.data;\r\n }\r\n return json;\r\n }\r\n\r\n return (await response.text()) as unknown as T;\r\n } catch (error) {\r\n if (error instanceof UrBackendError) {\r\n throw error;\r\n }\r\n throw new UrBackendError(\r\n error instanceof Error ? error.message : 'Network request failed',\r\n 0,\r\n path,\r\n );\r\n }\r\n }\r\n}\r\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/modules/auth.ts","../src/modules/database.ts","../src/modules/storage.ts","../src/modules/schema.ts","../src/modules/mail.ts","../src/client.ts"],"sourcesContent":["import { UrBackendClient } from './client';\r\nimport { UrBackendConfig } from './types';\r\nimport { AuthModule } from './modules/auth';\r\nimport { DatabaseModule } from './modules/database';\r\nimport { StorageModule } from './modules/storage';\r\nimport { SchemaModule } from './modules/schema';\r\nimport { MailModule } from './modules/mail';\r\n\r\nexport * from './types';\r\nexport * from './errors';\r\nexport { UrBackendClient, AuthModule, DatabaseModule, StorageModule, SchemaModule, MailModule };\r\n\r\n/**\r\n * Factory function to create a new urBackend client\r\n */\r\nexport default function urBackend(config: UrBackendConfig): UrBackendClient {\r\n return new UrBackendClient(config);\r\n}\r\n","export class UrBackendError extends Error {\r\n constructor(\r\n public message: string,\r\n public statusCode: number,\r\n public endpoint: string,\r\n ) {\r\n super(message);\r\n this.name = 'UrBackendError';\r\n }\r\n}\r\n\r\nexport class AuthError extends UrBackendError {\r\n constructor(message: string, statusCode: number, endpoint: string) {\r\n super(message, statusCode, endpoint);\r\n this.name = 'AuthError';\r\n }\r\n}\r\n\r\nexport class NotFoundError extends UrBackendError {\r\n constructor(message: string, endpoint: string) {\r\n super(message, 404, endpoint);\r\n this.name = 'NotFoundError';\r\n }\r\n}\r\n\r\nexport class RateLimitError extends UrBackendError {\r\n public retryAfter?: number;\r\n\r\n constructor(message: string, endpoint: string, retryAfter?: number) {\r\n super(message, 429, endpoint);\r\n this.name = 'RateLimitError';\r\n this.retryAfter = retryAfter;\r\n }\r\n}\r\n\r\nexport class StorageError extends UrBackendError {\r\n constructor(message: string, statusCode: number, endpoint: string) {\r\n super(message, statusCode, endpoint);\r\n this.name = 'StorageError';\r\n }\r\n}\r\n\r\nexport class ValidationError extends UrBackendError {\r\n constructor(message: string, endpoint: string) {\r\n super(message, 400, endpoint);\r\n this.name = 'ValidationError';\r\n }\r\n}\r\n\r\nexport async function parseApiError(response: Response): Promise<UrBackendError> {\r\n const endpoint = new URL(response.url).pathname;\r\n let message = 'An unexpected error occurred';\r\n let data: unknown;\r\n\r\n try {\r\n data = await response.json();\r\n if (typeof data === 'object' && data !== null && 'message' in data) {\r\n message = (data as { message: string }).message || message;\r\n }\r\n } catch {\r\n // If not JSON, use status text\r\n message = response.statusText || message;\r\n }\r\n\r\n const status = response.status;\r\n\r\n if (status === 401 || status === 403) {\r\n return new AuthError(message, status, endpoint);\r\n }\r\n\r\n if (status === 404) {\r\n return new NotFoundError(message, endpoint);\r\n }\r\n\r\n if (status === 429) {\r\n const retryAfter = response.headers.get('Retry-After');\r\n return new RateLimitError(message, endpoint, retryAfter ? parseInt(retryAfter, 10) : undefined);\r\n }\r\n\r\n if (status === 400) {\r\n return new ValidationError(message, endpoint);\r\n }\r\n\r\n // Default for 5xx or other 4xx\r\n if (endpoint.includes('/api/storage')) {\r\n return new StorageError(message, status, endpoint);\r\n }\r\n\r\n return new UrBackendError(message, status, endpoint);\r\n}\r\n","import { UrBackendClient } from '../client';\r\nimport {\r\n AuthUser,\r\n AuthResponse,\r\n SignUpPayload,\r\n LoginPayload,\r\n UpdateProfilePayload,\r\n ChangePasswordPayload,\r\n VerifyEmailPayload,\r\n ResendOtpPayload,\r\n RequestPasswordResetPayload,\r\n ResetPasswordPayload,\r\n SocialExchangePayload,\r\n SocialExchangeResponse,\r\n RequestOptions,\r\n} from '../types';\r\nimport { AuthError } from '../errors';\r\n\r\nexport class AuthModule {\r\n private sessionToken?: string;\r\n\r\n constructor(private client: UrBackendClient) {}\r\n\r\n /**\r\n * Create a new user account\r\n */\r\n public async signUp(payload: SignUpPayload): Promise<AuthUser> {\r\n return this.client.request<AuthUser>('POST', '/api/userAuth/signup', { body: payload });\r\n }\r\n\r\n /**\r\n * Log in an existing user and store the session token\r\n */\r\n public async login(payload: LoginPayload): Promise<AuthResponse> {\r\n const response = await this.client.request<AuthResponse>('POST', '/api/userAuth/login', {\r\n body: payload,\r\n });\r\n\r\n this.sessionToken = response.accessToken || response.token;\r\n\r\n if (!response.accessToken && response.token) {\r\n console.warn(\r\n 'urbackend-sdk: The server returned \"token\" which is deprecated. Please update your backend to return \"accessToken\".',\r\n );\r\n }\r\n\r\n return response;\r\n }\r\n\r\n /**\r\n * Get the current authenticated user's profile\r\n */\r\n public async me(token?: string): Promise<AuthUser> {\r\n const activeToken = token || this.sessionToken;\r\n\r\n if (!activeToken) {\r\n throw new AuthError(\r\n 'Authentication token is required for /me endpoint',\r\n 401,\r\n '/api/userAuth/me',\r\n );\r\n }\r\n\r\n return this.client.request<AuthUser>('GET', '/api/userAuth/me', { token: activeToken });\r\n }\r\n\r\n /**\r\n * Update the current authenticated user's profile\r\n */\r\n public async updateProfile(payload: UpdateProfilePayload, token?: string): Promise<{ message: string }> {\r\n const activeToken = token || this.sessionToken;\r\n if (!activeToken) {\r\n throw new AuthError('Authentication token is required to update profile', 401, '/api/userAuth/update-profile');\r\n }\r\n return this.client.request<{ message: string }>('PUT', '/api/userAuth/update-profile', {\r\n body: payload,\r\n token: activeToken,\r\n });\r\n }\r\n\r\n /**\r\n * Change the current authenticated user's password\r\n */\r\n public async changePassword(payload: ChangePasswordPayload, token?: string): Promise<{ message: string }> {\r\n const activeToken = token || this.sessionToken;\r\n if (!activeToken) {\r\n throw new AuthError('Authentication token is required to change password', 401, '/api/userAuth/change-password');\r\n }\r\n return this.client.request<{ message: string }>('PUT', '/api/userAuth/change-password', {\r\n body: payload,\r\n token: activeToken,\r\n });\r\n }\r\n\r\n /**\r\n * Verify user email with OTP\r\n */\r\n public async verifyEmail(payload: VerifyEmailPayload): Promise<{ message: string }> {\r\n return this.client.request<{ message: string }>('POST', '/api/userAuth/verify-email', {\r\n body: payload,\r\n });\r\n }\r\n\r\n /**\r\n * Resend verification OTP\r\n */\r\n public async resendVerificationOtp(payload: ResendOtpPayload): Promise<{ message: string }> {\r\n return this.client.request<{ message: string }>('POST', '/api/userAuth/resend-verification-otp', {\r\n body: payload,\r\n });\r\n }\r\n\r\n /**\r\n * Request password reset OTP\r\n */\r\n public async requestPasswordReset(payload: RequestPasswordResetPayload): Promise<{ message: string }> {\r\n return this.client.request<{ message: string }>('POST', '/api/userAuth/request-password-reset', {\r\n body: payload,\r\n });\r\n }\r\n\r\n /**\r\n * Reset user password with OTP\r\n */\r\n public async resetPassword(payload: ResetPasswordPayload): Promise<{ message: string }> {\r\n return this.client.request<{ message: string }>('POST', '/api/userAuth/reset-password', {\r\n body: payload,\r\n });\r\n }\r\n\r\n /**\r\n * Get public-safe profile by username\r\n */\r\n public async publicProfile(username: string): Promise<AuthUser> {\r\n return this.client.request<AuthUser>('GET', `/api/userAuth/public/${username}`);\r\n }\r\n\r\n /**\r\n * Refresh the access token\r\n * @param refreshToken Optional refresh token for header mode. If omitted, uses cookie mode.\r\n */\r\n public async refreshToken(refreshToken?: string): Promise<AuthResponse> {\r\n const options: RequestOptions = {};\r\n if (refreshToken) {\r\n options.headers = { 'x-refresh-token': refreshToken, 'x-refresh-token-mode': 'header' };\r\n } else {\r\n options.credentials = 'include';\r\n }\r\n\r\n const response = await this.client.request<AuthResponse>('POST', '/api/userAuth/refresh-token', options);\r\n this.sessionToken = response.accessToken || response.token;\r\n return response;\r\n }\r\n\r\n /**\r\n * Returns the start URL for social authentication.\r\n * Redirect the user's browser to this URL to begin the flow.\r\n */\r\n public socialStart(provider: 'github' | 'google'): string {\r\n return `${this.client.getBaseUrl()}/api/userAuth/social/${provider}/start?key=${this.client.getApiKey()}`;\r\n }\r\n\r\n /**\r\n * Exchange social auth rtCode for a refresh token\r\n */\r\n public async socialExchange(payload: SocialExchangePayload): Promise<SocialExchangeResponse> {\r\n return this.client.request<SocialExchangeResponse>('POST', '/api/userAuth/social/exchange', {\r\n body: payload,\r\n });\r\n }\r\n\r\n /**\r\n * Revoke the current session and clear local state\r\n */\r\n public async logout(token?: string): Promise<{ success: boolean; message: string }> {\r\n const activeToken = token || this.sessionToken;\r\n let result = { success: true, message: 'Logged out locally' };\r\n\r\n if (activeToken) {\r\n try {\r\n result = await this.client.request<{ success: boolean; message: string }>(\r\n 'POST',\r\n '/api/userAuth/logout',\r\n { token: activeToken, credentials: 'include' },\r\n );\r\n } catch (e) {\r\n // Silently fail if server logout fails, we still want to clear local state\r\n console.warn('urbackend-sdk: Server logout failed', e);\r\n }\r\n }\r\n\r\n this.sessionToken = undefined;\r\n return result;\r\n }\r\n\r\n /**\r\n * Manually set the session token (e.g. after social auth exchange)\r\n */\r\n public setToken(token: string): void {\r\n this.sessionToken = token;\r\n }\r\n\r\n /**\r\n * Get the current stored session token\r\n */\r\n public getToken(): string | undefined {\r\n return this.sessionToken;\r\n }\r\n}\r\n","import { UrBackendClient } from '../client';\r\nimport { DocumentData, InsertPayload, UpdatePayload, PatchPayload, QueryParams } from '../types';\r\nimport { NotFoundError } from '../errors';\r\n\r\nexport class DatabaseModule {\r\n constructor(private client: UrBackendClient) {}\r\n\r\n /**\r\n * Fetch all documents from a collection with optional query parameters\r\n */\r\n public async getAll<T extends DocumentData>(collection: string, params: QueryParams = {}): Promise<T[]> {\r\n const queryString = this.buildQueryString(params);\r\n const path = `/api/data/${collection}${queryString}`;\r\n \r\n try {\r\n return await this.client.request<T[]>('GET', path);\r\n } catch (e) {\r\n if (e instanceof NotFoundError) {\r\n return [] as T[];\r\n }\r\n throw e;\r\n }\r\n }\r\n\r\n /**\r\n * Fetch a single document by its ID\r\n */\r\n public async getOne<T extends DocumentData>(\r\n collection: string, \r\n id: string, \r\n options: { populate?: string | string[]; expand?: string | string[] } = {}\r\n ): Promise<T> {\r\n const queryString = this.buildQueryString(options);\r\n return this.client.request<T>('GET', `/api/data/${collection}/${id}${queryString}`);\r\n }\r\n\r\n /**\r\n * Insert a new document into a collection\r\n */\r\n public async insert<T extends DocumentData>(\r\n collection: string, \r\n data: InsertPayload, \r\n token?: string\r\n ): Promise<T> {\r\n return this.client.request<T>('POST', `/api/data/${collection}`, { \r\n body: data,\r\n token \r\n });\r\n }\r\n\r\n /**\r\n * Update an existing document by its ID (Full replacement)\r\n */\r\n public async update<T extends DocumentData>(\r\n collection: string,\r\n id: string,\r\n data: UpdatePayload,\r\n token?: string\r\n ): Promise<T> {\r\n return this.client.request<T>('PUT', `/api/data/${collection}/${id}`, { \r\n body: data,\r\n token\r\n });\r\n }\r\n\r\n /**\r\n * Partially update an existing document by its ID\r\n */\r\n public async patch<T extends DocumentData>(\r\n collection: string,\r\n id: string,\r\n data: PatchPayload,\r\n token?: string\r\n ): Promise<T> {\r\n return this.client.request<T>('PATCH', `/api/data/${collection}/${id}`, { \r\n body: data,\r\n token\r\n });\r\n }\r\n\r\n /**\r\n * Delete a document by its ID\r\n */\r\n public async delete(collection: string, id: string, token?: string): Promise<{ deleted: boolean }> {\r\n const result = await this.client.request<{ message?: string; id?: string } | null>(\r\n 'DELETE',\r\n `/api/data/${collection}/${id}`,\r\n { token },\r\n );\r\n\r\n const deleted =\r\n typeof result === 'object' &&\r\n result !== null &&\r\n (result.id === id || result.message === 'Document deleted');\r\n\r\n return { deleted };\r\n }\r\n\r\n /**\r\n * Internal helper to build query string from QueryParams\r\n */\r\n private buildQueryString(params: QueryParams): string {\r\n const searchParams = new URLSearchParams();\r\n\r\n Object.entries(params).forEach(([key, value]) => {\r\n if (value === undefined || value === null) return;\r\n\r\n if (key === 'filter' && typeof value === 'object') {\r\n Object.entries(value as Record<string, unknown>).forEach(([fKey, fValue]) => {\r\n if (fValue !== undefined && fValue !== null) {\r\n searchParams.append(fKey, String(fValue));\r\n }\r\n });\r\n } else if ((key === 'populate' || key === 'expand') && Array.isArray(value)) {\r\n searchParams.append(key, value.join(','));\r\n } else {\r\n searchParams.append(key, String(value));\r\n }\r\n });\r\n\r\n const str = searchParams.toString();\r\n return str ? `?${str}` : '';\r\n }\r\n}\r\n","/// <reference lib=\"dom\" />\r\nimport { UrBackendClient } from '../client';\r\nimport { UploadResponse } from '../types';\r\n\r\nexport class StorageModule {\r\n constructor(private client: UrBackendClient) {}\r\n\r\n /**\r\n * Upload a file to storage\r\n */\r\n public async upload(file: unknown, filename?: string): Promise<UploadResponse> {\r\n const formData = new FormData();\r\n\r\n if (\r\n typeof window === 'undefined' &&\r\n typeof Buffer !== 'undefined' &&\r\n Buffer.isBuffer(file)\r\n ) {\r\n // In Node.js environment, convert Buffer to Blob for standard FormData\r\n const blob = new Blob([file as unknown as BlobPart]);\r\n formData.append('file', blob, filename || 'file');\r\n } else {\r\n // Browser File/Blob or Node.js Blob/File\r\n formData.append('file', file as unknown as Blob, filename);\r\n }\r\n\r\n return this.client.request<UploadResponse>('POST', '/api/storage/upload', {\r\n body: formData,\r\n isMultipart: true,\r\n });\r\n }\r\n\r\n /**\r\n * Delete a file from storage by its path\r\n */\r\n public async deleteFile(path: string): Promise<{ deleted: boolean }> {\r\n return this.client.request<{ deleted: boolean }>('DELETE', '/api/storage/file', {\r\n body: { path },\r\n });\r\n }\r\n}\r\n","import { UrBackendClient } from '../client';\r\nimport { CollectionSchema } from '../types';\r\n\r\nexport class SchemaModule {\r\n constructor(private client: UrBackendClient) {}\r\n\r\n /**\r\n * Fetch the schema definition for a collection\r\n */\r\n public async getSchema(collection: string): Promise<CollectionSchema> {\r\n const trimmedCollection = collection.trim();\r\n if (trimmedCollection === '') {\r\n throw new Error('Collection name cannot be empty or whitespace-only');\r\n }\r\n\r\n const encodedCollection = encodeURIComponent(trimmedCollection);\r\n const response = await this.client.request<{\r\n message: string;\r\n collection: CollectionSchema;\r\n }>('GET', `/api/schemas/${encodedCollection}`);\r\n\r\n return response.collection;\r\n }\r\n}","import { UrBackendClient } from '../client';\r\nimport { SendMailPayload, SendMailResponse } from '../types';\r\n\r\nexport class MailModule {\r\n constructor(private client: UrBackendClient) {}\r\n\r\n /**\r\n * Send an email using the urBackend mail service.\r\n * Note: This requires a Secret Key (sk_live_...) and should be called from a server environment.\r\n */\r\n public async send(payload: SendMailPayload): Promise<SendMailResponse> {\r\n return this.client.request<SendMailResponse>('POST', '/api/mail/send', {\r\n body: payload,\r\n });\r\n }\r\n}\r\n","import { UrBackendConfig, RequestOptions } from './types';\r\nimport { UrBackendError, parseApiError } from './errors';\r\nimport { AuthModule } from './modules/auth';\r\nimport { DatabaseModule } from './modules/database';\r\nimport { StorageModule } from './modules/storage';\r\nimport { SchemaModule } from './modules/schema';\r\nimport { MailModule } from './modules/mail';\r\n\r\nexport class UrBackendClient {\r\n private apiKey: string;\r\n private baseUrl: string;\r\n private _auth?: AuthModule;\r\n private _db?: DatabaseModule;\r\n private _storage?: StorageModule;\r\n private _schema?: SchemaModule;\r\n private _mail?: MailModule;\r\n private headers: Record<string, string>;\r\n\r\n constructor(config: UrBackendConfig) {\r\n this.apiKey = config.apiKey;\r\n this.baseUrl = config.baseUrl || 'https://api.ub.bitbros.in';\r\n this.headers = config.headers || {};\r\n\r\n if (typeof window !== 'undefined' && this.apiKey.startsWith('sk_live_')) {\r\n console.warn(\r\n '⚠️ urbackend-sdk: Avoid exposing your Secret Key (sk_live_...) in client-side code. This can lead to unauthorized access to your account and data. Use your Publishable Key (pk_live_...) instead.',\r\n );\r\n }\r\n }\r\n\r\n get auth(): AuthModule {\r\n if (!this._auth) {\r\n this._auth = new AuthModule(this);\r\n }\r\n return this._auth;\r\n }\r\n\r\n get db(): DatabaseModule {\r\n if (!this._db) {\r\n this._db = new DatabaseModule(this);\r\n }\r\n return this._db;\r\n }\r\n\r\n get storage(): StorageModule {\r\n if (!this._storage) {\r\n this._storage = new StorageModule(this);\r\n }\r\n return this._storage;\r\n }\r\n\r\n get schema(): SchemaModule {\r\n if (!this._schema) {\r\n this._schema = new SchemaModule(this);\r\n }\r\n return this._schema;\r\n }\r\n\r\n get mail(): MailModule {\r\n if (!this._mail) {\r\n this._mail = new MailModule(this);\r\n }\r\n return this._mail;\r\n }\r\n\r\n public getBaseUrl(): string {\r\n return this.baseUrl;\r\n }\r\n\r\n public getApiKey(): string {\r\n return this.apiKey;\r\n }\r\n\r\n /**\r\n * Internal request handler\r\n */\r\n public async request<T>(\r\n method: string,\r\n path: string,\r\n options: RequestOptions = {},\r\n ): Promise<T> {\r\n const url = `${this.baseUrl}${path}`;\r\n const headers: Record<string, string> = {\r\n 'x-api-key': this.apiKey,\r\n 'User-Agent': `urbackend-sdk-js/0.2.2`,\r\n ...this.headers,\r\n };\r\n\r\n if (options.token) {\r\n headers['Authorization'] = `Bearer ${options.token}`;\r\n }\r\n\r\n // Merge custom headers from options if provided\r\n if (options.headers) {\r\n Object.assign(headers, options.headers);\r\n }\r\n\r\n let requestBody: BodyInit | undefined;\r\n\r\n if (options.isMultipart) {\r\n // Fetch handles FormData content type and boundary\r\n requestBody = options.body as FormData;\r\n } else if (options.body) {\r\n headers['Content-Type'] = 'application/json';\r\n requestBody = JSON.stringify(options.body);\r\n }\r\n\r\n try {\r\n const response = await fetch(url, {\r\n method,\r\n headers,\r\n body: requestBody,\r\n credentials: options.credentials,\r\n });\r\n\r\n if (!response.ok) {\r\n throw await parseApiError(response);\r\n }\r\n\r\n const contentType = response.headers.get('content-type');\r\n if (contentType && contentType.includes('application/json')) {\r\n const json = await response.json();\r\n // The API returns { data, success, message }\r\n // If data is present, return it. If success/message are present but no data, return the whole object (for exchange/logout etc)\r\n if (json.data !== undefined) {\r\n return json.data;\r\n }\r\n return json;\r\n }\r\n\r\n return (await response.text()) as unknown as T;\r\n } catch (error) {\r\n if (error instanceof UrBackendError) {\r\n throw error;\r\n }\r\n throw new UrBackendError(\r\n error instanceof Error ? error.message : 'Network request failed',\r\n 0,\r\n path,\r\n );\r\n }\r\n }\r\n}\r\n"],"mappings":"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","names":[]}
|
package/dist/index.mjs
CHANGED
|
@@ -450,7 +450,7 @@ var UrBackendClient = class {
|
|
|
450
450
|
const url = `${this.baseUrl}${path}`;
|
|
451
451
|
const headers = {
|
|
452
452
|
"x-api-key": this.apiKey,
|
|
453
|
-
"User-Agent": `urbackend-sdk-js/0.2.
|
|
453
|
+
"User-Agent": `urbackend-sdk-js/0.2.2`,
|
|
454
454
|
...this.headers
|
|
455
455
|
};
|
|
456
456
|
if (options.token) {
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors.ts","../src/modules/auth.ts","../src/modules/database.ts","../src/modules/storage.ts","../src/modules/schema.ts","../src/modules/mail.ts","../src/client.ts","../src/index.ts"],"sourcesContent":["export class UrBackendError extends Error {\r\n constructor(\r\n public message: string,\r\n public statusCode: number,\r\n public endpoint: string,\r\n ) {\r\n super(message);\r\n this.name = 'UrBackendError';\r\n }\r\n}\r\n\r\nexport class AuthError extends UrBackendError {\r\n constructor(message: string, statusCode: number, endpoint: string) {\r\n super(message, statusCode, endpoint);\r\n this.name = 'AuthError';\r\n }\r\n}\r\n\r\nexport class NotFoundError extends UrBackendError {\r\n constructor(message: string, endpoint: string) {\r\n super(message, 404, endpoint);\r\n this.name = 'NotFoundError';\r\n }\r\n}\r\n\r\nexport class RateLimitError extends UrBackendError {\r\n public retryAfter?: number;\r\n\r\n constructor(message: string, endpoint: string, retryAfter?: number) {\r\n super(message, 429, endpoint);\r\n this.name = 'RateLimitError';\r\n this.retryAfter = retryAfter;\r\n }\r\n}\r\n\r\nexport class StorageError extends UrBackendError {\r\n constructor(message: string, statusCode: number, endpoint: string) {\r\n super(message, statusCode, endpoint);\r\n this.name = 'StorageError';\r\n }\r\n}\r\n\r\nexport class ValidationError extends UrBackendError {\r\n constructor(message: string, endpoint: string) {\r\n super(message, 400, endpoint);\r\n this.name = 'ValidationError';\r\n }\r\n}\r\n\r\nexport async function parseApiError(response: Response): Promise<UrBackendError> {\r\n const endpoint = new URL(response.url).pathname;\r\n let message = 'An unexpected error occurred';\r\n let data: unknown;\r\n\r\n try {\r\n data = await response.json();\r\n if (typeof data === 'object' && data !== null && 'message' in data) {\r\n message = (data as { message: string }).message || message;\r\n }\r\n } catch {\r\n // If not JSON, use status text\r\n message = response.statusText || message;\r\n }\r\n\r\n const status = response.status;\r\n\r\n if (status === 401 || status === 403) {\r\n return new AuthError(message, status, endpoint);\r\n }\r\n\r\n if (status === 404) {\r\n return new NotFoundError(message, endpoint);\r\n }\r\n\r\n if (status === 429) {\r\n const retryAfter = response.headers.get('Retry-After');\r\n return new RateLimitError(message, endpoint, retryAfter ? parseInt(retryAfter, 10) : undefined);\r\n }\r\n\r\n if (status === 400) {\r\n return new ValidationError(message, endpoint);\r\n }\r\n\r\n // Default for 5xx or other 4xx\r\n if (endpoint.includes('/api/storage')) {\r\n return new StorageError(message, status, endpoint);\r\n }\r\n\r\n return new UrBackendError(message, status, endpoint);\r\n}\r\n","import { UrBackendClient } from '../client';\r\nimport {\r\n AuthUser,\r\n AuthResponse,\r\n SignUpPayload,\r\n LoginPayload,\r\n UpdateProfilePayload,\r\n ChangePasswordPayload,\r\n VerifyEmailPayload,\r\n ResendOtpPayload,\r\n RequestPasswordResetPayload,\r\n ResetPasswordPayload,\r\n SocialExchangePayload,\r\n SocialExchangeResponse,\r\n RequestOptions,\r\n} from '../types';\r\nimport { AuthError } from '../errors';\r\n\r\nexport class AuthModule {\r\n private sessionToken?: string;\r\n\r\n constructor(private client: UrBackendClient) {}\r\n\r\n /**\r\n * Create a new user account\r\n */\r\n public async signUp(payload: SignUpPayload): Promise<AuthUser> {\r\n return this.client.request<AuthUser>('POST', '/api/userAuth/signup', { body: payload });\r\n }\r\n\r\n /**\r\n * Log in an existing user and store the session token\r\n */\r\n public async login(payload: LoginPayload): Promise<AuthResponse> {\r\n const response = await this.client.request<AuthResponse>('POST', '/api/userAuth/login', {\r\n body: payload,\r\n });\r\n\r\n this.sessionToken = response.accessToken || response.token;\r\n\r\n if (!response.accessToken && response.token) {\r\n console.warn(\r\n 'urbackend-sdk: The server returned \"token\" which is deprecated. Please update your backend to return \"accessToken\".',\r\n );\r\n }\r\n\r\n return response;\r\n }\r\n\r\n /**\r\n * Get the current authenticated user's profile\r\n */\r\n public async me(token?: string): Promise<AuthUser> {\r\n const activeToken = token || this.sessionToken;\r\n\r\n if (!activeToken) {\r\n throw new AuthError(\r\n 'Authentication token is required for /me endpoint',\r\n 401,\r\n '/api/userAuth/me',\r\n );\r\n }\r\n\r\n return this.client.request<AuthUser>('GET', '/api/userAuth/me', { token: activeToken });\r\n }\r\n\r\n /**\r\n * Update the current authenticated user's profile\r\n */\r\n public async updateProfile(payload: UpdateProfilePayload, token?: string): Promise<{ message: string }> {\r\n const activeToken = token || this.sessionToken;\r\n if (!activeToken) {\r\n throw new AuthError('Authentication token is required to update profile', 401, '/api/userAuth/update-profile');\r\n }\r\n return this.client.request<{ message: string }>('PUT', '/api/userAuth/update-profile', {\r\n body: payload,\r\n token: activeToken,\r\n });\r\n }\r\n\r\n /**\r\n * Change the current authenticated user's password\r\n */\r\n public async changePassword(payload: ChangePasswordPayload, token?: string): Promise<{ message: string }> {\r\n const activeToken = token || this.sessionToken;\r\n if (!activeToken) {\r\n throw new AuthError('Authentication token is required to change password', 401, '/api/userAuth/change-password');\r\n }\r\n return this.client.request<{ message: string }>('PUT', '/api/userAuth/change-password', {\r\n body: payload,\r\n token: activeToken,\r\n });\r\n }\r\n\r\n /**\r\n * Verify user email with OTP\r\n */\r\n public async verifyEmail(payload: VerifyEmailPayload): Promise<{ message: string }> {\r\n return this.client.request<{ message: string }>('POST', '/api/userAuth/verify-email', {\r\n body: payload,\r\n });\r\n }\r\n\r\n /**\r\n * Resend verification OTP\r\n */\r\n public async resendVerificationOtp(payload: ResendOtpPayload): Promise<{ message: string }> {\r\n return this.client.request<{ message: string }>('POST', '/api/userAuth/resend-verification-otp', {\r\n body: payload,\r\n });\r\n }\r\n\r\n /**\r\n * Request password reset OTP\r\n */\r\n public async requestPasswordReset(payload: RequestPasswordResetPayload): Promise<{ message: string }> {\r\n return this.client.request<{ message: string }>('POST', '/api/userAuth/request-password-reset', {\r\n body: payload,\r\n });\r\n }\r\n\r\n /**\r\n * Reset user password with OTP\r\n */\r\n public async resetPassword(payload: ResetPasswordPayload): Promise<{ message: string }> {\r\n return this.client.request<{ message: string }>('POST', '/api/userAuth/reset-password', {\r\n body: payload,\r\n });\r\n }\r\n\r\n /**\r\n * Get public-safe profile by username\r\n */\r\n public async publicProfile(username: string): Promise<AuthUser> {\r\n return this.client.request<AuthUser>('GET', `/api/userAuth/public/${username}`);\r\n }\r\n\r\n /**\r\n * Refresh the access token\r\n * @param refreshToken Optional refresh token for header mode. If omitted, uses cookie mode.\r\n */\r\n public async refreshToken(refreshToken?: string): Promise<AuthResponse> {\r\n const options: RequestOptions = {};\r\n if (refreshToken) {\r\n options.headers = { 'x-refresh-token': refreshToken, 'x-refresh-token-mode': 'header' };\r\n } else {\r\n options.credentials = 'include';\r\n }\r\n\r\n const response = await this.client.request<AuthResponse>('POST', '/api/userAuth/refresh-token', options);\r\n this.sessionToken = response.accessToken || response.token;\r\n return response;\r\n }\r\n\r\n /**\r\n * Returns the start URL for social authentication.\r\n * Redirect the user's browser to this URL to begin the flow.\r\n */\r\n public socialStart(provider: 'github' | 'google'): string {\r\n return `${this.client.getBaseUrl()}/api/userAuth/social/${provider}/start?key=${this.client.getApiKey()}`;\r\n }\r\n\r\n /**\r\n * Exchange social auth rtCode for a refresh token\r\n */\r\n public async socialExchange(payload: SocialExchangePayload): Promise<SocialExchangeResponse> {\r\n return this.client.request<SocialExchangeResponse>('POST', '/api/userAuth/social/exchange', {\r\n body: payload,\r\n });\r\n }\r\n\r\n /**\r\n * Revoke the current session and clear local state\r\n */\r\n public async logout(token?: string): Promise<{ success: boolean; message: string }> {\r\n const activeToken = token || this.sessionToken;\r\n let result = { success: true, message: 'Logged out locally' };\r\n\r\n if (activeToken) {\r\n try {\r\n result = await this.client.request<{ success: boolean; message: string }>(\r\n 'POST',\r\n '/api/userAuth/logout',\r\n { token: activeToken, credentials: 'include' },\r\n );\r\n } catch (e) {\r\n // Silently fail if server logout fails, we still want to clear local state\r\n console.warn('urbackend-sdk: Server logout failed', e);\r\n }\r\n }\r\n\r\n this.sessionToken = undefined;\r\n return result;\r\n }\r\n\r\n /**\r\n * Manually set the session token (e.g. after social auth exchange)\r\n */\r\n public setToken(token: string): void {\r\n this.sessionToken = token;\r\n }\r\n\r\n /**\r\n * Get the current stored session token\r\n */\r\n public getToken(): string | undefined {\r\n return this.sessionToken;\r\n }\r\n}\r\n","import { UrBackendClient } from '../client';\r\nimport { DocumentData, InsertPayload, UpdatePayload, PatchPayload, QueryParams } from '../types';\r\nimport { NotFoundError } from '../errors';\r\n\r\nexport class DatabaseModule {\r\n constructor(private client: UrBackendClient) {}\r\n\r\n /**\r\n * Fetch all documents from a collection with optional query parameters\r\n */\r\n public async getAll<T extends DocumentData>(collection: string, params: QueryParams = {}): Promise<T[]> {\r\n const queryString = this.buildQueryString(params);\r\n const path = `/api/data/${collection}${queryString}`;\r\n \r\n try {\r\n return await this.client.request<T[]>('GET', path);\r\n } catch (e) {\r\n if (e instanceof NotFoundError) {\r\n return [] as T[];\r\n }\r\n throw e;\r\n }\r\n }\r\n\r\n /**\r\n * Fetch a single document by its ID\r\n */\r\n public async getOne<T extends DocumentData>(\r\n collection: string, \r\n id: string, \r\n options: { populate?: string | string[]; expand?: string | string[] } = {}\r\n ): Promise<T> {\r\n const queryString = this.buildQueryString(options);\r\n return this.client.request<T>('GET', `/api/data/${collection}/${id}${queryString}`);\r\n }\r\n\r\n /**\r\n * Insert a new document into a collection\r\n */\r\n public async insert<T extends DocumentData>(\r\n collection: string, \r\n data: InsertPayload, \r\n token?: string\r\n ): Promise<T> {\r\n return this.client.request<T>('POST', `/api/data/${collection}`, { \r\n body: data,\r\n token \r\n });\r\n }\r\n\r\n /**\r\n * Update an existing document by its ID (Full replacement)\r\n */\r\n public async update<T extends DocumentData>(\r\n collection: string,\r\n id: string,\r\n data: UpdatePayload,\r\n token?: string\r\n ): Promise<T> {\r\n return this.client.request<T>('PUT', `/api/data/${collection}/${id}`, { \r\n body: data,\r\n token\r\n });\r\n }\r\n\r\n /**\r\n * Partially update an existing document by its ID\r\n */\r\n public async patch<T extends DocumentData>(\r\n collection: string,\r\n id: string,\r\n data: PatchPayload,\r\n token?: string\r\n ): Promise<T> {\r\n return this.client.request<T>('PATCH', `/api/data/${collection}/${id}`, { \r\n body: data,\r\n token\r\n });\r\n }\r\n\r\n /**\r\n * Delete a document by its ID\r\n */\r\n public async delete(collection: string, id: string, token?: string): Promise<{ deleted: boolean }> {\r\n const result = await this.client.request<{ message?: string; id?: string } | null>(\r\n 'DELETE',\r\n `/api/data/${collection}/${id}`,\r\n { token },\r\n );\r\n\r\n const deleted =\r\n typeof result === 'object' &&\r\n result !== null &&\r\n (result.id === id || result.message === 'Document deleted');\r\n\r\n return { deleted };\r\n }\r\n\r\n /**\r\n * Internal helper to build query string from QueryParams\r\n */\r\n private buildQueryString(params: QueryParams): string {\r\n const searchParams = new URLSearchParams();\r\n\r\n Object.entries(params).forEach(([key, value]) => {\r\n if (value === undefined || value === null) return;\r\n\r\n if (key === 'filter' && typeof value === 'object') {\r\n Object.entries(value as Record<string, unknown>).forEach(([fKey, fValue]) => {\r\n if (fValue !== undefined && fValue !== null) {\r\n searchParams.append(fKey, String(fValue));\r\n }\r\n });\r\n } else if ((key === 'populate' || key === 'expand') && Array.isArray(value)) {\r\n searchParams.append(key, value.join(','));\r\n } else {\r\n searchParams.append(key, String(value));\r\n }\r\n });\r\n\r\n const str = searchParams.toString();\r\n return str ? `?${str}` : '';\r\n }\r\n}\r\n","/// <reference lib=\"dom\" />\r\nimport { UrBackendClient } from '../client';\r\nimport { UploadResponse } from '../types';\r\n\r\nexport class StorageModule {\r\n constructor(private client: UrBackendClient) {}\r\n\r\n /**\r\n * Upload a file to storage\r\n */\r\n public async upload(file: unknown, filename?: string): Promise<UploadResponse> {\r\n const formData = new FormData();\r\n\r\n if (\r\n typeof window === 'undefined' &&\r\n typeof Buffer !== 'undefined' &&\r\n Buffer.isBuffer(file)\r\n ) {\r\n // In Node.js environment, convert Buffer to Blob for standard FormData\r\n const blob = new Blob([file as unknown as BlobPart]);\r\n formData.append('file', blob, filename || 'file');\r\n } else {\r\n // Browser File/Blob or Node.js Blob/File\r\n formData.append('file', file as unknown as Blob, filename);\r\n }\r\n\r\n return this.client.request<UploadResponse>('POST', '/api/storage/upload', {\r\n body: formData,\r\n isMultipart: true,\r\n });\r\n }\r\n\r\n /**\r\n * Delete a file from storage by its path\r\n */\r\n public async deleteFile(path: string): Promise<{ deleted: boolean }> {\r\n return this.client.request<{ deleted: boolean }>('DELETE', '/api/storage/file', {\r\n body: { path },\r\n });\r\n }\r\n}\r\n","import { UrBackendClient } from '../client';\r\nimport { CollectionSchema } from '../types';\r\n\r\nexport class SchemaModule {\r\n constructor(private client: UrBackendClient) {}\r\n\r\n /**\r\n * Fetch the schema definition for a collection\r\n */\r\n public async getSchema(collection: string): Promise<CollectionSchema> {\r\n const trimmedCollection = collection.trim();\r\n if (trimmedCollection === '') {\r\n throw new Error('Collection name cannot be empty or whitespace-only');\r\n }\r\n\r\n const encodedCollection = encodeURIComponent(trimmedCollection);\r\n const response = await this.client.request<{\r\n message: string;\r\n collection: CollectionSchema;\r\n }>('GET', `/api/schemas/${encodedCollection}`);\r\n\r\n return response.collection;\r\n }\r\n}","import { UrBackendClient } from '../client';\r\nimport { SendMailPayload, SendMailResponse } from '../types';\r\n\r\nexport class MailModule {\r\n constructor(private client: UrBackendClient) {}\r\n\r\n /**\r\n * Send an email using the urBackend mail service.\r\n * Note: This requires a Secret Key (sk_live_...) and should be called from a server environment.\r\n */\r\n public async send(payload: SendMailPayload): Promise<SendMailResponse> {\r\n return this.client.request<SendMailResponse>('POST', '/api/mail/send', {\r\n body: payload,\r\n });\r\n }\r\n}\r\n","import { UrBackendConfig, RequestOptions } from './types';\r\nimport { UrBackendError, parseApiError } from './errors';\r\nimport { AuthModule } from './modules/auth';\r\nimport { DatabaseModule } from './modules/database';\r\nimport { StorageModule } from './modules/storage';\r\nimport { SchemaModule } from './modules/schema';\r\nimport { MailModule } from './modules/mail';\r\n\r\nexport class UrBackendClient {\r\n private apiKey: string;\r\n private baseUrl: string;\r\n private _auth?: AuthModule;\r\n private _db?: DatabaseModule;\r\n private _storage?: StorageModule;\r\n private _schema?: SchemaModule;\r\n private _mail?: MailModule;\r\n private headers: Record<string, string>;\r\n\r\n constructor(config: UrBackendConfig) {\r\n this.apiKey = config.apiKey;\r\n this.baseUrl = config.baseUrl || 'https://api.ub.bitbros.in';\r\n this.headers = config.headers || {};\r\n\r\n if (typeof window !== 'undefined' && this.apiKey.startsWith('sk_live_')) {\r\n console.warn(\r\n '⚠️ urbackend-sdk: Avoid exposing your Secret Key (sk_live_...) in client-side code. This can lead to unauthorized access to your account and data. Use your Publishable Key (pk_live_...) instead.',\r\n );\r\n }\r\n }\r\n\r\n get auth(): AuthModule {\r\n if (!this._auth) {\r\n this._auth = new AuthModule(this);\r\n }\r\n return this._auth;\r\n }\r\n\r\n get db(): DatabaseModule {\r\n if (!this._db) {\r\n this._db = new DatabaseModule(this);\r\n }\r\n return this._db;\r\n }\r\n\r\n get storage(): StorageModule {\r\n if (!this._storage) {\r\n this._storage = new StorageModule(this);\r\n }\r\n return this._storage;\r\n }\r\n\r\n get schema(): SchemaModule {\r\n if (!this._schema) {\r\n this._schema = new SchemaModule(this);\r\n }\r\n return this._schema;\r\n }\r\n\r\n get mail(): MailModule {\r\n if (!this._mail) {\r\n this._mail = new MailModule(this);\r\n }\r\n return this._mail;\r\n }\r\n\r\n public getBaseUrl(): string {\r\n return this.baseUrl;\r\n }\r\n\r\n public getApiKey(): string {\r\n return this.apiKey;\r\n }\r\n\r\n /**\r\n * Internal request handler\r\n */\r\n public async request<T>(\r\n method: string,\r\n path: string,\r\n options: RequestOptions = {},\r\n ): Promise<T> {\r\n const url = `${this.baseUrl}${path}`;\r\n const headers: Record<string, string> = {\r\n 'x-api-key': this.apiKey,\r\n 'User-Agent': `urbackend-sdk-js/0.2.0`,\r\n ...this.headers,\r\n };\r\n\r\n if (options.token) {\r\n headers['Authorization'] = `Bearer ${options.token}`;\r\n }\r\n\r\n // Merge custom headers from options if provided\r\n if (options.headers) {\r\n Object.assign(headers, options.headers);\r\n }\r\n\r\n let requestBody: BodyInit | undefined;\r\n\r\n if (options.isMultipart) {\r\n // Fetch handles FormData content type and boundary\r\n requestBody = options.body as FormData;\r\n } else if (options.body) {\r\n headers['Content-Type'] = 'application/json';\r\n requestBody = JSON.stringify(options.body);\r\n }\r\n\r\n try {\r\n const response = await fetch(url, {\r\n method,\r\n headers,\r\n body: requestBody,\r\n credentials: options.credentials,\r\n });\r\n\r\n if (!response.ok) {\r\n throw await parseApiError(response);\r\n }\r\n\r\n const contentType = response.headers.get('content-type');\r\n if (contentType && contentType.includes('application/json')) {\r\n const json = await response.json();\r\n // The API returns { data, success, message }\r\n // If data is present, return it. If success/message are present but no data, return the whole object (for exchange/logout etc)\r\n if (json.data !== undefined) {\r\n return json.data;\r\n }\r\n return json;\r\n }\r\n\r\n return (await response.text()) as unknown as T;\r\n } catch (error) {\r\n if (error instanceof UrBackendError) {\r\n throw error;\r\n }\r\n throw new UrBackendError(\r\n error instanceof Error ? error.message : 'Network request failed',\r\n 0,\r\n path,\r\n );\r\n }\r\n }\r\n}\r\n","import { UrBackendClient } from './client';\r\nimport { UrBackendConfig } from './types';\r\nimport { AuthModule } from './modules/auth';\r\nimport { DatabaseModule } from './modules/database';\r\nimport { StorageModule } from './modules/storage';\r\nimport { SchemaModule } from './modules/schema';\r\nimport { MailModule } from './modules/mail';\r\n\r\nexport * from './types';\r\nexport * from './errors';\r\nexport { UrBackendClient, AuthModule, DatabaseModule, StorageModule, SchemaModule, MailModule };\r\n\r\n/**\r\n * Factory function to create a new urBackend client\r\n */\r\nexport default function urBackend(config: UrBackendConfig): UrBackendClient {\r\n return new UrBackendClient(config);\r\n}\r\n"],"mappings":";AAAO,IAAM,iBAAN,cAA6B,MAAM;AAAA,EACxC,YACS,SACA,YACA,UACP;AACA,UAAM,OAAO;AAJN;AACA;AACA;AAGP,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,YAAN,cAAwB,eAAe;AAAA,EAC5C,YAAY,SAAiB,YAAoB,UAAkB;AACjE,UAAM,SAAS,YAAY,QAAQ;AACnC,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,gBAAN,cAA4B,eAAe;AAAA,EAChD,YAAY,SAAiB,UAAkB;AAC7C,UAAM,SAAS,KAAK,QAAQ;AAC5B,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,iBAAN,cAA6B,eAAe;AAAA,EAGjD,YAAY,SAAiB,UAAkB,YAAqB;AAClE,UAAM,SAAS,KAAK,QAAQ;AAC5B,SAAK,OAAO;AACZ,SAAK,aAAa;AAAA,EACpB;AACF;AAEO,IAAM,eAAN,cAA2B,eAAe;AAAA,EAC/C,YAAY,SAAiB,YAAoB,UAAkB;AACjE,UAAM,SAAS,YAAY,QAAQ;AACnC,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,kBAAN,cAA8B,eAAe;AAAA,EAClD,YAAY,SAAiB,UAAkB;AAC7C,UAAM,SAAS,KAAK,QAAQ;AAC5B,SAAK,OAAO;AAAA,EACd;AACF;AAEA,eAAsB,cAAc,UAA6C;AAC/E,QAAM,WAAW,IAAI,IAAI,SAAS,GAAG,EAAE;AACvC,MAAI,UAAU;AACd,MAAI;AAEJ,MAAI;AACF,WAAO,MAAM,SAAS,KAAK;AAC3B,QAAI,OAAO,SAAS,YAAY,SAAS,QAAQ,aAAa,MAAM;AAClE,gBAAW,KAA6B,WAAW;AAAA,IACrD;AAAA,EACF,QAAQ;AAEN,cAAU,SAAS,cAAc;AAAA,EACnC;AAEA,QAAM,SAAS,SAAS;AAExB,MAAI,WAAW,OAAO,WAAW,KAAK;AACpC,WAAO,IAAI,UAAU,SAAS,QAAQ,QAAQ;AAAA,EAChD;AAEA,MAAI,WAAW,KAAK;AAClB,WAAO,IAAI,cAAc,SAAS,QAAQ;AAAA,EAC5C;AAEA,MAAI,WAAW,KAAK;AAClB,UAAM,aAAa,SAAS,QAAQ,IAAI,aAAa;AACrD,WAAO,IAAI,eAAe,SAAS,UAAU,aAAa,SAAS,YAAY,EAAE,IAAI,MAAS;AAAA,EAChG;AAEA,MAAI,WAAW,KAAK;AAClB,WAAO,IAAI,gBAAgB,SAAS,QAAQ;AAAA,EAC9C;AAGA,MAAI,SAAS,SAAS,cAAc,GAAG;AACrC,WAAO,IAAI,aAAa,SAAS,QAAQ,QAAQ;AAAA,EACnD;AAEA,SAAO,IAAI,eAAe,SAAS,QAAQ,QAAQ;AACrD;;;ACvEO,IAAM,aAAN,MAAiB;AAAA,EAGtB,YAAoB,QAAyB;AAAzB;AAAA,EAA0B;AAAA;AAAA;AAAA;AAAA,EAK9C,MAAa,OAAO,SAA2C;AAC7D,WAAO,KAAK,OAAO,QAAkB,QAAQ,wBAAwB,EAAE,MAAM,QAAQ,CAAC;AAAA,EACxF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,MAAM,SAA8C;AAC/D,UAAM,WAAW,MAAM,KAAK,OAAO,QAAsB,QAAQ,uBAAuB;AAAA,MACtF,MAAM;AAAA,IACR,CAAC;AAED,SAAK,eAAe,SAAS,eAAe,SAAS;AAErD,QAAI,CAAC,SAAS,eAAe,SAAS,OAAO;AAC3C,cAAQ;AAAA,QACN;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,GAAG,OAAmC;AACjD,UAAM,cAAc,SAAS,KAAK;AAElC,QAAI,CAAC,aAAa;AAChB,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,WAAO,KAAK,OAAO,QAAkB,OAAO,oBAAoB,EAAE,OAAO,YAAY,CAAC;AAAA,EACxF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,cAAc,SAA+B,OAA8C;AACtG,UAAM,cAAc,SAAS,KAAK;AAClC,QAAI,CAAC,aAAa;AAChB,YAAM,IAAI,UAAU,sDAAsD,KAAK,8BAA8B;AAAA,IAC/G;AACA,WAAO,KAAK,OAAO,QAA6B,OAAO,gCAAgC;AAAA,MACrF,MAAM;AAAA,MACN,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,eAAe,SAAgC,OAA8C;AACxG,UAAM,cAAc,SAAS,KAAK;AAClC,QAAI,CAAC,aAAa;AAChB,YAAM,IAAI,UAAU,uDAAuD,KAAK,+BAA+B;AAAA,IACjH;AACA,WAAO,KAAK,OAAO,QAA6B,OAAO,iCAAiC;AAAA,MACtF,MAAM;AAAA,MACN,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,YAAY,SAA2D;AAClF,WAAO,KAAK,OAAO,QAA6B,QAAQ,8BAA8B;AAAA,MACpF,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,sBAAsB,SAAyD;AAC1F,WAAO,KAAK,OAAO,QAA6B,QAAQ,yCAAyC;AAAA,MAC/F,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,qBAAqB,SAAoE;AACpG,WAAO,KAAK,OAAO,QAA6B,QAAQ,wCAAwC;AAAA,MAC9F,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,cAAc,SAA6D;AACtF,WAAO,KAAK,OAAO,QAA6B,QAAQ,gCAAgC;AAAA,MACtF,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,cAAc,UAAqC;AAC9D,WAAO,KAAK,OAAO,QAAkB,OAAO,wBAAwB,QAAQ,EAAE;AAAA,EAChF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAa,aAAa,cAA8C;AACtE,UAAM,UAA0B,CAAC;AACjC,QAAI,cAAc;AAChB,cAAQ,UAAU,EAAE,mBAAmB,cAAc,wBAAwB,SAAS;AAAA,IACxF,OAAO;AACL,cAAQ,cAAc;AAAA,IACxB;AAEA,UAAM,WAAW,MAAM,KAAK,OAAO,QAAsB,QAAQ,+BAA+B,OAAO;AACvG,SAAK,eAAe,SAAS,eAAe,SAAS;AACrD,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,YAAY,UAAuC;AACxD,WAAO,GAAG,KAAK,OAAO,WAAW,CAAC,wBAAwB,QAAQ,cAAc,KAAK,OAAO,UAAU,CAAC;AAAA,EACzG;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,eAAe,SAAiE;AAC3F,WAAO,KAAK,OAAO,QAAgC,QAAQ,iCAAiC;AAAA,MAC1F,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,OAAO,OAAgE;AAClF,UAAM,cAAc,SAAS,KAAK;AAClC,QAAI,SAAS,EAAE,SAAS,MAAM,SAAS,qBAAqB;AAE5D,QAAI,aAAa;AACf,UAAI;AACF,iBAAS,MAAM,KAAK,OAAO;AAAA,UACzB;AAAA,UACA;AAAA,UACA,EAAE,OAAO,aAAa,aAAa,UAAU;AAAA,QAC/C;AAAA,MACF,SAAS,GAAG;AAEV,gBAAQ,KAAK,uCAAuC,CAAC;AAAA,MACvD;AAAA,IACF;AAEA,SAAK,eAAe;AACpB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKO,SAAS,OAAqB;AACnC,SAAK,eAAe;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKO,WAA+B;AACpC,WAAO,KAAK;AAAA,EACd;AACF;;;AC5MO,IAAM,iBAAN,MAAqB;AAAA,EAC1B,YAAoB,QAAyB;AAAzB;AAAA,EAA0B;AAAA;AAAA;AAAA;AAAA,EAK9C,MAAa,OAA+B,YAAoB,SAAsB,CAAC,GAAiB;AACtG,UAAM,cAAc,KAAK,iBAAiB,MAAM;AAChD,UAAM,OAAO,aAAa,UAAU,GAAG,WAAW;AAElD,QAAI;AACF,aAAO,MAAM,KAAK,OAAO,QAAa,OAAO,IAAI;AAAA,IACnD,SAAS,GAAG;AACV,UAAI,aAAa,eAAe;AAC9B,eAAO,CAAC;AAAA,MACV;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,OACX,YACA,IACA,UAAwE,CAAC,GAC7D;AACZ,UAAM,cAAc,KAAK,iBAAiB,OAAO;AACjD,WAAO,KAAK,OAAO,QAAW,OAAO,aAAa,UAAU,IAAI,EAAE,GAAG,WAAW,EAAE;AAAA,EACpF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,OACX,YACA,MACA,OACY;AACZ,WAAO,KAAK,OAAO,QAAW,QAAQ,aAAa,UAAU,IAAI;AAAA,MAC/D,MAAM;AAAA,MACN;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,OACX,YACA,IACA,MACA,OACY;AACZ,WAAO,KAAK,OAAO,QAAW,OAAO,aAAa,UAAU,IAAI,EAAE,IAAI;AAAA,MACpE,MAAM;AAAA,MACN;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,MACX,YACA,IACA,MACA,OACY;AACZ,WAAO,KAAK,OAAO,QAAW,SAAS,aAAa,UAAU,IAAI,EAAE,IAAI;AAAA,MACtE,MAAM;AAAA,MACN;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,OAAO,YAAoB,IAAY,OAA+C;AACjG,UAAM,SAAS,MAAM,KAAK,OAAO;AAAA,MAC/B;AAAA,MACA,aAAa,UAAU,IAAI,EAAE;AAAA,MAC7B,EAAE,MAAM;AAAA,IACV;AAEA,UAAM,UACJ,OAAO,WAAW,YAClB,WAAW,SACV,OAAO,OAAO,MAAM,OAAO,YAAY;AAE1C,WAAO,EAAE,QAAQ;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAiB,QAA6B;AACpD,UAAM,eAAe,IAAI,gBAAgB;AAEzC,WAAO,QAAQ,MAAM,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AAC/C,UAAI,UAAU,UAAa,UAAU,KAAM;AAE3C,UAAI,QAAQ,YAAY,OAAO,UAAU,UAAU;AACjD,eAAO,QAAQ,KAAgC,EAAE,QAAQ,CAAC,CAAC,MAAM,MAAM,MAAM;AAC3E,cAAI,WAAW,UAAa,WAAW,MAAM;AAC3C,yBAAa,OAAO,MAAM,OAAO,MAAM,CAAC;AAAA,UAC1C;AAAA,QACF,CAAC;AAAA,MACH,YAAY,QAAQ,cAAc,QAAQ,aAAa,MAAM,QAAQ,KAAK,GAAG;AAC3E,qBAAa,OAAO,KAAK,MAAM,KAAK,GAAG,CAAC;AAAA,MAC1C,OAAO;AACL,qBAAa,OAAO,KAAK,OAAO,KAAK,CAAC;AAAA,MACxC;AAAA,IACF,CAAC;AAED,UAAM,MAAM,aAAa,SAAS;AAClC,WAAO,MAAM,IAAI,GAAG,KAAK;AAAA,EAC3B;AACF;;;ACvHO,IAAM,gBAAN,MAAoB;AAAA,EACzB,YAAoB,QAAyB;AAAzB;AAAA,EAA0B;AAAA;AAAA;AAAA;AAAA,EAK9C,MAAa,OAAO,MAAe,UAA4C;AAC7E,UAAM,WAAW,IAAI,SAAS;AAE9B,QACE,OAAO,WAAW,eAClB,OAAO,WAAW,eAClB,OAAO,SAAS,IAAI,GACpB;AAEA,YAAM,OAAO,IAAI,KAAK,CAAC,IAA2B,CAAC;AACnD,eAAS,OAAO,QAAQ,MAAM,YAAY,MAAM;AAAA,IAClD,OAAO;AAEL,eAAS,OAAO,QAAQ,MAAyB,QAAQ;AAAA,IAC3D;AAEA,WAAO,KAAK,OAAO,QAAwB,QAAQ,uBAAuB;AAAA,MACxE,MAAM;AAAA,MACN,aAAa;AAAA,IACf,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,WAAW,MAA6C;AACnE,WAAO,KAAK,OAAO,QAA8B,UAAU,qBAAqB;AAAA,MAC9E,MAAM,EAAE,KAAK;AAAA,IACf,CAAC;AAAA,EACH;AACF;;;ACrCO,IAAM,eAAN,MAAmB;AAAA,EACxB,YAAoB,QAAyB;AAAzB;AAAA,EAA0B;AAAA;AAAA;AAAA;AAAA,EAK9C,MAAa,UAAU,YAA+C;AACpE,UAAM,oBAAoB,WAAW,KAAK;AAC1C,QAAI,sBAAsB,IAAI;AAC5B,YAAM,IAAI,MAAM,oDAAoD;AAAA,IACtE;AAEA,UAAM,oBAAoB,mBAAmB,iBAAiB;AAC9D,UAAM,WAAW,MAAM,KAAK,OAAO,QAGhC,OAAO,gBAAgB,iBAAiB,EAAE;AAE7C,WAAO,SAAS;AAAA,EAClB;AACF;;;ACpBO,IAAM,aAAN,MAAiB;AAAA,EACtB,YAAoB,QAAyB;AAAzB;AAAA,EAA0B;AAAA;AAAA;AAAA;AAAA;AAAA,EAM9C,MAAa,KAAK,SAAqD;AACrE,WAAO,KAAK,OAAO,QAA0B,QAAQ,kBAAkB;AAAA,MACrE,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AACF;;;ACPO,IAAM,kBAAN,MAAsB;AAAA,EAU3B,YAAY,QAAyB;AACnC,SAAK,SAAS,OAAO;AACrB,SAAK,UAAU,OAAO,WAAW;AACjC,SAAK,UAAU,OAAO,WAAW,CAAC;AAElC,QAAI,OAAO,WAAW,eAAe,KAAK,OAAO,WAAW,UAAU,GAAG;AACvE,cAAQ;AAAA,QACN;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,IAAI,OAAmB;AACrB,QAAI,CAAC,KAAK,OAAO;AACf,WAAK,QAAQ,IAAI,WAAW,IAAI;AAAA,IAClC;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,KAAqB;AACvB,QAAI,CAAC,KAAK,KAAK;AACb,WAAK,MAAM,IAAI,eAAe,IAAI;AAAA,IACpC;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,UAAyB;AAC3B,QAAI,CAAC,KAAK,UAAU;AAClB,WAAK,WAAW,IAAI,cAAc,IAAI;AAAA,IACxC;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,SAAuB;AACzB,QAAI,CAAC,KAAK,SAAS;AACjB,WAAK,UAAU,IAAI,aAAa,IAAI;AAAA,IACtC;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,OAAmB;AACrB,QAAI,CAAC,KAAK,OAAO;AACf,WAAK,QAAQ,IAAI,WAAW,IAAI;AAAA,IAClC;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,aAAqB;AAC1B,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,YAAoB;AACzB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,QACX,QACA,MACA,UAA0B,CAAC,GACf;AACZ,UAAM,MAAM,GAAG,KAAK,OAAO,GAAG,IAAI;AAClC,UAAM,UAAkC;AAAA,MACtC,aAAa,KAAK;AAAA,MAClB,cAAc;AAAA,MACd,GAAG,KAAK;AAAA,IACV;AAEA,QAAI,QAAQ,OAAO;AACjB,cAAQ,eAAe,IAAI,UAAU,QAAQ,KAAK;AAAA,IACpD;AAGA,QAAI,QAAQ,SAAS;AACnB,aAAO,OAAO,SAAS,QAAQ,OAAO;AAAA,IACxC;AAEA,QAAI;AAEJ,QAAI,QAAQ,aAAa;AAEvB,oBAAc,QAAQ;AAAA,IACxB,WAAW,QAAQ,MAAM;AACvB,cAAQ,cAAc,IAAI;AAC1B,oBAAc,KAAK,UAAU,QAAQ,IAAI;AAAA,IAC3C;AAEA,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,KAAK;AAAA,QAChC;AAAA,QACA;AAAA,QACA,MAAM;AAAA,QACN,aAAa,QAAQ;AAAA,MACvB,CAAC;AAED,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,MAAM,cAAc,QAAQ;AAAA,MACpC;AAEA,YAAM,cAAc,SAAS,QAAQ,IAAI,cAAc;AACvD,UAAI,eAAe,YAAY,SAAS,kBAAkB,GAAG;AAC3D,cAAM,OAAO,MAAM,SAAS,KAAK;AAGjC,YAAI,KAAK,SAAS,QAAW;AAC3B,iBAAO,KAAK;AAAA,QACd;AACA,eAAO;AAAA,MACT;AAEA,aAAQ,MAAM,SAAS,KAAK;AAAA,IAC9B,SAAS,OAAO;AACd,UAAI,iBAAiB,gBAAgB;AACnC,cAAM;AAAA,MACR;AACA,YAAM,IAAI;AAAA,QACR,iBAAiB,QAAQ,MAAM,UAAU;AAAA,QACzC;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;AC/He,SAAR,UAA2B,QAA0C;AAC1E,SAAO,IAAI,gBAAgB,MAAM;AACnC;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/modules/auth.ts","../src/modules/database.ts","../src/modules/storage.ts","../src/modules/schema.ts","../src/modules/mail.ts","../src/client.ts","../src/index.ts"],"sourcesContent":["export class UrBackendError extends Error {\r\n constructor(\r\n public message: string,\r\n public statusCode: number,\r\n public endpoint: string,\r\n ) {\r\n super(message);\r\n this.name = 'UrBackendError';\r\n }\r\n}\r\n\r\nexport class AuthError extends UrBackendError {\r\n constructor(message: string, statusCode: number, endpoint: string) {\r\n super(message, statusCode, endpoint);\r\n this.name = 'AuthError';\r\n }\r\n}\r\n\r\nexport class NotFoundError extends UrBackendError {\r\n constructor(message: string, endpoint: string) {\r\n super(message, 404, endpoint);\r\n this.name = 'NotFoundError';\r\n }\r\n}\r\n\r\nexport class RateLimitError extends UrBackendError {\r\n public retryAfter?: number;\r\n\r\n constructor(message: string, endpoint: string, retryAfter?: number) {\r\n super(message, 429, endpoint);\r\n this.name = 'RateLimitError';\r\n this.retryAfter = retryAfter;\r\n }\r\n}\r\n\r\nexport class StorageError extends UrBackendError {\r\n constructor(message: string, statusCode: number, endpoint: string) {\r\n super(message, statusCode, endpoint);\r\n this.name = 'StorageError';\r\n }\r\n}\r\n\r\nexport class ValidationError extends UrBackendError {\r\n constructor(message: string, endpoint: string) {\r\n super(message, 400, endpoint);\r\n this.name = 'ValidationError';\r\n }\r\n}\r\n\r\nexport async function parseApiError(response: Response): Promise<UrBackendError> {\r\n const endpoint = new URL(response.url).pathname;\r\n let message = 'An unexpected error occurred';\r\n let data: unknown;\r\n\r\n try {\r\n data = await response.json();\r\n if (typeof data === 'object' && data !== null && 'message' in data) {\r\n message = (data as { message: string }).message || message;\r\n }\r\n } catch {\r\n // If not JSON, use status text\r\n message = response.statusText || message;\r\n }\r\n\r\n const status = response.status;\r\n\r\n if (status === 401 || status === 403) {\r\n return new AuthError(message, status, endpoint);\r\n }\r\n\r\n if (status === 404) {\r\n return new NotFoundError(message, endpoint);\r\n }\r\n\r\n if (status === 429) {\r\n const retryAfter = response.headers.get('Retry-After');\r\n return new RateLimitError(message, endpoint, retryAfter ? parseInt(retryAfter, 10) : undefined);\r\n }\r\n\r\n if (status === 400) {\r\n return new ValidationError(message, endpoint);\r\n }\r\n\r\n // Default for 5xx or other 4xx\r\n if (endpoint.includes('/api/storage')) {\r\n return new StorageError(message, status, endpoint);\r\n }\r\n\r\n return new UrBackendError(message, status, endpoint);\r\n}\r\n","import { UrBackendClient } from '../client';\r\nimport {\r\n AuthUser,\r\n AuthResponse,\r\n SignUpPayload,\r\n LoginPayload,\r\n UpdateProfilePayload,\r\n ChangePasswordPayload,\r\n VerifyEmailPayload,\r\n ResendOtpPayload,\r\n RequestPasswordResetPayload,\r\n ResetPasswordPayload,\r\n SocialExchangePayload,\r\n SocialExchangeResponse,\r\n RequestOptions,\r\n} from '../types';\r\nimport { AuthError } from '../errors';\r\n\r\nexport class AuthModule {\r\n private sessionToken?: string;\r\n\r\n constructor(private client: UrBackendClient) {}\r\n\r\n /**\r\n * Create a new user account\r\n */\r\n public async signUp(payload: SignUpPayload): Promise<AuthUser> {\r\n return this.client.request<AuthUser>('POST', '/api/userAuth/signup', { body: payload });\r\n }\r\n\r\n /**\r\n * Log in an existing user and store the session token\r\n */\r\n public async login(payload: LoginPayload): Promise<AuthResponse> {\r\n const response = await this.client.request<AuthResponse>('POST', '/api/userAuth/login', {\r\n body: payload,\r\n });\r\n\r\n this.sessionToken = response.accessToken || response.token;\r\n\r\n if (!response.accessToken && response.token) {\r\n console.warn(\r\n 'urbackend-sdk: The server returned \"token\" which is deprecated. Please update your backend to return \"accessToken\".',\r\n );\r\n }\r\n\r\n return response;\r\n }\r\n\r\n /**\r\n * Get the current authenticated user's profile\r\n */\r\n public async me(token?: string): Promise<AuthUser> {\r\n const activeToken = token || this.sessionToken;\r\n\r\n if (!activeToken) {\r\n throw new AuthError(\r\n 'Authentication token is required for /me endpoint',\r\n 401,\r\n '/api/userAuth/me',\r\n );\r\n }\r\n\r\n return this.client.request<AuthUser>('GET', '/api/userAuth/me', { token: activeToken });\r\n }\r\n\r\n /**\r\n * Update the current authenticated user's profile\r\n */\r\n public async updateProfile(payload: UpdateProfilePayload, token?: string): Promise<{ message: string }> {\r\n const activeToken = token || this.sessionToken;\r\n if (!activeToken) {\r\n throw new AuthError('Authentication token is required to update profile', 401, '/api/userAuth/update-profile');\r\n }\r\n return this.client.request<{ message: string }>('PUT', '/api/userAuth/update-profile', {\r\n body: payload,\r\n token: activeToken,\r\n });\r\n }\r\n\r\n /**\r\n * Change the current authenticated user's password\r\n */\r\n public async changePassword(payload: ChangePasswordPayload, token?: string): Promise<{ message: string }> {\r\n const activeToken = token || this.sessionToken;\r\n if (!activeToken) {\r\n throw new AuthError('Authentication token is required to change password', 401, '/api/userAuth/change-password');\r\n }\r\n return this.client.request<{ message: string }>('PUT', '/api/userAuth/change-password', {\r\n body: payload,\r\n token: activeToken,\r\n });\r\n }\r\n\r\n /**\r\n * Verify user email with OTP\r\n */\r\n public async verifyEmail(payload: VerifyEmailPayload): Promise<{ message: string }> {\r\n return this.client.request<{ message: string }>('POST', '/api/userAuth/verify-email', {\r\n body: payload,\r\n });\r\n }\r\n\r\n /**\r\n * Resend verification OTP\r\n */\r\n public async resendVerificationOtp(payload: ResendOtpPayload): Promise<{ message: string }> {\r\n return this.client.request<{ message: string }>('POST', '/api/userAuth/resend-verification-otp', {\r\n body: payload,\r\n });\r\n }\r\n\r\n /**\r\n * Request password reset OTP\r\n */\r\n public async requestPasswordReset(payload: RequestPasswordResetPayload): Promise<{ message: string }> {\r\n return this.client.request<{ message: string }>('POST', '/api/userAuth/request-password-reset', {\r\n body: payload,\r\n });\r\n }\r\n\r\n /**\r\n * Reset user password with OTP\r\n */\r\n public async resetPassword(payload: ResetPasswordPayload): Promise<{ message: string }> {\r\n return this.client.request<{ message: string }>('POST', '/api/userAuth/reset-password', {\r\n body: payload,\r\n });\r\n }\r\n\r\n /**\r\n * Get public-safe profile by username\r\n */\r\n public async publicProfile(username: string): Promise<AuthUser> {\r\n return this.client.request<AuthUser>('GET', `/api/userAuth/public/${username}`);\r\n }\r\n\r\n /**\r\n * Refresh the access token\r\n * @param refreshToken Optional refresh token for header mode. If omitted, uses cookie mode.\r\n */\r\n public async refreshToken(refreshToken?: string): Promise<AuthResponse> {\r\n const options: RequestOptions = {};\r\n if (refreshToken) {\r\n options.headers = { 'x-refresh-token': refreshToken, 'x-refresh-token-mode': 'header' };\r\n } else {\r\n options.credentials = 'include';\r\n }\r\n\r\n const response = await this.client.request<AuthResponse>('POST', '/api/userAuth/refresh-token', options);\r\n this.sessionToken = response.accessToken || response.token;\r\n return response;\r\n }\r\n\r\n /**\r\n * Returns the start URL for social authentication.\r\n * Redirect the user's browser to this URL to begin the flow.\r\n */\r\n public socialStart(provider: 'github' | 'google'): string {\r\n return `${this.client.getBaseUrl()}/api/userAuth/social/${provider}/start?key=${this.client.getApiKey()}`;\r\n }\r\n\r\n /**\r\n * Exchange social auth rtCode for a refresh token\r\n */\r\n public async socialExchange(payload: SocialExchangePayload): Promise<SocialExchangeResponse> {\r\n return this.client.request<SocialExchangeResponse>('POST', '/api/userAuth/social/exchange', {\r\n body: payload,\r\n });\r\n }\r\n\r\n /**\r\n * Revoke the current session and clear local state\r\n */\r\n public async logout(token?: string): Promise<{ success: boolean; message: string }> {\r\n const activeToken = token || this.sessionToken;\r\n let result = { success: true, message: 'Logged out locally' };\r\n\r\n if (activeToken) {\r\n try {\r\n result = await this.client.request<{ success: boolean; message: string }>(\r\n 'POST',\r\n '/api/userAuth/logout',\r\n { token: activeToken, credentials: 'include' },\r\n );\r\n } catch (e) {\r\n // Silently fail if server logout fails, we still want to clear local state\r\n console.warn('urbackend-sdk: Server logout failed', e);\r\n }\r\n }\r\n\r\n this.sessionToken = undefined;\r\n return result;\r\n }\r\n\r\n /**\r\n * Manually set the session token (e.g. after social auth exchange)\r\n */\r\n public setToken(token: string): void {\r\n this.sessionToken = token;\r\n }\r\n\r\n /**\r\n * Get the current stored session token\r\n */\r\n public getToken(): string | undefined {\r\n return this.sessionToken;\r\n }\r\n}\r\n","import { UrBackendClient } from '../client';\r\nimport { DocumentData, InsertPayload, UpdatePayload, PatchPayload, QueryParams } from '../types';\r\nimport { NotFoundError } from '../errors';\r\n\r\nexport class DatabaseModule {\r\n constructor(private client: UrBackendClient) {}\r\n\r\n /**\r\n * Fetch all documents from a collection with optional query parameters\r\n */\r\n public async getAll<T extends DocumentData>(collection: string, params: QueryParams = {}): Promise<T[]> {\r\n const queryString = this.buildQueryString(params);\r\n const path = `/api/data/${collection}${queryString}`;\r\n \r\n try {\r\n return await this.client.request<T[]>('GET', path);\r\n } catch (e) {\r\n if (e instanceof NotFoundError) {\r\n return [] as T[];\r\n }\r\n throw e;\r\n }\r\n }\r\n\r\n /**\r\n * Fetch a single document by its ID\r\n */\r\n public async getOne<T extends DocumentData>(\r\n collection: string, \r\n id: string, \r\n options: { populate?: string | string[]; expand?: string | string[] } = {}\r\n ): Promise<T> {\r\n const queryString = this.buildQueryString(options);\r\n return this.client.request<T>('GET', `/api/data/${collection}/${id}${queryString}`);\r\n }\r\n\r\n /**\r\n * Insert a new document into a collection\r\n */\r\n public async insert<T extends DocumentData>(\r\n collection: string, \r\n data: InsertPayload, \r\n token?: string\r\n ): Promise<T> {\r\n return this.client.request<T>('POST', `/api/data/${collection}`, { \r\n body: data,\r\n token \r\n });\r\n }\r\n\r\n /**\r\n * Update an existing document by its ID (Full replacement)\r\n */\r\n public async update<T extends DocumentData>(\r\n collection: string,\r\n id: string,\r\n data: UpdatePayload,\r\n token?: string\r\n ): Promise<T> {\r\n return this.client.request<T>('PUT', `/api/data/${collection}/${id}`, { \r\n body: data,\r\n token\r\n });\r\n }\r\n\r\n /**\r\n * Partially update an existing document by its ID\r\n */\r\n public async patch<T extends DocumentData>(\r\n collection: string,\r\n id: string,\r\n data: PatchPayload,\r\n token?: string\r\n ): Promise<T> {\r\n return this.client.request<T>('PATCH', `/api/data/${collection}/${id}`, { \r\n body: data,\r\n token\r\n });\r\n }\r\n\r\n /**\r\n * Delete a document by its ID\r\n */\r\n public async delete(collection: string, id: string, token?: string): Promise<{ deleted: boolean }> {\r\n const result = await this.client.request<{ message?: string; id?: string } | null>(\r\n 'DELETE',\r\n `/api/data/${collection}/${id}`,\r\n { token },\r\n );\r\n\r\n const deleted =\r\n typeof result === 'object' &&\r\n result !== null &&\r\n (result.id === id || result.message === 'Document deleted');\r\n\r\n return { deleted };\r\n }\r\n\r\n /**\r\n * Internal helper to build query string from QueryParams\r\n */\r\n private buildQueryString(params: QueryParams): string {\r\n const searchParams = new URLSearchParams();\r\n\r\n Object.entries(params).forEach(([key, value]) => {\r\n if (value === undefined || value === null) return;\r\n\r\n if (key === 'filter' && typeof value === 'object') {\r\n Object.entries(value as Record<string, unknown>).forEach(([fKey, fValue]) => {\r\n if (fValue !== undefined && fValue !== null) {\r\n searchParams.append(fKey, String(fValue));\r\n }\r\n });\r\n } else if ((key === 'populate' || key === 'expand') && Array.isArray(value)) {\r\n searchParams.append(key, value.join(','));\r\n } else {\r\n searchParams.append(key, String(value));\r\n }\r\n });\r\n\r\n const str = searchParams.toString();\r\n return str ? `?${str}` : '';\r\n }\r\n}\r\n","/// <reference lib=\"dom\" />\r\nimport { UrBackendClient } from '../client';\r\nimport { UploadResponse } from '../types';\r\n\r\nexport class StorageModule {\r\n constructor(private client: UrBackendClient) {}\r\n\r\n /**\r\n * Upload a file to storage\r\n */\r\n public async upload(file: unknown, filename?: string): Promise<UploadResponse> {\r\n const formData = new FormData();\r\n\r\n if (\r\n typeof window === 'undefined' &&\r\n typeof Buffer !== 'undefined' &&\r\n Buffer.isBuffer(file)\r\n ) {\r\n // In Node.js environment, convert Buffer to Blob for standard FormData\r\n const blob = new Blob([file as unknown as BlobPart]);\r\n formData.append('file', blob, filename || 'file');\r\n } else {\r\n // Browser File/Blob or Node.js Blob/File\r\n formData.append('file', file as unknown as Blob, filename);\r\n }\r\n\r\n return this.client.request<UploadResponse>('POST', '/api/storage/upload', {\r\n body: formData,\r\n isMultipart: true,\r\n });\r\n }\r\n\r\n /**\r\n * Delete a file from storage by its path\r\n */\r\n public async deleteFile(path: string): Promise<{ deleted: boolean }> {\r\n return this.client.request<{ deleted: boolean }>('DELETE', '/api/storage/file', {\r\n body: { path },\r\n });\r\n }\r\n}\r\n","import { UrBackendClient } from '../client';\r\nimport { CollectionSchema } from '../types';\r\n\r\nexport class SchemaModule {\r\n constructor(private client: UrBackendClient) {}\r\n\r\n /**\r\n * Fetch the schema definition for a collection\r\n */\r\n public async getSchema(collection: string): Promise<CollectionSchema> {\r\n const trimmedCollection = collection.trim();\r\n if (trimmedCollection === '') {\r\n throw new Error('Collection name cannot be empty or whitespace-only');\r\n }\r\n\r\n const encodedCollection = encodeURIComponent(trimmedCollection);\r\n const response = await this.client.request<{\r\n message: string;\r\n collection: CollectionSchema;\r\n }>('GET', `/api/schemas/${encodedCollection}`);\r\n\r\n return response.collection;\r\n }\r\n}","import { UrBackendClient } from '../client';\r\nimport { SendMailPayload, SendMailResponse } from '../types';\r\n\r\nexport class MailModule {\r\n constructor(private client: UrBackendClient) {}\r\n\r\n /**\r\n * Send an email using the urBackend mail service.\r\n * Note: This requires a Secret Key (sk_live_...) and should be called from a server environment.\r\n */\r\n public async send(payload: SendMailPayload): Promise<SendMailResponse> {\r\n return this.client.request<SendMailResponse>('POST', '/api/mail/send', {\r\n body: payload,\r\n });\r\n }\r\n}\r\n","import { UrBackendConfig, RequestOptions } from './types';\r\nimport { UrBackendError, parseApiError } from './errors';\r\nimport { AuthModule } from './modules/auth';\r\nimport { DatabaseModule } from './modules/database';\r\nimport { StorageModule } from './modules/storage';\r\nimport { SchemaModule } from './modules/schema';\r\nimport { MailModule } from './modules/mail';\r\n\r\nexport class UrBackendClient {\r\n private apiKey: string;\r\n private baseUrl: string;\r\n private _auth?: AuthModule;\r\n private _db?: DatabaseModule;\r\n private _storage?: StorageModule;\r\n private _schema?: SchemaModule;\r\n private _mail?: MailModule;\r\n private headers: Record<string, string>;\r\n\r\n constructor(config: UrBackendConfig) {\r\n this.apiKey = config.apiKey;\r\n this.baseUrl = config.baseUrl || 'https://api.ub.bitbros.in';\r\n this.headers = config.headers || {};\r\n\r\n if (typeof window !== 'undefined' && this.apiKey.startsWith('sk_live_')) {\r\n console.warn(\r\n '⚠️ urbackend-sdk: Avoid exposing your Secret Key (sk_live_...) in client-side code. This can lead to unauthorized access to your account and data. Use your Publishable Key (pk_live_...) instead.',\r\n );\r\n }\r\n }\r\n\r\n get auth(): AuthModule {\r\n if (!this._auth) {\r\n this._auth = new AuthModule(this);\r\n }\r\n return this._auth;\r\n }\r\n\r\n get db(): DatabaseModule {\r\n if (!this._db) {\r\n this._db = new DatabaseModule(this);\r\n }\r\n return this._db;\r\n }\r\n\r\n get storage(): StorageModule {\r\n if (!this._storage) {\r\n this._storage = new StorageModule(this);\r\n }\r\n return this._storage;\r\n }\r\n\r\n get schema(): SchemaModule {\r\n if (!this._schema) {\r\n this._schema = new SchemaModule(this);\r\n }\r\n return this._schema;\r\n }\r\n\r\n get mail(): MailModule {\r\n if (!this._mail) {\r\n this._mail = new MailModule(this);\r\n }\r\n return this._mail;\r\n }\r\n\r\n public getBaseUrl(): string {\r\n return this.baseUrl;\r\n }\r\n\r\n public getApiKey(): string {\r\n return this.apiKey;\r\n }\r\n\r\n /**\r\n * Internal request handler\r\n */\r\n public async request<T>(\r\n method: string,\r\n path: string,\r\n options: RequestOptions = {},\r\n ): Promise<T> {\r\n const url = `${this.baseUrl}${path}`;\r\n const headers: Record<string, string> = {\r\n 'x-api-key': this.apiKey,\r\n 'User-Agent': `urbackend-sdk-js/0.2.2`,\r\n ...this.headers,\r\n };\r\n\r\n if (options.token) {\r\n headers['Authorization'] = `Bearer ${options.token}`;\r\n }\r\n\r\n // Merge custom headers from options if provided\r\n if (options.headers) {\r\n Object.assign(headers, options.headers);\r\n }\r\n\r\n let requestBody: BodyInit | undefined;\r\n\r\n if (options.isMultipart) {\r\n // Fetch handles FormData content type and boundary\r\n requestBody = options.body as FormData;\r\n } else if (options.body) {\r\n headers['Content-Type'] = 'application/json';\r\n requestBody = JSON.stringify(options.body);\r\n }\r\n\r\n try {\r\n const response = await fetch(url, {\r\n method,\r\n headers,\r\n body: requestBody,\r\n credentials: options.credentials,\r\n });\r\n\r\n if (!response.ok) {\r\n throw await parseApiError(response);\r\n }\r\n\r\n const contentType = response.headers.get('content-type');\r\n if (contentType && contentType.includes('application/json')) {\r\n const json = await response.json();\r\n // The API returns { data, success, message }\r\n // If data is present, return it. If success/message are present but no data, return the whole object (for exchange/logout etc)\r\n if (json.data !== undefined) {\r\n return json.data;\r\n }\r\n return json;\r\n }\r\n\r\n return (await response.text()) as unknown as T;\r\n } catch (error) {\r\n if (error instanceof UrBackendError) {\r\n throw error;\r\n }\r\n throw new UrBackendError(\r\n error instanceof Error ? error.message : 'Network request failed',\r\n 0,\r\n path,\r\n );\r\n }\r\n }\r\n}\r\n","import { UrBackendClient } from './client';\r\nimport { UrBackendConfig } from './types';\r\nimport { AuthModule } from './modules/auth';\r\nimport { DatabaseModule } from './modules/database';\r\nimport { StorageModule } from './modules/storage';\r\nimport { SchemaModule } from './modules/schema';\r\nimport { MailModule } from './modules/mail';\r\n\r\nexport * from './types';\r\nexport * from './errors';\r\nexport { UrBackendClient, AuthModule, DatabaseModule, StorageModule, SchemaModule, MailModule };\r\n\r\n/**\r\n * Factory function to create a new urBackend client\r\n */\r\nexport default function urBackend(config: UrBackendConfig): UrBackendClient {\r\n return new UrBackendClient(config);\r\n}\r\n"],"mappings":";AAAO,IAAM,iBAAN,cAA6B,MAAM;AAAA,EACxC,YACS,SACA,YACA,UACP;AACA,UAAM,OAAO;AAJN;AACA;AACA;AAGP,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,YAAN,cAAwB,eAAe;AAAA,EAC5C,YAAY,SAAiB,YAAoB,UAAkB;AACjE,UAAM,SAAS,YAAY,QAAQ;AACnC,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,gBAAN,cAA4B,eAAe;AAAA,EAChD,YAAY,SAAiB,UAAkB;AAC7C,UAAM,SAAS,KAAK,QAAQ;AAC5B,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,iBAAN,cAA6B,eAAe;AAAA,EAGjD,YAAY,SAAiB,UAAkB,YAAqB;AAClE,UAAM,SAAS,KAAK,QAAQ;AAC5B,SAAK,OAAO;AACZ,SAAK,aAAa;AAAA,EACpB;AACF;AAEO,IAAM,eAAN,cAA2B,eAAe;AAAA,EAC/C,YAAY,SAAiB,YAAoB,UAAkB;AACjE,UAAM,SAAS,YAAY,QAAQ;AACnC,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,kBAAN,cAA8B,eAAe;AAAA,EAClD,YAAY,SAAiB,UAAkB;AAC7C,UAAM,SAAS,KAAK,QAAQ;AAC5B,SAAK,OAAO;AAAA,EACd;AACF;AAEA,eAAsB,cAAc,UAA6C;AAC/E,QAAM,WAAW,IAAI,IAAI,SAAS,GAAG,EAAE;AACvC,MAAI,UAAU;AACd,MAAI;AAEJ,MAAI;AACF,WAAO,MAAM,SAAS,KAAK;AAC3B,QAAI,OAAO,SAAS,YAAY,SAAS,QAAQ,aAAa,MAAM;AAClE,gBAAW,KAA6B,WAAW;AAAA,IACrD;AAAA,EACF,QAAQ;AAEN,cAAU,SAAS,cAAc;AAAA,EACnC;AAEA,QAAM,SAAS,SAAS;AAExB,MAAI,WAAW,OAAO,WAAW,KAAK;AACpC,WAAO,IAAI,UAAU,SAAS,QAAQ,QAAQ;AAAA,EAChD;AAEA,MAAI,WAAW,KAAK;AAClB,WAAO,IAAI,cAAc,SAAS,QAAQ;AAAA,EAC5C;AAEA,MAAI,WAAW,KAAK;AAClB,UAAM,aAAa,SAAS,QAAQ,IAAI,aAAa;AACrD,WAAO,IAAI,eAAe,SAAS,UAAU,aAAa,SAAS,YAAY,EAAE,IAAI,MAAS;AAAA,EAChG;AAEA,MAAI,WAAW,KAAK;AAClB,WAAO,IAAI,gBAAgB,SAAS,QAAQ;AAAA,EAC9C;AAGA,MAAI,SAAS,SAAS,cAAc,GAAG;AACrC,WAAO,IAAI,aAAa,SAAS,QAAQ,QAAQ;AAAA,EACnD;AAEA,SAAO,IAAI,eAAe,SAAS,QAAQ,QAAQ;AACrD;;;ACvEO,IAAM,aAAN,MAAiB;AAAA,EAGtB,YAAoB,QAAyB;AAAzB;AAAA,EAA0B;AAAA;AAAA;AAAA;AAAA,EAK9C,MAAa,OAAO,SAA2C;AAC7D,WAAO,KAAK,OAAO,QAAkB,QAAQ,wBAAwB,EAAE,MAAM,QAAQ,CAAC;AAAA,EACxF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,MAAM,SAA8C;AAC/D,UAAM,WAAW,MAAM,KAAK,OAAO,QAAsB,QAAQ,uBAAuB;AAAA,MACtF,MAAM;AAAA,IACR,CAAC;AAED,SAAK,eAAe,SAAS,eAAe,SAAS;AAErD,QAAI,CAAC,SAAS,eAAe,SAAS,OAAO;AAC3C,cAAQ;AAAA,QACN;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,GAAG,OAAmC;AACjD,UAAM,cAAc,SAAS,KAAK;AAElC,QAAI,CAAC,aAAa;AAChB,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,WAAO,KAAK,OAAO,QAAkB,OAAO,oBAAoB,EAAE,OAAO,YAAY,CAAC;AAAA,EACxF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,cAAc,SAA+B,OAA8C;AACtG,UAAM,cAAc,SAAS,KAAK;AAClC,QAAI,CAAC,aAAa;AAChB,YAAM,IAAI,UAAU,sDAAsD,KAAK,8BAA8B;AAAA,IAC/G;AACA,WAAO,KAAK,OAAO,QAA6B,OAAO,gCAAgC;AAAA,MACrF,MAAM;AAAA,MACN,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,eAAe,SAAgC,OAA8C;AACxG,UAAM,cAAc,SAAS,KAAK;AAClC,QAAI,CAAC,aAAa;AAChB,YAAM,IAAI,UAAU,uDAAuD,KAAK,+BAA+B;AAAA,IACjH;AACA,WAAO,KAAK,OAAO,QAA6B,OAAO,iCAAiC;AAAA,MACtF,MAAM;AAAA,MACN,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,YAAY,SAA2D;AAClF,WAAO,KAAK,OAAO,QAA6B,QAAQ,8BAA8B;AAAA,MACpF,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,sBAAsB,SAAyD;AAC1F,WAAO,KAAK,OAAO,QAA6B,QAAQ,yCAAyC;AAAA,MAC/F,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,qBAAqB,SAAoE;AACpG,WAAO,KAAK,OAAO,QAA6B,QAAQ,wCAAwC;AAAA,MAC9F,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,cAAc,SAA6D;AACtF,WAAO,KAAK,OAAO,QAA6B,QAAQ,gCAAgC;AAAA,MACtF,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,cAAc,UAAqC;AAC9D,WAAO,KAAK,OAAO,QAAkB,OAAO,wBAAwB,QAAQ,EAAE;AAAA,EAChF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAa,aAAa,cAA8C;AACtE,UAAM,UAA0B,CAAC;AACjC,QAAI,cAAc;AAChB,cAAQ,UAAU,EAAE,mBAAmB,cAAc,wBAAwB,SAAS;AAAA,IACxF,OAAO;AACL,cAAQ,cAAc;AAAA,IACxB;AAEA,UAAM,WAAW,MAAM,KAAK,OAAO,QAAsB,QAAQ,+BAA+B,OAAO;AACvG,SAAK,eAAe,SAAS,eAAe,SAAS;AACrD,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,YAAY,UAAuC;AACxD,WAAO,GAAG,KAAK,OAAO,WAAW,CAAC,wBAAwB,QAAQ,cAAc,KAAK,OAAO,UAAU,CAAC;AAAA,EACzG;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,eAAe,SAAiE;AAC3F,WAAO,KAAK,OAAO,QAAgC,QAAQ,iCAAiC;AAAA,MAC1F,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,OAAO,OAAgE;AAClF,UAAM,cAAc,SAAS,KAAK;AAClC,QAAI,SAAS,EAAE,SAAS,MAAM,SAAS,qBAAqB;AAE5D,QAAI,aAAa;AACf,UAAI;AACF,iBAAS,MAAM,KAAK,OAAO;AAAA,UACzB;AAAA,UACA;AAAA,UACA,EAAE,OAAO,aAAa,aAAa,UAAU;AAAA,QAC/C;AAAA,MACF,SAAS,GAAG;AAEV,gBAAQ,KAAK,uCAAuC,CAAC;AAAA,MACvD;AAAA,IACF;AAEA,SAAK,eAAe;AACpB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKO,SAAS,OAAqB;AACnC,SAAK,eAAe;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKO,WAA+B;AACpC,WAAO,KAAK;AAAA,EACd;AACF;;;AC5MO,IAAM,iBAAN,MAAqB;AAAA,EAC1B,YAAoB,QAAyB;AAAzB;AAAA,EAA0B;AAAA;AAAA;AAAA;AAAA,EAK9C,MAAa,OAA+B,YAAoB,SAAsB,CAAC,GAAiB;AACtG,UAAM,cAAc,KAAK,iBAAiB,MAAM;AAChD,UAAM,OAAO,aAAa,UAAU,GAAG,WAAW;AAElD,QAAI;AACF,aAAO,MAAM,KAAK,OAAO,QAAa,OAAO,IAAI;AAAA,IACnD,SAAS,GAAG;AACV,UAAI,aAAa,eAAe;AAC9B,eAAO,CAAC;AAAA,MACV;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,OACX,YACA,IACA,UAAwE,CAAC,GAC7D;AACZ,UAAM,cAAc,KAAK,iBAAiB,OAAO;AACjD,WAAO,KAAK,OAAO,QAAW,OAAO,aAAa,UAAU,IAAI,EAAE,GAAG,WAAW,EAAE;AAAA,EACpF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,OACX,YACA,MACA,OACY;AACZ,WAAO,KAAK,OAAO,QAAW,QAAQ,aAAa,UAAU,IAAI;AAAA,MAC/D,MAAM;AAAA,MACN;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,OACX,YACA,IACA,MACA,OACY;AACZ,WAAO,KAAK,OAAO,QAAW,OAAO,aAAa,UAAU,IAAI,EAAE,IAAI;AAAA,MACpE,MAAM;AAAA,MACN;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,MACX,YACA,IACA,MACA,OACY;AACZ,WAAO,KAAK,OAAO,QAAW,SAAS,aAAa,UAAU,IAAI,EAAE,IAAI;AAAA,MACtE,MAAM;AAAA,MACN;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,OAAO,YAAoB,IAAY,OAA+C;AACjG,UAAM,SAAS,MAAM,KAAK,OAAO;AAAA,MAC/B;AAAA,MACA,aAAa,UAAU,IAAI,EAAE;AAAA,MAC7B,EAAE,MAAM;AAAA,IACV;AAEA,UAAM,UACJ,OAAO,WAAW,YAClB,WAAW,SACV,OAAO,OAAO,MAAM,OAAO,YAAY;AAE1C,WAAO,EAAE,QAAQ;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAiB,QAA6B;AACpD,UAAM,eAAe,IAAI,gBAAgB;AAEzC,WAAO,QAAQ,MAAM,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AAC/C,UAAI,UAAU,UAAa,UAAU,KAAM;AAE3C,UAAI,QAAQ,YAAY,OAAO,UAAU,UAAU;AACjD,eAAO,QAAQ,KAAgC,EAAE,QAAQ,CAAC,CAAC,MAAM,MAAM,MAAM;AAC3E,cAAI,WAAW,UAAa,WAAW,MAAM;AAC3C,yBAAa,OAAO,MAAM,OAAO,MAAM,CAAC;AAAA,UAC1C;AAAA,QACF,CAAC;AAAA,MACH,YAAY,QAAQ,cAAc,QAAQ,aAAa,MAAM,QAAQ,KAAK,GAAG;AAC3E,qBAAa,OAAO,KAAK,MAAM,KAAK,GAAG,CAAC;AAAA,MAC1C,OAAO;AACL,qBAAa,OAAO,KAAK,OAAO,KAAK,CAAC;AAAA,MACxC;AAAA,IACF,CAAC;AAED,UAAM,MAAM,aAAa,SAAS;AAClC,WAAO,MAAM,IAAI,GAAG,KAAK;AAAA,EAC3B;AACF;;;ACvHO,IAAM,gBAAN,MAAoB;AAAA,EACzB,YAAoB,QAAyB;AAAzB;AAAA,EAA0B;AAAA;AAAA;AAAA;AAAA,EAK9C,MAAa,OAAO,MAAe,UAA4C;AAC7E,UAAM,WAAW,IAAI,SAAS;AAE9B,QACE,OAAO,WAAW,eAClB,OAAO,WAAW,eAClB,OAAO,SAAS,IAAI,GACpB;AAEA,YAAM,OAAO,IAAI,KAAK,CAAC,IAA2B,CAAC;AACnD,eAAS,OAAO,QAAQ,MAAM,YAAY,MAAM;AAAA,IAClD,OAAO;AAEL,eAAS,OAAO,QAAQ,MAAyB,QAAQ;AAAA,IAC3D;AAEA,WAAO,KAAK,OAAO,QAAwB,QAAQ,uBAAuB;AAAA,MACxE,MAAM;AAAA,MACN,aAAa;AAAA,IACf,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,WAAW,MAA6C;AACnE,WAAO,KAAK,OAAO,QAA8B,UAAU,qBAAqB;AAAA,MAC9E,MAAM,EAAE,KAAK;AAAA,IACf,CAAC;AAAA,EACH;AACF;;;ACrCO,IAAM,eAAN,MAAmB;AAAA,EACxB,YAAoB,QAAyB;AAAzB;AAAA,EAA0B;AAAA;AAAA;AAAA;AAAA,EAK9C,MAAa,UAAU,YAA+C;AACpE,UAAM,oBAAoB,WAAW,KAAK;AAC1C,QAAI,sBAAsB,IAAI;AAC5B,YAAM,IAAI,MAAM,oDAAoD;AAAA,IACtE;AAEA,UAAM,oBAAoB,mBAAmB,iBAAiB;AAC9D,UAAM,WAAW,MAAM,KAAK,OAAO,QAGhC,OAAO,gBAAgB,iBAAiB,EAAE;AAE7C,WAAO,SAAS;AAAA,EAClB;AACF;;;ACpBO,IAAM,aAAN,MAAiB;AAAA,EACtB,YAAoB,QAAyB;AAAzB;AAAA,EAA0B;AAAA;AAAA;AAAA;AAAA;AAAA,EAM9C,MAAa,KAAK,SAAqD;AACrE,WAAO,KAAK,OAAO,QAA0B,QAAQ,kBAAkB;AAAA,MACrE,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AACF;;;ACPO,IAAM,kBAAN,MAAsB;AAAA,EAU3B,YAAY,QAAyB;AACnC,SAAK,SAAS,OAAO;AACrB,SAAK,UAAU,OAAO,WAAW;AACjC,SAAK,UAAU,OAAO,WAAW,CAAC;AAElC,QAAI,OAAO,WAAW,eAAe,KAAK,OAAO,WAAW,UAAU,GAAG;AACvE,cAAQ;AAAA,QACN;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,IAAI,OAAmB;AACrB,QAAI,CAAC,KAAK,OAAO;AACf,WAAK,QAAQ,IAAI,WAAW,IAAI;AAAA,IAClC;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,KAAqB;AACvB,QAAI,CAAC,KAAK,KAAK;AACb,WAAK,MAAM,IAAI,eAAe,IAAI;AAAA,IACpC;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,UAAyB;AAC3B,QAAI,CAAC,KAAK,UAAU;AAClB,WAAK,WAAW,IAAI,cAAc,IAAI;AAAA,IACxC;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,SAAuB;AACzB,QAAI,CAAC,KAAK,SAAS;AACjB,WAAK,UAAU,IAAI,aAAa,IAAI;AAAA,IACtC;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,OAAmB;AACrB,QAAI,CAAC,KAAK,OAAO;AACf,WAAK,QAAQ,IAAI,WAAW,IAAI;AAAA,IAClC;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,aAAqB;AAC1B,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,YAAoB;AACzB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,QACX,QACA,MACA,UAA0B,CAAC,GACf;AACZ,UAAM,MAAM,GAAG,KAAK,OAAO,GAAG,IAAI;AAClC,UAAM,UAAkC;AAAA,MACtC,aAAa,KAAK;AAAA,MAClB,cAAc;AAAA,MACd,GAAG,KAAK;AAAA,IACV;AAEA,QAAI,QAAQ,OAAO;AACjB,cAAQ,eAAe,IAAI,UAAU,QAAQ,KAAK;AAAA,IACpD;AAGA,QAAI,QAAQ,SAAS;AACnB,aAAO,OAAO,SAAS,QAAQ,OAAO;AAAA,IACxC;AAEA,QAAI;AAEJ,QAAI,QAAQ,aAAa;AAEvB,oBAAc,QAAQ;AAAA,IACxB,WAAW,QAAQ,MAAM;AACvB,cAAQ,cAAc,IAAI;AAC1B,oBAAc,KAAK,UAAU,QAAQ,IAAI;AAAA,IAC3C;AAEA,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,KAAK;AAAA,QAChC;AAAA,QACA;AAAA,QACA,MAAM;AAAA,QACN,aAAa,QAAQ;AAAA,MACvB,CAAC;AAED,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,MAAM,cAAc,QAAQ;AAAA,MACpC;AAEA,YAAM,cAAc,SAAS,QAAQ,IAAI,cAAc;AACvD,UAAI,eAAe,YAAY,SAAS,kBAAkB,GAAG;AAC3D,cAAM,OAAO,MAAM,SAAS,KAAK;AAGjC,YAAI,KAAK,SAAS,QAAW;AAC3B,iBAAO,KAAK;AAAA,QACd;AACA,eAAO;AAAA,MACT;AAEA,aAAQ,MAAM,SAAS,KAAK;AAAA,IAC9B,SAAS,OAAO;AACd,UAAI,iBAAiB,gBAAgB;AACnC,cAAM;AAAA,MACR;AACA,YAAM,IAAI;AAAA,QACR,iBAAiB,QAAQ,MAAM,UAAU;AAAA,QACzC;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;AC/He,SAAR,UAA2B,QAA0C;AAC1E,SAAO,IAAI,gBAAgB,MAAM;AACnC;","names":[]}
|
package/package.json
CHANGED
|
@@ -1,18 +1,20 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@urbackend/sdk",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.5",
|
|
4
4
|
"description": "Official TypeScript SDK for urBackend BaaS",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"files": [
|
|
7
7
|
"dist"
|
|
8
8
|
],
|
|
9
|
-
"
|
|
10
|
-
"
|
|
9
|
+
"main": "./index.js",
|
|
10
|
+
"module": "./index.js",
|
|
11
|
+
"browser": "./index.js",
|
|
12
|
+
"types": "./index.d.ts",
|
|
11
13
|
"exports": {
|
|
12
14
|
".": {
|
|
13
|
-
"types": "./
|
|
14
|
-
"import": "./
|
|
15
|
-
"require": "./
|
|
15
|
+
"types": "./index.d.ts",
|
|
16
|
+
"import": "./index.js",
|
|
17
|
+
"require": "./index.js"
|
|
16
18
|
}
|
|
17
19
|
},
|
|
18
20
|
"scripts": {
|
|
File without changes
|