hydrousdb 2.0.0 → 2.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/errors.ts","../src/utils/http.ts","../src/utils/query.ts","../src/records/client.ts","../src/auth/client.ts","../src/analytics/client.ts","../src/client.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type { HydrousErrorBody } from '../types/index.js';\n\n/**\n * Thrown for any non-2xx response from the HydrousDB API.\n */\nexport class HydrousError extends Error {\n /** HTTP status code */\n readonly status: number;\n /** Machine-readable error code from the API */\n readonly code: string | undefined;\n /** Detailed validation messages */\n readonly details: string[];\n /** Server-generated request ID for support */\n readonly requestId: string | undefined;\n\n constructor(body: HydrousErrorBody, status: number) {\n super(body.error);\n this.name = 'HydrousError';\n this.status = status;\n this.code = body.code;\n this.details = body.details ?? [];\n this.requestId = body.requestId;\n }\n}\n\n/**\n * Thrown when a network request fails (e.g. no connectivity, DNS failure).\n */\nexport class HydrousNetworkError extends Error {\n readonly cause: unknown;\n\n constructor(message: string, cause?: unknown) {\n super(message);\n this.name = 'HydrousNetworkError';\n this.cause = cause;\n }\n}\n\n/**\n * Thrown when a request exceeds the configured timeout.\n */\nexport class HydrousTimeoutError extends Error {\n constructor(timeoutMs: number) {\n super(`Request timed out after ${timeoutMs}ms`);\n this.name = 'HydrousTimeoutError';\n }\n}\n","import { HydrousError, HydrousNetworkError, HydrousTimeoutError } from './errors.js';\nimport type { HydrousErrorBody, RequestOptions } from '../types/index.js';\n\nconst DEFAULT_BASE_URL = 'https://db-api-82687684612.us-central1.run.app';\nconst DEFAULT_TIMEOUT = 30_000;\nconst DEFAULT_RETRIES = 2;\n\n// Statuses that are safe to retry\nconst RETRYABLE_STATUSES = new Set([408, 429, 500, 502, 503, 504]);\n\nexport interface HttpClientConfig {\n authKey: string;\n securityKey: string;\n baseUrl?: string;\n timeout?: number;\n retries?: number;\n}\n\nexport class HttpClient {\n readonly baseUrl: string;\n readonly authKey: string;\n readonly securityKey: string;\n private readonly timeout: number;\n private readonly retries: number;\n\n constructor(config: HttpClientConfig) {\n this.authKey = config.authKey;\n this.securityKey = config.securityKey;\n this.baseUrl = (config.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/$/, '');\n this.timeout = config.timeout ?? DEFAULT_TIMEOUT;\n this.retries = config.retries ?? DEFAULT_RETRIES;\n }\n\n // ── Core request ────────────────────────────────────────────────────────────\n\n async request<T>(\n method: string,\n path: string,\n options?: {\n body?: unknown;\n params?: Record<string, string | number | boolean | undefined | null>;\n signal?: AbortSignal;\n headers?: Record<string, string>;\n /** Return raw Response instead of parsed JSON (used by HEAD) */\n raw?: boolean;\n }\n ): Promise<T> {\n const url = this.buildUrl(path, options?.params);\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...options?.headers,\n };\n\n const init: RequestInit = {\n method,\n headers,\n signal: this.buildSignal(options?.signal),\n };\n\n if (options?.body !== undefined) {\n init.body = JSON.stringify(options.body);\n }\n\n return this.executeWithRetry<T>(url, init, options?.raw ?? false, this.retries);\n }\n\n // ── Convenience methods ──────────────────────────────────────────────────────\n\n get<T>(path: string, params?: Record<string, string | number | boolean | undefined | null>, opts?: RequestOptions): Promise<T> {\n return this.request<T>('GET', path, { params, ...opts });\n }\n\n post<T>(path: string, body?: unknown, opts?: RequestOptions): Promise<T> {\n return this.request<T>('POST', path, { body, ...opts });\n }\n\n patch<T>(path: string, body?: unknown, opts?: RequestOptions): Promise<T> {\n return this.request<T>('PATCH', path, { body, ...opts });\n }\n\n delete<T>(path: string, params?: Record<string, string | number | boolean | undefined | null>, opts?: RequestOptions): Promise<T> {\n return this.request<T>('DELETE', path, { params, ...opts });\n }\n\n head(path: string, params?: Record<string, string | number | boolean | undefined | null>, opts?: RequestOptions): Promise<Response> {\n return this.request<Response>('HEAD', path, { params, raw: true, ...opts });\n }\n\n // ── Internals ────────────────────────────────────────────────────────────────\n\n private buildUrl(\n path: string,\n params?: Record<string, string | number | boolean | undefined | null>\n ): string {\n const url = new URL(`${this.baseUrl}${path}`);\n\n if (params) {\n for (const [k, v] of Object.entries(params)) {\n if (v !== undefined && v !== null && v !== '') {\n url.searchParams.set(k, String(v));\n }\n }\n }\n\n return url.toString();\n }\n\n private buildSignal(userSignal?: AbortSignal): AbortSignal {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort('timeout'), this.timeout);\n\n userSignal?.addEventListener('abort', () => {\n clearTimeout(timeoutId);\n controller.abort(userSignal.reason);\n });\n\n return controller.signal;\n }\n\n private async executeWithRetry<T>(\n url: string,\n init: RequestInit,\n raw: boolean,\n retriesLeft: number\n ): Promise<T> {\n try {\n const res = await fetch(url, init);\n\n if (raw) return res as unknown as T;\n\n if (res.ok) {\n if (res.status === 204) return undefined as unknown as T;\n return (await res.json()) as T;\n }\n\n let body: HydrousErrorBody;\n try {\n body = (await res.json()) as HydrousErrorBody;\n } catch {\n body = { success: false, error: `HTTP ${res.status}: ${res.statusText}` };\n }\n\n if (retriesLeft > 0 && RETRYABLE_STATUSES.has(res.status)) {\n await sleep(500 * (this.retries - retriesLeft + 1));\n return this.executeWithRetry<T>(url, init, raw, retriesLeft - 1);\n }\n\n throw new HydrousError(body, res.status);\n\n } catch (err) {\n if (err instanceof HydrousError) throw err;\n\n if (err instanceof Error && err.message === 'timeout') {\n throw new HydrousTimeoutError(this.timeout);\n }\n\n if (retriesLeft > 0) {\n await sleep(500 * (this.retries - retriesLeft + 1));\n return this.executeWithRetry<T>(url, init, raw, retriesLeft - 1);\n }\n\n throw new HydrousNetworkError(\n `Network request failed: ${err instanceof Error ? err.message : String(err)}`,\n err\n );\n }\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n","import type { Filter, QueryOptions } from '../types/index.js';\n\n/**\n * Converts a QueryOptions object into a flat Record suitable for URLSearchParams.\n *\n * Filter fields use the `field[op]=value` convention:\n * { field: 'status', op: '==', value: 'active' } → status=active\n * { field: 'score', op: '>', value: 50 } → score[>]=50\n */\nexport function buildQueryParams(\n opts: QueryOptions\n): Record<string, string | number | boolean> {\n const params: Record<string, string | number | boolean> = {};\n\n if (opts.timeScope) params['timeScope'] = opts.timeScope;\n if (opts.year) params['year'] = opts.year;\n if (opts.sortOrder) params['sortOrder'] = opts.sortOrder;\n if (opts.limit) params['limit'] = opts.limit;\n if (opts.cursor) params['cursor'] = opts.cursor;\n if (opts.fields) params['fields'] = opts.fields;\n\n for (const filter of opts.filters ?? []) {\n const paramKey = filter.op === '==' ? filter.field : `${filter.field}[${filter.op}]`;\n params[paramKey] = filter.value as string | number | boolean;\n }\n\n return params;\n}\n\n/**\n * Validates a filter array and throws a descriptive error if invalid.\n */\nexport function validateFilters(filters: Filter[]): void {\n const VALID_OPS = new Set(['==', '!=', '>', '<', '>=', '<=', 'contains']);\n\n if (filters.length > 3) {\n throw new Error('HydrousDB supports a maximum of 3 filters per query.');\n }\n\n for (const f of filters) {\n if (!VALID_OPS.has(f.op)) {\n throw new Error(\n `Invalid filter operator \"${f.op}\". Valid operators: ${[...VALID_OPS].join(', ')}`\n );\n }\n if (!f.field || typeof f.field !== 'string') {\n throw new Error('Each filter must have a non-empty \"field\" string.');\n }\n }\n}\n","import type { HttpClient } from '../utils/http.js';\nimport { buildQueryParams, validateFilters } from '../utils/query.js';\nimport type {\n GetRecordOptions,\n GetRecordResponse,\n GetSnapshotResponse,\n QueryOptions,\n QueryResponse,\n InsertRecordPayload,\n InsertRecordResponse,\n UpdateRecordPayload,\n UpdateRecordResponse,\n DeleteRecordResponse,\n RecordExistsInfo,\n BatchUpdatePayload,\n BatchUpdateResponse,\n BatchDeletePayload,\n BatchDeleteResponse,\n BatchInsertPayload,\n BatchInsertResponse,\n RecordData,\n HydrousRecord,\n RequestOptions,\n} from '../types/index.js';\n\n/** Options accepted by every records method that needs a bucket */\nexport interface BucketOptions {\n /**\n * The bucket to read from or write to.\n * Required on all records and analytics calls.\n *\n * @example\n * await db.records.insert({ values: { name: 'Alice' } }, { bucketKey: 'users' });\n */\n bucketKey: string;\n}\n\nexport class RecordsClient {\n constructor(private readonly http: HttpClient) {}\n\n /** Builds the base path for a given bucket: /api/:bucketKey/:securityKey */\n private path(bucketKey: string): string {\n return `/api/${bucketKey}/${this.http.securityKey}`;\n }\n\n // ── GET — single record ────────────────────────────────────────────────────\n\n /**\n * Fetch a single record by ID.\n *\n * @example\n * const { data } = await db.records.get('rec_abc123', { bucketKey: 'users' });\n * const { data, history } = await db.records.get('rec_abc123', { bucketKey: 'users', showHistory: true });\n */\n async get(\n recordId: string,\n options: GetRecordOptions & BucketOptions & RequestOptions\n ): Promise<GetRecordResponse> {\n const { bucketKey, showHistory, ...rest } = options;\n const params: Record<string, string | number | boolean | undefined | null> = { recordId };\n if (showHistory) params['showHistory'] = 'true';\n return this.http.get<GetRecordResponse>(this.path(bucketKey), params, rest);\n }\n\n // ── GET — historical snapshot ──────────────────────────────────────────────\n\n /**\n * Fetch a specific historical version (generation) of a record.\n *\n * @example\n * const { data } = await db.records.getSnapshot('rec_abc123', '1700000000000000', { bucketKey: 'users' });\n */\n async getSnapshot(\n recordId: string,\n generation: string,\n options: BucketOptions & RequestOptions\n ): Promise<GetSnapshotResponse> {\n const { bucketKey, ...rest } = options;\n return this.http.get<GetSnapshotResponse>(this.path(bucketKey), { recordId, generation }, rest);\n }\n\n // ── GET — collection query ─────────────────────────────────────────────────\n\n /**\n * Query a collection with optional filters, sorting, and pagination.\n *\n * @example\n * // Simple query\n * const { data, meta } = await db.records.query({ bucketKey: 'orders', limit: 50 });\n *\n * // Filtered query\n * const { data } = await db.records.query({\n * bucketKey: 'orders',\n * filters: [{ field: 'status', op: '==', value: 'active' }],\n * timeScope: '7d',\n * });\n *\n * // Paginated\n * let cursor: string | null = null;\n * do {\n * const result = await db.records.query({ bucketKey: 'orders', limit: 100, cursor: cursor ?? undefined });\n * cursor = result.meta.nextCursor;\n * } while (cursor);\n */\n async query<T extends RecordData = RecordData>(\n options: QueryOptions & BucketOptions & RequestOptions\n ): Promise<QueryResponse<T>> {\n const { bucketKey, ...rest } = options;\n if (rest.filters) validateFilters(rest.filters);\n const params = buildQueryParams(rest);\n return this.http.get<QueryResponse<T>>(this.path(bucketKey), params, rest);\n }\n\n // ── POST — insert ──────────────────────────────────────────────────────────\n\n /**\n * Insert a new record into the specified bucket.\n *\n * @example\n * const { data, meta } = await db.records.insert(\n * { values: { name: 'Alice', score: 99 }, queryableFields: ['name'] },\n * { bucketKey: 'users' }\n * );\n */\n async insert(\n payload: InsertRecordPayload,\n options: BucketOptions & RequestOptions\n ): Promise<InsertRecordResponse> {\n const { bucketKey, ...rest } = options;\n return this.http.post<InsertRecordResponse>(this.path(bucketKey), payload, rest);\n }\n\n // ── PATCH — update ─────────────────────────────────────────────────────────\n\n /**\n * Update an existing record.\n *\n * @example\n * await db.records.update(\n * { recordId: 'rec_abc123', values: { score: 100 }, track_record_history: true },\n * { bucketKey: 'users' }\n * );\n */\n async update(\n payload: UpdateRecordPayload,\n options: BucketOptions & RequestOptions\n ): Promise<UpdateRecordResponse> {\n const { bucketKey, ...rest } = options;\n return this.http.patch<UpdateRecordResponse>(this.path(bucketKey), payload, rest);\n }\n\n // ── DELETE ─────────────────────────────────────────────────────────────────\n\n /**\n * Delete a record permanently.\n *\n * @example\n * await db.records.delete('rec_abc123', { bucketKey: 'users' });\n */\n async delete(\n recordId: string,\n options: BucketOptions & RequestOptions\n ): Promise<DeleteRecordResponse> {\n const { bucketKey, ...rest } = options;\n return this.http.delete<DeleteRecordResponse>(this.path(bucketKey), { recordId }, rest);\n }\n\n // ── HEAD — existence check ─────────────────────────────────────────────────\n\n /**\n * Check whether a record exists without fetching its full data.\n * Returns `null` if the record is not found.\n *\n * @example\n * const info = await db.records.exists('rec_abc123', { bucketKey: 'users' });\n * if (info?.exists) console.log('found at', info.updatedAt);\n */\n async exists(\n recordId: string,\n options: BucketOptions & RequestOptions\n ): Promise<RecordExistsInfo | null> {\n const { bucketKey, ...rest } = options;\n const res = await this.http.head(this.path(bucketKey), { recordId }, rest);\n\n if (res.status === 404) return null;\n if (!res.ok) return null;\n\n return {\n exists: true,\n id: res.headers.get('X-Record-Id') ?? recordId,\n createdAt: res.headers.get('X-Created-At') ?? '',\n updatedAt: res.headers.get('X-Updated-At') ?? '',\n sizeBytes: res.headers.get('X-Size-Bytes') ?? '',\n };\n }\n\n // ── Batch — update ─────────────────────────────────────────────────────────\n\n /**\n * Update up to 500 records in a single request.\n *\n * @example\n * await db.records.batchUpdate(\n * { updates: [{ recordId: 'rec_1', values: { status: 'archived' } }] },\n * { bucketKey: 'orders' }\n * );\n */\n async batchUpdate(\n payload: BatchUpdatePayload,\n options: BucketOptions & RequestOptions\n ): Promise<BatchUpdateResponse> {\n const { bucketKey, ...rest } = options;\n return this.http.post<BatchUpdateResponse>(`${this.path(bucketKey)}/batch/update`, payload, rest);\n }\n\n // ── Batch — delete ─────────────────────────────────────────────────────────\n\n /**\n * Delete up to 500 records in a single request.\n *\n * @example\n * await db.records.batchDelete(\n * { recordIds: ['rec_1', 'rec_2'] },\n * { bucketKey: 'orders' }\n * );\n */\n async batchDelete(\n payload: BatchDeletePayload,\n options: BucketOptions & RequestOptions\n ): Promise<BatchDeleteResponse> {\n const { bucketKey, ...rest } = options;\n return this.http.post<BatchDeleteResponse>(`${this.path(bucketKey)}/batch/delete`, payload, rest);\n }\n\n // ── Batch — insert ─────────────────────────────────────────────────────────\n\n /**\n * Insert up to 500 records in a single request.\n * Returns HTTP 207 (multi-status) — check `meta.failed` for partial failures.\n *\n * @example\n * const result = await db.records.batchInsert(\n * { records: [{ name: 'Alice' }, { name: 'Bob' }], queryableFields: ['name'] },\n * { bucketKey: 'users' }\n * );\n */\n async batchInsert(\n payload: BatchInsertPayload,\n options: BucketOptions & RequestOptions\n ): Promise<BatchInsertResponse> {\n const { bucketKey, ...rest } = options;\n return this.http.post<BatchInsertResponse>(`${this.path(bucketKey)}/batch/insert`, payload, rest);\n }\n\n // ── Helpers ────────────────────────────────────────────────────────────────\n\n /**\n * Fetch ALL records matching a query, automatically following cursors.\n * Use with care on large collections — prefer `query()` with manual pagination.\n *\n * @example\n * const allRecords = await db.records.queryAll({\n * bucketKey: 'orders',\n * filters: [{ field: 'type', op: '==', value: 'invoice' }],\n * });\n */\n async queryAll<T extends RecordData = RecordData>(\n options: Omit<QueryOptions, 'cursor'> & BucketOptions & RequestOptions\n ): Promise<(T & HydrousRecord)[]> {\n const all: (T & HydrousRecord)[] = [];\n let cursor: string | null = null;\n\n do {\n const result: any = await this.query<T>(\n cursor ? { ...options, cursor } : { ...options }\n );\n all.push(...result.data);\n cursor = result.meta.nextCursor ?? null;\n } while (cursor);\n\n return all;\n }\n}\n","import type { HttpClient } from '../utils/http.js';\nimport type {\n SignUpPayload,\n SignUpResponse,\n SignInPayload,\n SignInResponse,\n SignOutPayload,\n ValidateSessionResponse,\n RefreshSessionResponse,\n GetUserResponse,\n ListUsersResponse,\n UpdateUserPayload,\n UpdateUserResponse,\n PasswordChangePayload,\n PasswordResetRequestPayload,\n PasswordResetConfirmPayload,\n EmailVerifyRequestPayload,\n EmailVerifyConfirmPayload,\n AccountLockPayload,\n AccountLockResponse,\n AuthUser,\n RequestOptions,\n} from '../types/index.js';\n\nexport class AuthClient {\n constructor(private readonly http: HttpClient) {}\n\n private get path() {\n return `/auth/${this.http.authKey}`;\n }\n\n // ── Sign-up ────────────────────────────────────────────────────────────────\n\n /**\n * Create a new user account. Returns the user and a session immediately.\n *\n * @example\n * const { data, session } = await db.auth.signUp({\n * email: 'alice@example.com',\n * password: 'Str0ngP@ss!',\n * fullName: 'Alice Smith',\n * });\n * // Store session.sessionId and session.refreshToken in your app\n */\n async signUp(payload: SignUpPayload, opts?: RequestOptions): Promise<SignUpResponse> {\n return this.http.post<SignUpResponse>(`${this.path}/signup`, payload, opts);\n }\n\n // ── Sign-in ────────────────────────────────────────────────────────────────\n\n /**\n * Authenticate with email + password. Returns user data and a new session.\n *\n * @example\n * const { data, session } = await db.auth.signIn({\n * email: 'alice@example.com',\n * password: 'Str0ngP@ss!',\n * });\n */\n async signIn(payload: SignInPayload, opts?: RequestOptions): Promise<SignInResponse> {\n return this.http.post<SignInResponse>(`${this.path}/signin`, payload, opts);\n }\n\n // ── Sign-out ───────────────────────────────────────────────────────────────\n\n /**\n * Revoke a session (or all sessions for a user).\n *\n * @example\n * // Single device\n * await db.auth.signOut({ sessionId: 'sess_...' });\n *\n * // All devices\n * await db.auth.signOut({ allDevices: true, userId: 'user_...' });\n */\n async signOut(payload: SignOutPayload, opts?: RequestOptions): Promise<{ success: true; message: string }> {\n return this.http.post(`${this.path}/signout`, payload, opts);\n }\n\n // ── Session: validate ──────────────────────────────────────────────────────\n\n /**\n * Validate a session token — use this on every protected request in your backend.\n *\n * @example\n * try {\n * const { data } = await db.auth.validateSession(sessionId);\n * // data is the authenticated user\n * } catch (err) {\n * // Session expired or invalid\n * }\n */\n async validateSession(sessionId: string, opts?: RequestOptions): Promise<ValidateSessionResponse> {\n return this.http.post<ValidateSessionResponse>(`${this.path}/session/validate`, { sessionId }, opts);\n }\n\n // ── Session: refresh ───────────────────────────────────────────────────────\n\n /**\n * Exchange a refresh token for a new session (rotation).\n * The old session is revoked.\n *\n * @example\n * const { session } = await db.auth.refreshSession(refreshToken);\n */\n async refreshSession(refreshToken: string, opts?: RequestOptions): Promise<RefreshSessionResponse> {\n return this.http.post<RefreshSessionResponse>(`${this.path}/session/refresh`, { refreshToken }, opts);\n }\n\n // ── User: get ──────────────────────────────────────────────────────────────\n\n /**\n * Fetch a user by their ID.\n *\n * @example\n * const { data } = await db.auth.getUser('user_abc123');\n */\n async getUser(userId: string, opts?: RequestOptions): Promise<GetUserResponse> {\n return this.http.get<GetUserResponse>(`${this.path}/user`, { userId }, opts);\n }\n\n // ── User: list ─────────────────────────────────────────────────────────────\n\n /**\n * List users with cursor-based pagination.\n *\n * @example\n * const { data, meta } = await db.auth.listUsers({ limit: 50 });\n */\n async listUsers(options?: { limit?: number; cursor?: string } & RequestOptions): Promise<ListUsersResponse> {\n const params: Record<string, string | number | boolean | undefined | null> = {\n limit: options?.limit,\n };\n if (options?.cursor) params['cursor'] = options.cursor;\n return this.http.get<ListUsersResponse>(`${this.path}/users`, params, options);\n }\n\n // ── User: update ───────────────────────────────────────────────────────────\n\n /**\n * Update user profile fields.\n *\n * @example\n * await db.auth.updateUser({ userId: 'user_abc', updates: { fullName: 'Bob Smith' } });\n */\n async updateUser(payload: UpdateUserPayload, opts?: RequestOptions): Promise<UpdateUserResponse> {\n return this.http.patch<UpdateUserResponse>(`${this.path}/user`, payload, opts);\n }\n\n // ── User: delete ───────────────────────────────────────────────────────────\n\n /**\n * Soft-delete a user. All their sessions are revoked automatically.\n *\n * @example\n * await db.auth.deleteUser('user_abc123');\n */\n async deleteUser(userId: string, opts?: RequestOptions): Promise<{ success: true; message: string }> {\n return this.http.delete(`${this.path}/user`, { userId }, opts);\n }\n\n // ── Password: change ───────────────────────────────────────────────────────\n\n /**\n * Change password for a signed-in user (requires old password).\n * All sessions are revoked after success.\n *\n * @example\n * await db.auth.changePassword({\n * userId: 'user_abc',\n * oldPassword: 'Old@Pass1',\n * newPassword: 'New@Pass2',\n * });\n */\n async changePassword(payload: PasswordChangePayload, opts?: RequestOptions): Promise<{ success: true; message: string }> {\n return this.http.post(`${this.path}/password/change`, payload, opts);\n }\n\n // ── Password: reset request ────────────────────────────────────────────────\n\n /**\n * Request a password reset email.\n * Always returns success to prevent email enumeration.\n *\n * @example\n * await db.auth.requestPasswordReset({ email: 'alice@example.com' });\n */\n async requestPasswordReset(payload: PasswordResetRequestPayload, opts?: RequestOptions): Promise<{ success: true; message: string }> {\n return this.http.post(`${this.path}/password/reset/request`, payload, opts);\n }\n\n // ── Password: reset confirm ────────────────────────────────────────────────\n\n /**\n * Confirm a password reset using the token from the reset email.\n *\n * @example\n * await db.auth.confirmPasswordReset({ resetToken: 'tok_...', newPassword: 'New@Pass2' });\n */\n async confirmPasswordReset(payload: PasswordResetConfirmPayload, opts?: RequestOptions): Promise<{ success: true; message: string }> {\n return this.http.post(`${this.path}/password/reset/confirm`, payload, opts);\n }\n\n // ── Email: verify request ──────────────────────────────────────────────────\n\n /**\n * Send a verification email to the user.\n *\n * @example\n * await db.auth.requestEmailVerification({ userId: 'user_abc' });\n */\n async requestEmailVerification(payload: EmailVerifyRequestPayload, opts?: RequestOptions): Promise<{ success: true; message: string }> {\n return this.http.post(`${this.path}/email/verify/request`, payload, opts);\n }\n\n // ── Email: verify confirm ──────────────────────────────────────────────────\n\n /**\n * Confirm email address using the token from the verification email.\n *\n * @example\n * await db.auth.confirmEmailVerification({ verifyToken: 'tok_...' });\n */\n async confirmEmailVerification(payload: EmailVerifyConfirmPayload, opts?: RequestOptions): Promise<{ success: true; message: string }> {\n return this.http.post(`${this.path}/email/verify/confirm`, payload, opts);\n }\n\n // ── Account: lock ──────────────────────────────────────────────────────────\n\n /**\n * Lock a user account for a given duration (default: 15 min).\n *\n * @example\n * await db.auth.lockAccount({ userId: 'user_abc', duration: 30 * 60 * 1000 });\n */\n async lockAccount(payload: AccountLockPayload, opts?: RequestOptions): Promise<AccountLockResponse> {\n return this.http.post<AccountLockResponse>(`${this.path}/account/lock`, payload, opts);\n }\n\n // ── Account: unlock ────────────────────────────────────────────────────────\n\n /**\n * Unlock a previously locked user account.\n *\n * @example\n * await db.auth.unlockAccount('user_abc');\n */\n async unlockAccount(userId: string, opts?: RequestOptions): Promise<{ success: true; message: string }> {\n return this.http.post(`${this.path}/account/unlock`, { userId }, opts);\n }\n\n // ── Helpers ────────────────────────────────────────────────────────────────\n\n /**\n * Fetch all users, automatically following cursors.\n *\n * @example\n * const users = await db.auth.listAllUsers();\n */\n async listAllUsers(opts?: RequestOptions): Promise<AuthUser[]> {\n const all: AuthUser[] = [];\n let cursor: string | null = null;\n\n do {\n const result = await this.listUsers(cursor ? { cursor, ...opts } : { ...opts });\n all.push(...result.data);\n cursor = result.meta.nextCursor ?? null;\n } while (cursor);\n\n return all;\n }\n}\n","import type { HttpClient } from '../utils/http.js';\nimport type {\n AnalyticsQuery,\n AnalyticsResponse,\n DateRange,\n Filter,\n MultiMetricItem,\n RequestOptions,\n CountResult,\n DistributionItem,\n SumResult,\n TimeSeriesPoint,\n FieldTimeSeriesPoint,\n TopNItem,\n FieldStatsResult,\n FilteredRecordsResult,\n StorageStatsResult,\n} from '../types/index.js';\n\n// Typed wrapper so callers get proper return types\ntype AnalyticsResult<T> = Omit<AnalyticsResponse, 'data'> & {\n data: T;\n queryType: string;\n bucketKey: string | null;\n projectId: string;\n};\n\n/** Options accepted by every analytics method */\nexport interface BucketOptions {\n /**\n * The bucket to run the analytics query against.\n * Required on all analytics calls.\n *\n * @example\n * const { data } = await db.analytics.count({ bucketKey: 'orders' });\n */\n bucketKey: string;\n}\n\nexport class AnalyticsClient {\n constructor(private readonly http: HttpClient) {}\n\n /** Builds the path for a given bucket: /api/analytics/:bucketKey/:securityKey */\n private path(bucketKey: string): string {\n return `/api/analytics/${bucketKey}/${this.http.securityKey}`;\n }\n\n // ── Raw query ─────────────────────────────────────────────────────────────\n\n /**\n * Run any analytics query with full control over the payload.\n * Prefer the typed convenience methods below for everyday use.\n */\n async query<T = unknown>(\n payload: AnalyticsQuery,\n options: BucketOptions & RequestOptions\n ): Promise<AnalyticsResult<T>> {\n const { bucketKey, ...rest } = options;\n return this.http.post<AnalyticsResult<T>>(this.path(bucketKey), payload, rest);\n }\n\n // ── count ──────────────────────────────────────────────────────────────────\n\n /**\n * Total record count, optionally scoped to a date range.\n *\n * @example\n * const { data } = await db.analytics.count({ bucketKey: 'orders' });\n * console.log(data.count);\n *\n * const { data } = await db.analytics.count({\n * bucketKey: 'orders',\n * dateRange: { startDate: '2025-01-01', endDate: '2025-12-31' },\n * });\n */\n async count(\n options: { dateRange?: DateRange } & BucketOptions & RequestOptions\n ): Promise<AnalyticsResult<CountResult>> {\n const { dateRange, ...rest } = options;\n return this.query<CountResult>({ queryType: 'count', dateRange }, rest);\n }\n\n // ── distribution ───────────────────────────────────────────────────────────\n\n /**\n * Value distribution (histogram) for a field.\n *\n * @example\n * const { data } = await db.analytics.distribution('status', { bucketKey: 'orders' });\n * // [{ value: 'active', count: 80 }, { value: 'archived', count: 20 }]\n */\n async distribution(\n field: string,\n options: { limit?: number; order?: 'asc' | 'desc'; dateRange?: DateRange } & BucketOptions & RequestOptions\n ): Promise<AnalyticsResult<DistributionItem[]>> {\n const { limit, order, dateRange, ...rest } = options;\n return this.query<DistributionItem[]>({ queryType: 'distribution', field, limit, order, dateRange }, rest);\n }\n\n // ── sum ────────────────────────────────────────────────────────────────────\n\n /**\n * Sum a numeric field, with optional group-by.\n *\n * @example\n * const { data } = await db.analytics.sum('revenue', { bucketKey: 'orders', groupBy: 'region' });\n */\n async sum(\n field: string,\n options: { groupBy?: string; limit?: number; dateRange?: DateRange } & BucketOptions & RequestOptions\n ): Promise<AnalyticsResult<SumResult>> {\n const { groupBy, limit, dateRange, ...rest } = options;\n return this.query<SumResult>({ queryType: 'sum', field, groupBy, limit, dateRange }, rest);\n }\n\n // ── timeSeries ─────────────────────────────────────────────────────────────\n\n /**\n * Record count grouped over time.\n *\n * @example\n * const { data } = await db.analytics.timeSeries({ bucketKey: 'orders', granularity: 'day' });\n * // [{ date: '2025-01-01', count: 42 }, ...]\n */\n async timeSeries(\n options: { granularity?: 'hour' | 'day' | 'week' | 'month'; dateRange?: DateRange } & BucketOptions & RequestOptions\n ): Promise<AnalyticsResult<TimeSeriesPoint[]>> {\n const { granularity, dateRange, ...rest } = options;\n return this.query<TimeSeriesPoint[]>({ queryType: 'timeSeries', granularity, dateRange }, rest);\n }\n\n // ── fieldTimeSeries ────────────────────────────────────────────────────────\n\n /**\n * Aggregate a numeric field over time.\n *\n * @example\n * const { data } = await db.analytics.fieldTimeSeries('revenue', {\n * bucketKey: 'orders',\n * granularity: 'month',\n * aggregation: 'sum',\n * });\n */\n async fieldTimeSeries(\n field: string,\n options: {\n aggregation?: 'sum' | 'avg' | 'min' | 'max' | 'count';\n granularity?: 'hour' | 'day' | 'week' | 'month';\n dateRange?: DateRange;\n } & BucketOptions & RequestOptions\n ): Promise<AnalyticsResult<FieldTimeSeriesPoint[]>> {\n const { aggregation, granularity, dateRange, ...rest } = options;\n return this.query<FieldTimeSeriesPoint[]>({ queryType: 'fieldTimeSeries', field, aggregation, granularity, dateRange }, rest);\n }\n\n // ── topN ───────────────────────────────────────────────────────────────────\n\n /**\n * Top N most frequent values for a field.\n *\n * @example\n * const { data } = await db.analytics.topN('country', 5, { bucketKey: 'users' });\n * // [{ label: 'US', value: 'US', count: 500 }, ...]\n */\n async topN(\n field: string,\n n = 10,\n options: { labelField?: string; order?: 'asc' | 'desc'; dateRange?: DateRange } & BucketOptions & RequestOptions\n ): Promise<AnalyticsResult<TopNItem[]>> {\n const { labelField, order, dateRange, ...rest } = options;\n return this.query<TopNItem[]>({ queryType: 'topN', field, n, labelField, order, dateRange }, rest);\n }\n\n // ── stats ──────────────────────────────────────────────────────────────────\n\n /**\n * Statistical summary for a numeric field: min, max, avg, stddev, p50, p90, p99.\n *\n * @example\n * const { data } = await db.analytics.stats('score', { bucketKey: 'users' });\n * console.log(data.avg, data.p99);\n */\n async stats(\n field: string,\n options: { dateRange?: DateRange } & BucketOptions & RequestOptions\n ): Promise<AnalyticsResult<FieldStatsResult>> {\n const { dateRange, ...rest } = options;\n return this.query<FieldStatsResult>({ queryType: 'stats', field, dateRange }, rest);\n }\n\n // ── records ────────────────────────────────────────────────────────────────\n\n /**\n * Filtered, paginated raw records with optional field projection.\n * Supports filter ops: == != > < >= <= CONTAINS\n *\n * @example\n * const { data } = await db.analytics.records({\n * bucketKey: 'users',\n * filters: [{ field: 'role', op: '==', value: 'admin' }],\n * selectFields: ['email', 'createdAt'],\n * limit: 25,\n * });\n */\n async records(\n options: {\n filters?: Filter[];\n selectFields?: string[];\n limit?: number;\n offset?: number;\n orderBy?: string;\n order?: 'asc' | 'desc';\n dateRange?: DateRange;\n } & BucketOptions & RequestOptions\n ): Promise<AnalyticsResult<FilteredRecordsResult>> {\n const { filters, selectFields, limit, offset, orderBy, order, dateRange, ...rest } = options;\n return this.query<FilteredRecordsResult>(\n { queryType: 'records', filters, selectFields, limit, offset, orderBy, order, dateRange },\n rest\n );\n }\n\n // ── multiMetric ────────────────────────────────────────────────────────────\n\n /**\n * Multiple aggregations in a single call — ideal for dashboard stat cards.\n *\n * @example\n * const { data } = await db.analytics.multiMetric(\n * [\n * { name: 'totalRevenue', field: 'amount', aggregation: 'sum' },\n * { name: 'avgScore', field: 'score', aggregation: 'avg' },\n * ],\n * { bucketKey: 'orders' }\n * );\n * console.log(data.totalRevenue, data.avgScore);\n */\n async multiMetric(\n metrics: MultiMetricItem[],\n options: { dateRange?: DateRange } & BucketOptions & RequestOptions\n ): Promise<AnalyticsResult<Record<string, number>>> {\n const { dateRange, ...rest } = options;\n return this.query<Record<string, number>>({ queryType: 'multiMetric', metrics, dateRange }, rest);\n }\n\n // ── storageStats ───────────────────────────────────────────────────────────\n\n /**\n * Storage statistics for a bucket — total records, bytes, avg/min/max size.\n *\n * @example\n * const { data } = await db.analytics.storageStats({ bucketKey: 'orders' });\n * console.log(data.totalRecords, data.totalBytes);\n */\n async storageStats(\n options: { dateRange?: DateRange } & BucketOptions & RequestOptions\n ): Promise<AnalyticsResult<StorageStatsResult>> {\n const { dateRange, ...rest } = options;\n return this.query<StorageStatsResult>({ queryType: 'storageStats', dateRange }, rest);\n }\n\n // ── crossBucket ────────────────────────────────────────────────────────────\n\n /**\n * Compare a metric across multiple buckets in one query.\n * Note: `bucketKey` here is used only for auth — the actual buckets\n * compared are specified via `bucketKeys`.\n *\n * @example\n * const { data } = await db.analytics.crossBucket({\n * bucketKey: 'sales-2025', // auth bucket\n * bucketKeys: ['sales-2024', 'sales-2025'],\n * field: 'amount',\n * aggregation: 'sum',\n * });\n */\n async crossBucket(\n options: {\n bucketKeys: string[];\n field: string;\n aggregation?: 'sum' | 'avg' | 'min' | 'max' | 'count';\n dateRange?: DateRange;\n } & BucketOptions & RequestOptions\n ): Promise<AnalyticsResult<unknown>> {\n const { bucketKeys, field, aggregation, dateRange, ...rest } = options;\n return this.query<unknown>({ queryType: 'crossBucket', bucketKeys, field, aggregation, dateRange }, rest);\n }\n}\n","import { HttpClient } from './utils/http.js';\nimport { RecordsClient } from './records/client.js';\nimport { AuthClient } from './auth/client.js';\nimport { AnalyticsClient } from './analytics/client.js';\nimport type { HydrousConfig } from './types/index.js';\n\nexport { HydrousError, HydrousNetworkError, HydrousTimeoutError } from './utils/errors.js';\nexport type { HydrousConfig } from './types/index.js';\n\n/**\n * The main entry point for the HydrousDB SDK.\n *\n * Initialise once with your `authKey` and `securityKey`.\n * Every records and analytics call then takes a `bucketKey` option\n * so a single client instance can work across multiple buckets.\n *\n * @example\n * import { createClient } from 'hydrousdb';\n *\n * const db = createClient({\n * authKey: 'ak_...', // for /auth routes\n * securityKey: 'sk_...', // credential for records & analytics\n * });\n *\n * // Records — pass bucketKey on every call\n * const { data } = await db.records.get('rec_abc123', { bucketKey: 'users' });\n * await db.records.insert({ values: { name: 'Alice' } }, { bucketKey: 'users' });\n *\n * // Auth — no bucketKey needed\n * const { data, session } = await db.auth.signIn({ email: 'a@b.com', password: '...' });\n *\n * // Analytics — pass bucketKey on every call\n * const { data } = await db.analytics.count({ bucketKey: 'orders' });\n */\nexport class HydrousClient {\n /** Record CRUD and batch operations */\n readonly records: RecordsClient;\n /** User authentication and session management */\n readonly auth: AuthClient;\n /** Analytics and aggregations */\n readonly analytics: AnalyticsClient;\n\n private readonly http: HttpClient;\n\n constructor(config: HydrousConfig) {\n if (!config.authKey) throw new Error('[hydrousdb] authKey is required');\n if (!config.securityKey) throw new Error('[hydrousdb] securityKey is required');\n\n this.http = new HttpClient(config);\n this.records = new RecordsClient(this.http);\n this.auth = new AuthClient(this.http);\n this.analytics = new AnalyticsClient(this.http);\n }\n}\n\n/**\n * Create a HydrousDB client.\n *\n * @example\n * const db = createClient({ authKey: 'ak_...', securityKey: 'sk_...' });\n */\nexport function createClient(config: HydrousConfig): HydrousClient {\n return new HydrousClient(config);\n}\n"]}
1
+ {"version":3,"sources":["../src/utils/errors.ts","../src/utils/http.ts","../src/auth/client.ts","../src/utils/query.ts","../src/records/client.ts","../src/analytics/client.ts","../src/storage/scoped.ts","../src/storage/manager.ts","../src/client.ts","../src/index.ts"],"names":["_a","_b"],"mappings":"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","file":"index.js","sourcesContent":["import type { HydrousError } from '../types/index.js';\n\nexport class HydrousDBError extends Error {\n readonly code: string;\n readonly status: number | undefined;\n\n constructor(message: string, code = 'SDK_ERROR', status?: number) {\n super(message);\n this.name = 'HydrousDBError';\n this.code = code;\n this.status = status;\n }\n}\n\nexport function toHydrousError(err: unknown): HydrousError {\n if (err instanceof HydrousDBError) {\n return { message: err.message, code: err.code, status: err.status };\n }\n if (err instanceof Error) {\n return { message: err.message, code: 'UNKNOWN_ERROR' };\n }\n return { message: String(err), code: 'UNKNOWN_ERROR' };\n}\n\nexport function isHydrousError(err: unknown): err is HydrousDBError {\n return err instanceof HydrousDBError;\n}\n","import { HydrousDBError } from './errors.js';\n\nexport async function parseResponse<T>(res: Response): Promise<T> {\n let body: unknown;\n try {\n body = await res.json();\n } catch {\n if (!res.ok) throw new HydrousDBError(`HTTP ${res.status}`, 'HTTP_ERROR', res.status);\n return undefined as T;\n }\n if (!res.ok) {\n const e = body as { error?: string; message?: string; code?: string };\n throw new HydrousDBError(\n e.error || e.message || `HTTP ${res.status}`,\n e.code || 'HTTP_ERROR',\n res.status,\n );\n }\n return body as T;\n}\n\nexport function buildUrl(\n base: string,\n path: string,\n params?: Record<string, string | number | boolean | undefined>,\n): string {\n const url = new URL(path, base.endsWith('/') ? base : base + '/');\n if (params) {\n for (const [k, v] of Object.entries(params)) {\n if (v !== undefined && v !== null) url.searchParams.set(k, String(v));\n }\n }\n return url.toString();\n}\n\nexport function mergeHeaders(\n a: Record<string, string>,\n b?: Record<string, string>,\n): Record<string, string> {\n return { ...a, ...b };\n}\n\n/**\n * Parse a streaming Server-Sent Events response.\n * Resolves when the stream ends.\n */\nexport async function readSSEStream(\n response: Response,\n onEvent: (eventType: string, data: unknown) => void,\n): Promise<void> {\n if (!response.body) return;\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buf = '';\n\n const flush = (chunk: string) => {\n buf += chunk;\n const blocks = buf.split('\\n\\n');\n buf = blocks.pop() ?? '';\n for (const block of blocks) {\n if (!block.trim()) continue;\n let eventType = 'message';\n let dataLine: string | null = null;\n for (const line of block.split('\\n')) {\n if (line.startsWith('event:')) eventType = line.slice(6).trim();\n if (line.startsWith('data:')) dataLine = line.slice(5).trim();\n }\n if (dataLine === null) continue;\n try { onEvent(eventType, JSON.parse(dataLine)); } catch { /* skip heartbeats */ }\n }\n };\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n flush(decoder.decode(value, { stream: true }));\n }\n if (buf.trim()) flush('');\n}\n\n/** Parse an already-complete SSE text body (XHR response flow) */\nexport function parseSSEText(\n text: string,\n onEvent: (eventType: string, data: unknown) => void,\n): void {\n const blocks = text.split('\\n\\n');\n for (const block of blocks) {\n if (!block.trim()) continue;\n let eventType = 'message';\n let dataLine: string | null = null;\n for (const line of block.split('\\n')) {\n if (line.startsWith('event:')) eventType = line.slice(6).trim();\n if (line.startsWith('data:')) dataLine = line.slice(5).trim();\n }\n if (dataLine === null) continue;\n try { onEvent(eventType, JSON.parse(dataLine)); } catch { /* skip */ }\n }\n}\n\n/**\n * XHR-based upload — gives real byte-level progress during the outbound\n * request body transfer. `fetch()` cannot do this because it buffers the\n * entire body before sending.\n */\nexport function xhrUpload(\n url: string,\n body: FormData | Blob | BufferSource,\n headers: Record<string, string>,\n onProgress?: (loaded: number, total: number) => void,\n): Promise<string> {\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n xhr.open('POST', url);\n for (const [k, v] of Object.entries(headers)) xhr.setRequestHeader(k, v);\n xhr.responseType = 'text';\n\n if (onProgress) {\n xhr.upload.onprogress = (e) => {\n if (e.lengthComputable) onProgress(e.loaded, e.total);\n };\n }\n\n xhr.onload = () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n resolve(xhr.responseText);\n } else {\n try {\n const d = JSON.parse(xhr.responseText) as { error?: string };\n reject(new HydrousDBError(d.error ?? `HTTP ${xhr.status}`, 'HTTP_ERROR', xhr.status));\n } catch {\n reject(new HydrousDBError(`HTTP ${xhr.status}`, 'HTTP_ERROR', xhr.status));\n }\n }\n };\n\n xhr.onerror = () => reject(new HydrousDBError('Network error', 'NETWORK_ERROR'));\n xhr.onabort = () => reject(new HydrousDBError('Upload aborted', 'UPLOAD_ABORTED'));\n xhr.ontimeout = () => reject(new HydrousDBError('Upload timed out', 'UPLOAD_TIMEOUT'));\n xhr.send(body);\n });\n}\n","import type {\n HydrousConfig, HydrousResponse,\n AuthUser, AuthSession, SignUpOptions, SignInOptions,\n} from '../types/index.js';\nimport { toHydrousError } from '../utils/errors.js';\nimport { buildUrl, mergeHeaders, parseResponse } from '../utils/http.js';\n\nexport class AuthClient {\n private readonly baseUrl: string;\n private readonly headers: Record<string, string>;\n private session: AuthSession | null = null;\n\n constructor(config: HydrousConfig) {\n this.baseUrl = config.url;\n this.headers = {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${config.authKey}`,\n };\n }\n\n /** Create a new user account */\n async signUp(options: SignUpOptions): Promise<HydrousResponse<AuthSession>> {\n try {\n const res = await fetch(buildUrl(this.baseUrl, 'auth/signup'), {\n method: 'POST', headers: this.headers, body: JSON.stringify(options),\n });\n const json = await parseResponse<{ data: AuthSession }>(res);\n this.session = json.data;\n return { data: json.data, error: null };\n } catch (err) { return { data: null, error: toHydrousError(err) }; }\n }\n\n /** Sign in with email and password */\n async signIn(options: SignInOptions): Promise<HydrousResponse<AuthSession>> {\n try {\n const res = await fetch(buildUrl(this.baseUrl, 'auth/signin'), {\n method: 'POST', headers: this.headers, body: JSON.stringify(options),\n });\n const json = await parseResponse<{ data: AuthSession }>(res);\n this.session = json.data;\n return { data: json.data, error: null };\n } catch (err) { return { data: null, error: toHydrousError(err) }; }\n }\n\n /** Sign out and invalidate the current session */\n async signOut(): Promise<HydrousResponse<void>> {\n try {\n const res = await fetch(buildUrl(this.baseUrl, 'auth/signout'), {\n method: 'POST',\n headers: mergeHeaders(this.headers, this._sessionHeader()),\n });\n await parseResponse<void>(res);\n this.session = null;\n return { data: undefined, error: null };\n } catch (err) { return { data: null, error: toHydrousError(err) }; }\n }\n\n /** Get the currently authenticated user */\n async getUser(): Promise<HydrousResponse<AuthUser>> {\n try {\n const res = await fetch(buildUrl(this.baseUrl, 'auth/user'), {\n headers: mergeHeaders(this.headers, this._sessionHeader()),\n });\n const json = await parseResponse<{ data: AuthUser }>(res);\n return { data: json.data, error: null };\n } catch (err) { return { data: null, error: toHydrousError(err) }; }\n }\n\n /** Refresh the access token using the stored refresh token */\n async refreshSession(): Promise<HydrousResponse<AuthSession>> {\n if (!this.session?.refreshToken) {\n return { data: null, error: { message: 'No active session', code: 'NO_SESSION' } };\n }\n try {\n const res = await fetch(buildUrl(this.baseUrl, 'auth/refresh'), {\n method: 'POST', headers: this.headers,\n body: JSON.stringify({ refreshToken: this.session.refreshToken }),\n });\n const json = await parseResponse<{ data: AuthSession }>(res);\n this.session = json.data;\n return { data: json.data, error: null };\n } catch (err) { return { data: null, error: toHydrousError(err) }; }\n }\n\n /** Return the current in-memory session (may be null) */\n getSession(): AuthSession | null { return this.session; }\n\n private _sessionHeader(): Record<string, string> {\n return this.session?.accessToken\n ? { 'X-Session-Token': this.session.accessToken }\n : {};\n }\n}\n","import type { Filter, FilterOperator, QueryOptions } from '../types/index.js';\n\nexport function serialiseQuery(opts: QueryOptions = {}): Record<string, string> {\n const params: Record<string, string> = {};\n if (opts.limit !== undefined) params['limit'] = String(opts.limit);\n if (opts.offset !== undefined) params['offset'] = String(opts.offset);\n if (opts.select && opts.select.length > 0) params['select'] = opts.select.join(',');\n if (opts.orderBy) {\n params['orderBy'] = opts.orderBy.field;\n params['direction'] = opts.orderBy.direction ?? 'asc';\n }\n const filters = opts.where\n ? Array.isArray(opts.where) ? opts.where : [opts.where]\n : [];\n if (filters.length > 0) params['where'] = JSON.stringify(filters);\n return params;\n}\n\nexport const eq = (field: string, value: unknown): Filter => ({ field, operator: 'eq' as FilterOperator, value });\nexport const neq = (field: string, value: unknown): Filter => ({ field, operator: 'neq' as FilterOperator, value });\nexport const gt = (field: string, value: unknown): Filter => ({ field, operator: 'gt' as FilterOperator, value });\nexport const lt = (field: string, value: unknown): Filter => ({ field, operator: 'lt' as FilterOperator, value });\nexport const gte = (field: string, value: unknown): Filter => ({ field, operator: 'gte' as FilterOperator, value });\nexport const lte = (field: string, value: unknown): Filter => ({ field, operator: 'lte' as FilterOperator, value });\nexport const inArray = (field: string, value: unknown[]): Filter => ({ field, operator: 'in' as FilterOperator, value });\n","import type {\n HydrousConfig, QueryOptions,\n RecordResponse, SingleRecordResponse,\n} from '../types/index.js';\nimport { toHydrousError } from '../utils/errors.js';\nimport { buildUrl, parseResponse } from '../utils/http.js';\nimport { serialiseQuery } from '../utils/query.js';\n\nexport class RecordsClient {\n private readonly baseUrl: string;\n private readonly headers: Record<string, string>;\n\n constructor(config: HydrousConfig) {\n this.baseUrl = config.url;\n this.headers = {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${config.bucketSecurityKey}`,\n };\n }\n\n /** Query records from a collection */\n async select<T = Record<string, unknown>>(\n collection: string,\n options: QueryOptions = {},\n ): Promise<RecordResponse<T>> {\n try {\n const url = buildUrl(this.baseUrl, `records/${collection}`, serialiseQuery(options));\n const res = await fetch(url, { headers: this.headers });\n const json = await parseResponse<{ data: T[]; count: number }>(res);\n return { data: json.data, count: json.count, error: null };\n } catch (err) { return { data: [], count: 0, error: toHydrousError(err) }; }\n }\n\n /** Fetch a single record by ID */\n async get<T = Record<string, unknown>>(\n collection: string,\n id: string,\n ): Promise<SingleRecordResponse<T>> {\n try {\n const res = await fetch(buildUrl(this.baseUrl, `records/${collection}/${id}`), { headers: this.headers });\n const json = await parseResponse<{ data: T }>(res);\n return { data: json.data, error: null };\n } catch (err) { return { data: null, error: toHydrousError(err) }; }\n }\n\n /** Insert one or more records */\n async insert<T = Record<string, unknown>>(\n collection: string,\n payload: Partial<T> | Partial<T>[],\n ): Promise<RecordResponse<T>> {\n try {\n const res = await fetch(buildUrl(this.baseUrl, `records/${collection}`), {\n method: 'POST', headers: this.headers, body: JSON.stringify(payload),\n });\n const json = await parseResponse<{ data: T[]; count: number }>(res);\n return { data: json.data, count: json.count, error: null };\n } catch (err) { return { data: [], count: 0, error: toHydrousError(err) }; }\n }\n\n /** Update a record by ID */\n async update<T = Record<string, unknown>>(\n collection: string,\n id: string,\n payload: Partial<T>,\n ): Promise<SingleRecordResponse<T>> {\n try {\n const res = await fetch(buildUrl(this.baseUrl, `records/${collection}/${id}`), {\n method: 'PATCH', headers: this.headers, body: JSON.stringify(payload),\n });\n const json = await parseResponse<{ data: T }>(res);\n return { data: json.data, error: null };\n } catch (err) { return { data: null, error: toHydrousError(err) }; }\n }\n\n /** Delete a record by ID */\n async delete(collection: string, id: string): Promise<SingleRecordResponse<void>> {\n try {\n const res = await fetch(buildUrl(this.baseUrl, `records/${collection}/${id}`), {\n method: 'DELETE', headers: this.headers,\n });\n await parseResponse<void>(res);\n return { data: undefined, error: null };\n } catch (err) { return { data: null, error: toHydrousError(err) }; }\n }\n}\n","import type {\n HydrousConfig, HydrousResponse,\n TrackEventOptions, AnalyticsQueryOptions,\n AnalyticsEvent, RecordResponse,\n} from '../types/index.js';\nimport { toHydrousError } from '../utils/errors.js';\nimport { buildUrl, parseResponse } from '../utils/http.js';\n\nexport class AnalyticsClient {\n private readonly baseUrl: string;\n private readonly headers: Record<string, string>;\n\n constructor(config: HydrousConfig) {\n this.baseUrl = config.url;\n this.headers = {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${config.bucketSecurityKey}`,\n };\n }\n\n /** Track a single analytics event */\n async track(options: TrackEventOptions): Promise<HydrousResponse<void>> {\n try {\n const res = await fetch(buildUrl(this.baseUrl, 'analytics/track'), {\n method: 'POST', headers: this.headers,\n body: JSON.stringify({ ...options, timestamp: options.timestamp ?? Date.now() }),\n });\n await parseResponse<void>(res);\n return { data: undefined, error: null };\n } catch (err) { return { data: null, error: toHydrousError(err) }; }\n }\n\n /** Track many events in one request */\n async trackBatch(events: TrackEventOptions[]): Promise<HydrousResponse<void>> {\n try {\n const stamped = events.map(e => ({ ...e, timestamp: e.timestamp ?? Date.now() }));\n const res = await fetch(buildUrl(this.baseUrl, 'analytics/track/batch'), {\n method: 'POST', headers: this.headers,\n body: JSON.stringify({ events: stamped }),\n });\n await parseResponse<void>(res);\n return { data: undefined, error: null };\n } catch (err) { return { data: null, error: toHydrousError(err) }; }\n }\n\n /** Query recorded analytics events */\n async query(options: AnalyticsQueryOptions = {}): Promise<RecordResponse<AnalyticsEvent>> {\n try {\n const params: Record<string, string> = {};\n if (options.event) params['event'] = options.event;\n if (options.from) params['from'] = options.from;\n if (options.to) params['to'] = options.to;\n if (options.limit) params['limit'] = String(options.limit);\n if (options.groupBy) params['groupBy'] = options.groupBy;\n const url = buildUrl(this.baseUrl, 'analytics/events', params);\n const res = await fetch(url, { headers: this.headers });\n const json = await parseResponse<{ data: AnalyticsEvent[]; count: number }>(res);\n return { data: json.data, count: json.count, error: null };\n } catch (err) { return { data: [], count: 0, error: toHydrousError(err) }; }\n }\n}\n","import type {\n HydrousResponse,\n UploadOptions, UploadResult,\n BatchUploadOptions, BatchUploadResult,\n BatchDownloadOptions, BatchDownloadFile,\n ListOptions, ListResult,\n SignedUrlOptions, SignedUrlResult,\n FileMetadata, StorageStats, StorageItem,\n UploadProgress, DownloadProgress,\n} from '../types/index.js';\nimport { HydrousDBError, toHydrousError } from '../utils/errors.js';\nimport {\n buildUrl, parseResponse,\n readSSEStream, parseSSEText, xhrUpload,\n} from '../utils/http.js';\n\n// ── env detect ────────────────────────────────────────────────────────────────\nconst isBrowser =\n typeof window !== 'undefined' && typeof XMLHttpRequest !== 'undefined';\n\n// ── internal helpers ──────────────────────────────────────────────────────────\nfunction storageBase(url: string, bucketKey: string): string {\n return `${url.replace(/\\/$/, '')}/storage/${encodeURIComponent(bucketKey)}`;\n}\n\nfunction storageHeaders(bucketKey: string): Record<string, string> {\n return { 'X-Storage-Key': bucketKey };\n}\n\nfunction jsonHeaders(bucketKey: string): Record<string, string> {\n return { 'X-Storage-Key': bucketKey, 'Content-Type': 'application/json' };\n}\n\n/** Pull progress events + final results out of a completed SSE text body */\nfunction drainSSE(\n raw: string,\n onProgress: ((p: UploadProgress) => void) | undefined,\n): { results: UploadResult[]; errors: Array<{ path: string; error: string; code: string }> } {\n const results: UploadResult[] = [];\n const errors: Array<{ path: string; error: string; code: string }> = [];\n\n parseSSEText(raw, (eventType, data) => {\n const d = data as Record<string, unknown>;\n\n if (eventType === 'progress' && onProgress) {\n onProgress({\n index: (d['index'] as number) ?? 0,\n total: (d['total'] as number) ?? 1,\n path: (d['path'] as string) ?? '',\n stage: (d['stage'] as UploadProgress['stage']) ?? 'uploading',\n bytesUploaded: (d['bytesUploaded'] as number) ?? 0,\n totalBytes: (d['totalBytes'] as number) ?? 0,\n percent: (d['percent'] as number) ?? 0,\n bytesPerSecond: (d['bytesPerSecond'] as number | null) ?? null,\n eta: (d['eta'] as number | null) ?? null,\n result: d['result'] as UploadResult | undefined,\n error: d['error'] as string | undefined,\n code: d['code'] as string | undefined,\n });\n }\n\n if (eventType === 'done') {\n if ((d as { path?: string })['path']) {\n results.push(d as unknown as UploadResult);\n } else if (Array.isArray(d['succeeded'])) {\n results.push(...(d['succeeded'] as UploadResult[]));\n errors.push(...(d['errors'] as Array<{ path: string; error: string; code: string }> ?? []));\n }\n }\n\n if (eventType === 'error') {\n errors.push({\n path: '',\n error: (d['error'] as string) ?? 'Unknown error',\n code: (d['code'] as string) ?? 'UNKNOWN',\n });\n }\n });\n\n return { results, errors };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// ScopedStorageClient\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * A storage client that is already bound to a specific storage key.\n * You get one of these by calling `db.storage('keyName')`.\n *\n * None of the methods on this class require you to pass a bucket key —\n * it's already baked in.\n */\nexport class ScopedStorageClient {\n private readonly base: string;\n private readonly key: string;\n readonly keyName: string;\n\n constructor(baseUrl: string, keyName: string, bucketKey: string) {\n this.base = storageBase(baseUrl, bucketKey);\n this.key = bucketKey;\n this.keyName = keyName;\n }\n\n // ══════════════════════════════════════════════════════════════════════════\n // UPLOAD — single file\n // ══════════════════════════════════════════════════════════════════════════\n\n /**\n * Upload a single file.\n *\n * Supply `onProgress` to receive live upload ticks including bytes\n * transferred, speed (bytes/sec), ETA, and lifecycle stage.\n *\n * **Stage sequence:**\n * `pending → compressing → uploading → done | error`\n *\n * In browsers the progress is tracked at the network level via XHR, so\n * `percent` reflects actual bytes leaving the device. `done` only fires\n * after the server confirms the write to cloud storage, so 100% is real.\n *\n * @example\n * const { data, error } = await db.storage('avatars').upload(file, {\n * path: 'users/alice.jpg',\n * overwrite: true,\n * onProgress: (p) => {\n * setProgress(p.percent); // e.g. drive a <progress> bar\n * setSpeed(`${p.bytesPerSecond} B/s`);\n * setEta(`${p.eta}s remaining`);\n * },\n * });\n */\n async upload(\n file: File | Blob | Uint8Array | ArrayBuffer,\n options: UploadOptions = {},\n ): Promise<HydrousResponse<UploadResult>> {\n const { path, overwrite = false, onProgress } = options;\n\n try {\n const url = `${this.base}/upload`;\n const form = new FormData();\n\n if (file instanceof Uint8Array) {\n form.append('file', new Blob([file.buffer as ArrayBuffer]), path ?? 'file');\n } else if (file instanceof ArrayBuffer) {\n form.append('file', new Blob([file]), path ?? 'file');\n } else {\n form.append('file', file, path ?? (file instanceof File ? file.name : 'file'));\n }\n\n if (path) form.append('path', path);\n if (overwrite) form.append('overwrite', 'true');\n\n const headers = storageHeaders(this.key);\n\n // ── browser: XHR (real progress) + SSE parse ──────────────────────────\n if (isBrowser) {\n const totalBytes =\n file instanceof Blob ? file.size :\n file instanceof Uint8Array ? file.byteLength :\n (file as ArrayBuffer).byteLength;\n\n const rawBody = await xhrUpload(url, form, headers, (loaded, total) => {\n onProgress?.({\n index: 0, total: 1, path: path ?? '',\n stage: 'uploading',\n bytesUploaded: loaded,\n totalBytes: total || totalBytes,\n percent: Math.min(99, Math.round((loaded / (total || totalBytes)) * 100)),\n bytesPerSecond: null,\n eta: null,\n });\n });\n\n const { results, errors } = drainSSE(rawBody, onProgress);\n\n if (errors.length > 0 && results.length === 0) {\n return { data: null, error: { message: errors[0].error, code: errors[0].code } };\n }\n\n const result = results[0] ?? null;\n if (result && onProgress) {\n onProgress({ index: 0, total: 1, path: result.path, stage: 'done',\n bytesUploaded: totalBytes, totalBytes, percent: 100,\n bytesPerSecond: null, eta: 0, result });\n }\n return { data: result, error: null };\n }\n\n // ── Node / Edge: fetch + streaming SSE ────────────────────────────────\n const res = await fetch(url, { method: 'POST', headers, body: form });\n if (!res.ok) {\n const e = await res.json().catch(() => ({})) as { error?: string };\n throw new HydrousDBError(e.error ?? `HTTP ${res.status}`, 'HTTP_ERROR', res.status);\n }\n\n let finalResult: UploadResult | null = null;\n await readSSEStream(res, (eventType, data) => {\n const d = data as Record<string, unknown>;\n if (eventType === 'progress' && onProgress) {\n onProgress({\n index: 0, total: 1, path: path ?? '',\n stage: (d['stage'] as UploadProgress['stage']) ?? 'uploading',\n bytesUploaded: (d['bytesUploaded'] as number) ?? 0,\n totalBytes: (d['totalBytes'] as number) ?? 0,\n percent: (d['percent'] as number) ?? 0,\n bytesPerSecond: (d['bytesPerSecond'] as number | null) ?? null,\n eta: (d['eta'] as number | null) ?? null,\n result: d['result'] as UploadResult | undefined,\n });\n }\n if (eventType === 'done') finalResult = data as UploadResult;\n if (eventType === 'error') {\n throw new HydrousDBError(\n (d['error'] as string) ?? 'Upload failed',\n (d['code'] as string) ?? 'UPLOAD_ERROR',\n );\n }\n });\n\n return { data: finalResult, error: null };\n } catch (err) { return { data: null, error: toHydrousError(err) }; }\n }\n\n // ══════════════════════════════════════════════════════════════════════════\n // UPLOAD TEXT / JSON\n // ══════════════════════════════════════════════════════════════════════════\n\n /**\n * Upload raw text or JSON content directly — no File object needed.\n *\n * @example\n * // Save a JSON config\n * await db.storage('configs').uploadText(\n * 'settings/app.json',\n * JSON.stringify({ theme: 'dark' }),\n * { mimeType: 'application/json' }\n * );\n */\n async uploadText(\n path: string,\n content: string,\n options: { mimeType?: string; overwrite?: boolean; onProgress?: UploadOptions['onProgress'] } = {},\n ): Promise<HydrousResponse<UploadResult>> {\n const { mimeType = 'text/plain', overwrite = false, onProgress } = options;\n try {\n const res = await fetch(`${this.base}/upload-raw`, {\n method: 'POST', headers: jsonHeaders(this.key),\n body: JSON.stringify({ path, content, mimeType, overwrite }),\n });\n if (!res.ok) {\n const e = await res.json().catch(() => ({})) as { error?: string };\n throw new HydrousDBError(e.error ?? `HTTP ${res.status}`, 'HTTP_ERROR', res.status);\n }\n let finalResult: UploadResult | null = null;\n await readSSEStream(res, (eventType, data) => {\n const d = data as Record<string, unknown>;\n if (eventType === 'progress' && onProgress) {\n onProgress({\n index: 0, total: 1, path,\n stage: (d['stage'] as UploadProgress['stage']) ?? 'uploading',\n bytesUploaded: (d['bytesUploaded'] as number) ?? 0,\n totalBytes: (d['totalBytes'] as number) ?? 0,\n percent: (d['percent'] as number) ?? 0,\n bytesPerSecond: (d['bytesPerSecond'] as number | null) ?? null,\n eta: (d['eta'] as number | null) ?? null,\n });\n }\n if (eventType === 'done') finalResult = data as UploadResult;\n });\n return { data: finalResult, error: null };\n } catch (err) { return { data: null, error: toHydrousError(err) }; }\n }\n\n // ══════════════════════════════════════════════════════════════════════════\n // BATCH UPLOAD\n // ══════════════════════════════════════════════════════════════════════════\n\n /**\n * Upload multiple files in one request.\n *\n * `onProgress` fires per file — use `p.index` to identify which file.\n * All files receive a `pending` event upfront so you can render progress\n * bars immediately before any data is sent.\n *\n * @example\n * await db.storage('documents').batchUpload(files, {\n * prefix: 'reports/2024/',\n * onProgress: (p) => updateBar(p.index, p.percent),\n * });\n */\n async batchUpload(\n files: File[],\n options: BatchUploadOptions = {},\n ): Promise<HydrousResponse<BatchUploadResult>> {\n const { prefix = '', paths, overwrite = false, onProgress } = options;\n try {\n const url = `${this.base}/batch-upload`;\n const resolvedPaths = files.map((f, i) => paths?.[i] ?? `${prefix}${f.name}`);\n const form = new FormData();\n\n files.forEach(f => form.append('files', f, f.name));\n form.append('paths', JSON.stringify(resolvedPaths));\n if (overwrite) form.append('overwrite', 'true');\n\n const headers = storageHeaders(this.key);\n\n if (isBrowser) {\n const totalBytes = files.reduce((s, f) => s + f.size, 0);\n const rawBody = await xhrUpload(url, form, headers, (loaded, total) => {\n if (!onProgress) return;\n let cursor = 0;\n for (let i = 0; i < files.length; i++) {\n const share = files[i].size / (totalBytes || 1);\n const fileLoaded = Math.max(0, Math.min(\n files[i].size,\n ((loaded / (total || totalBytes)) - cursor) / share * files[i].size,\n ));\n onProgress({\n index: i, total: files.length, path: resolvedPaths[i],\n stage: 'uploading',\n bytesUploaded: Math.round(fileLoaded),\n totalBytes: files[i].size,\n percent: Math.min(99, Math.round((fileLoaded / files[i].size) * 100)),\n bytesPerSecond: null, eta: null,\n });\n cursor += share;\n }\n });\n const { results, errors } = drainSSE(rawBody, onProgress);\n return { data: { succeeded: results, failed: errors }, error: null };\n }\n\n const res = await fetch(url, { method: 'POST', headers, body: form });\n if (!res.ok) {\n const e = await res.json().catch(() => ({})) as { error?: string };\n throw new HydrousDBError(e.error ?? `HTTP ${res.status}`, 'HTTP_ERROR', res.status);\n }\n\n const succeeded: UploadResult[] = [];\n const failed: Array<{ path: string; error: string; code: string }> = [];\n await readSSEStream(res, (eventType, data) => {\n const d = data as Record<string, unknown>;\n if (eventType === 'progress' && onProgress) {\n onProgress({\n index: (d['index'] as number) ?? 0,\n total: (d['total'] as number) ?? files.length,\n path: (d['path'] as string) ?? '',\n stage: (d['stage'] as UploadProgress['stage']) ?? 'uploading',\n bytesUploaded: (d['bytesUploaded'] as number) ?? 0,\n totalBytes: (d['totalBytes'] as number) ?? 0,\n percent: (d['percent'] as number) ?? 0,\n bytesPerSecond: (d['bytesPerSecond'] as number | null) ?? null,\n eta: (d['eta'] as number | null) ?? null,\n });\n }\n if (eventType === 'done' && d['succeeded']) {\n succeeded.push(...(d['succeeded'] as UploadResult[]));\n failed.push(...(d['errors'] as Array<{ path: string; error: string; code: string }> ?? []));\n }\n });\n return { data: { succeeded, failed }, error: null };\n } catch (err) { return { data: null, error: toHydrousError(err) }; }\n }\n\n // ══════════════════════════════════════════════════════════════════════════\n // DOWNLOAD\n // ══════════════════════════════════════════════════════════════════════════\n\n /**\n * Download a single file and return its content as an `ArrayBuffer`.\n *\n * @example\n * const { data } = await db.storage('avatars').download('users/alice.jpg');\n * const blob = new Blob([data!]);\n * img.src = URL.createObjectURL(blob);\n */\n async download(filePath: string): Promise<HydrousResponse<ArrayBuffer>> {\n try {\n const res = await fetch(`${this.base}/download/${filePath}`, {\n headers: storageHeaders(this.key),\n });\n if (!res.ok) {\n const e = await res.json().catch(() => ({})) as { error?: string };\n throw new HydrousDBError(e.error ?? `HTTP ${res.status}`, 'HTTP_ERROR', res.status);\n }\n return { data: await res.arrayBuffer(), error: null };\n } catch (err) { return { data: null, error: toHydrousError(err) }; }\n }\n\n // ══════════════════════════════════════════════════════════════════════════\n // BATCH DOWNLOAD\n // ══════════════════════════════════════════════════════════════════════════\n\n /**\n * Download multiple files in one request.\n *\n * Set `autoSave: true` (browser only) to trigger a Save dialog per file.\n *\n * @example\n * const { data } = await db.storage('reports').batchDownload(\n * ['jan.pdf', 'feb.pdf'],\n * { autoSave: true, onProgress: (p) => console.log(p.path, p.status) }\n * );\n */\n async batchDownload(\n filePaths: string[],\n options: BatchDownloadOptions = {},\n ): Promise<HydrousResponse<BatchDownloadFile[]>> {\n const { concurrency = 5, onProgress, autoSave = false } = options;\n try {\n const res = await fetch(`${this.base}/batch-download`, {\n method: 'POST', headers: jsonHeaders(this.key),\n body: JSON.stringify({ paths: filePaths, concurrency }),\n });\n if (!res.ok) {\n const e = await res.json().catch(() => ({})) as { error?: string };\n throw new HydrousDBError(e.error ?? `HTTP ${res.status}`, 'HTTP_ERROR', res.status);\n }\n\n const downloadedFiles: BatchDownloadFile[] = [];\n await readSSEStream(res, (eventType, data) => {\n const d = data as Record<string, unknown>;\n if (eventType === 'file') {\n const base64 = d['content'] as string;\n const mimeType = (d['mimeType'] as string) ?? 'application/octet-stream';\n const path = (d['path'] as string) ?? '';\n const size = (d['size'] as number) ?? 0;\n const index = (d['index'] as number) ?? 0;\n\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);\n\n downloadedFiles.push({ path, content: bytes.buffer, mimeType, size });\n\n onProgress?.({ index, total: filePaths.length, path, status: 'success', size, mimeType });\n\n if (autoSave && isBrowser) {\n const blob = new Blob([bytes.buffer], { type: mimeType });\n const blobUrl = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = blobUrl; a.download = path.split('/').pop() ?? 'download'; a.click();\n setTimeout(() => URL.revokeObjectURL(blobUrl), 5000);\n }\n }\n if (eventType === 'error' && onProgress) {\n const index = (d['index'] as number) ?? 0;\n onProgress({ index, total: filePaths.length, path: filePaths[index] ?? '', status: 'error',\n error: (d['error'] as string) ?? 'Download failed' });\n }\n });\n return { data: downloadedFiles, error: null };\n } catch (err) { return { data: null, error: toHydrousError(err) }; }\n }\n\n // ══════════════════════════════════════════════════════════════════════════\n // LIST\n // ══════════════════════════════════════════════════════════════════════════\n\n /**\n * List files and folders (paginated).\n *\n * @example\n * const { data } = await db.storage('avatars').list({ prefix: 'users/' });\n * for (const item of data!.items) {\n * console.log(item.type, item.path, item.size);\n * }\n */\n async list(options: ListOptions = {}): Promise<HydrousResponse<ListResult>> {\n const { prefix = '', limit = 50, cursor } = options;\n try {\n const url = buildUrl(this.base, 'list', {\n prefix: prefix || undefined, limit, cursor: cursor || undefined,\n });\n const res = await fetch(url.replace(this.base + '/list', `${this.base}/list`), {\n headers: storageHeaders(this.key),\n });\n // buildUrl prepends a second base — use direct construction instead\n const u = `${this.base}/list?${new URLSearchParams(\n Object.entries({ prefix: prefix || '', limit: String(limit), ...(cursor ? { cursor } : {}) })\n .filter(([, v]) => v !== '')\n ).toString()}`;\n const r = await fetch(u, { headers: storageHeaders(this.key) });\n const json = await parseResponse<ListResult>(r);\n return { data: json, error: null };\n } catch (err) { return { data: null, error: toHydrousError(err) }; }\n }\n\n // ══════════════════════════════════════════════════════════════════════════\n // METADATA\n // ══════════════════════════════════════════════════════════════════════════\n\n /**\n * Get metadata for a file (size, MIME type, compression, etc.)\n *\n * @example\n * const { data: meta } = await db.storage('docs').metadata('report.pdf');\n * console.log(meta!.size, meta!.mimeType, meta!.isCompressed);\n */\n async metadata(filePath: string): Promise<HydrousResponse<FileMetadata>> {\n try {\n const res = await fetch(`${this.base}/metadata/${filePath}`, {\n headers: storageHeaders(this.key),\n });\n const json = await parseResponse<{ data: FileMetadata }>(res);\n return { data: json.data, error: null };\n } catch (err) { return { data: null, error: toHydrousError(err) }; }\n }\n\n // ══════════════════════════════════════════════════════════════════════════\n // DELETE\n // ══════════════════════════════════════════════════════════════════════════\n\n /** Delete a single file */\n async deleteFile(filePath: string): Promise<HydrousResponse<void>> {\n try {\n const res = await fetch(`${this.base}/file`, {\n method: 'DELETE', headers: jsonHeaders(this.key),\n body: JSON.stringify({ path: filePath }),\n });\n await parseResponse<void>(res);\n return { data: undefined, error: null };\n } catch (err) { return { data: null, error: toHydrousError(err) }; }\n }\n\n /** Recursively delete a folder and all its contents */\n async deleteFolder(folderPath: string): Promise<HydrousResponse<void>> {\n try {\n const res = await fetch(`${this.base}/folder`, {\n method: 'DELETE', headers: jsonHeaders(this.key),\n body: JSON.stringify({ path: folderPath }),\n });\n await parseResponse<void>(res);\n return { data: undefined, error: null };\n } catch (err) { return { data: null, error: toHydrousError(err) }; }\n }\n\n /** Create an empty folder */\n async createFolder(folderPath: string): Promise<HydrousResponse<void>> {\n try {\n const res = await fetch(`${this.base}/folder`, {\n method: 'POST', headers: jsonHeaders(this.key),\n body: JSON.stringify({ path: folderPath }),\n });\n await parseResponse<void>(res);\n return { data: undefined, error: null };\n } catch (err) { return { data: null, error: toHydrousError(err) }; }\n }\n\n // ══════════════════════════════════════════════════════════════════════════\n // MOVE & COPY\n // ══════════════════════════════════════════════════════════════════════════\n\n /** Move (rename) a file */\n async move(fromPath: string, toPath: string): Promise<HydrousResponse<void>> {\n try {\n const res = await fetch(`${this.base}/move`, {\n method: 'POST', headers: jsonHeaders(this.key),\n body: JSON.stringify({ from: fromPath, to: toPath }),\n });\n await parseResponse<void>(res);\n return { data: undefined, error: null };\n } catch (err) { return { data: null, error: toHydrousError(err) }; }\n }\n\n /** Copy a file (original is kept) */\n async copy(fromPath: string, toPath: string): Promise<HydrousResponse<void>> {\n try {\n const res = await fetch(`${this.base}/copy`, {\n method: 'POST', headers: jsonHeaders(this.key),\n body: JSON.stringify({ from: fromPath, to: toPath }),\n });\n await parseResponse<void>(res);\n return { data: undefined, error: null };\n } catch (err) { return { data: null, error: toHydrousError(err) }; }\n }\n\n // ══════════════════════════════════════════════════════════════════════════\n // SIGNED URL\n // ══════════════════════════════════════════════════════════════════════════\n\n /**\n * Generate a time-limited public URL for a private file.\n *\n * @example\n * const { data } = await db.storage('contracts').signedUrl('nda.pdf', { expiresIn: 300 });\n * console.log(data!.signedUrl); // share this\n */\n async signedUrl(\n filePath: string,\n options: SignedUrlOptions = {},\n ): Promise<HydrousResponse<SignedUrlResult>> {\n const { expiresIn = 3600 } = options;\n try {\n const res = await fetch(`${this.base}/signed-url`, {\n method: 'POST', headers: jsonHeaders(this.key),\n body: JSON.stringify({ path: filePath, expiresInSeconds: expiresIn }),\n });\n const json = await parseResponse<SignedUrlResult>(res);\n return { data: json, error: null };\n } catch (err) { return { data: null, error: toHydrousError(err) }; }\n }\n\n // ══════════════════════════════════════════════════════════════════════════\n // STATS\n // ══════════════════════════════════════════════════════════════════════════\n\n /**\n * Get usage and billing stats for this storage key.\n *\n * @example\n * const { data } = await db.storage('main').stats();\n * console.log(data!.totalFiles, data!.totalSizeBytes);\n */\n async stats(): Promise<HydrousResponse<StorageStats>> {\n try {\n const res = await fetch(`${this.base}/stats`, {\n headers: storageHeaders(this.key),\n });\n const json = await parseResponse<{ data: StorageStats }>(res);\n return { data: json.data, error: null };\n } catch (err) { return { data: null, error: toHydrousError(err) }; }\n }\n}\n","import type { HydrousConfig, StorageKeys } from '../types/index.js';\nimport { HydrousDBError } from '../utils/errors.js';\nimport { ScopedStorageClient } from './scoped.js';\n\n/**\n * StorageManager is the object exposed as `db.storage`.\n *\n * Call `.use(keyName)` — or use the shorthand `db.storage('keyName')` which\n * the main HydrousClient wires up as a Proxy — to get a scoped storage client\n * bound to that key.\n *\n * ```ts\n * db.storage('main').upload(file)\n * db.storage('avatars').list()\n * db.storage('documents').download('report.pdf')\n * ```\n */\nexport class StorageManager {\n private readonly baseUrl: string;\n private readonly _keys: StorageKeys;\n private readonly cache: Map<string, ScopedStorageClient> = new Map();\n\n constructor(config: HydrousConfig) {\n this.baseUrl = config.url;\n this._keys = config.storageKeys;\n }\n\n /**\n * Get a storage client scoped to a named key.\n *\n * @param keyName - Must match a property you declared in `storageKeys`\n *\n * @example\n * const avatarStore = db.storage('avatars');\n * const documentStore = db.storage('documents');\n *\n * await avatarStore.upload(file, { path: 'users/alice.jpg' });\n * const list = await documentStore.list({ prefix: 'invoices/' });\n */\n use(keyName: string): ScopedStorageClient {\n const bucketKey = this._keys[keyName];\n if (!bucketKey) {\n const available = Object.keys(this._keys).join(', ');\n throw new HydrousDBError(\n `Storage key \"${keyName}\" is not defined.\\nAvailable: ${available || '(none)'}`,\n 'UNKNOWN_STORAGE_KEY',\n );\n }\n if (!this.cache.has(keyName)) {\n this.cache.set(keyName, new ScopedStorageClient(this.baseUrl, keyName, bucketKey));\n }\n return this.cache.get(keyName)!;\n }\n\n /** Return the names of all configured storage keys */\n keyNames(): string[] {\n return Object.keys(this._keys);\n }\n}\n","import type { HydrousConfig } from './types/index.js';\nimport { AuthClient } from './auth/client.js';\nimport { RecordsClient } from './records/client.js';\nimport { AnalyticsClient } from './analytics/client.js';\nimport { StorageManager } from './storage/manager.js';\nimport { ScopedStorageClient } from './storage/scoped.js';\n\n// ── callable storage interface ────────────────────────────────────────────────\n// We want db.storage('avatars').upload(...)\n// So storage must be callable AND have the manager methods on it.\n\nexport interface CallableStorage {\n /** Get a scoped storage client by key name */\n (keyName: string): ScopedStorageClient;\n /** Same as calling db.storage(keyName) — more explicit */\n use(keyName: string): ScopedStorageClient;\n /** Return names of all configured storage keys */\n keyNames(): string[];\n}\n\n/**\n * The HydrousDB root client.\n *\n * Create once and reuse across your app:\n *\n * ```ts\n * import { createClient } from 'hydrousdb';\n *\n * const db = createClient({\n * url: 'https://api.myapp.hydrous.app',\n * authKey: 'hk_auth_…',\n * bucketSecurityKey: 'hk_bucket_…',\n * storageKeys: {\n * main: 'ssk_main_…',\n * avatars: 'ssk_avatars_…',\n * documents: 'ssk_docs_…',\n * },\n * });\n * ```\n */\nexport class HydrousClient {\n /** Auth — sign up, sign in, sign out, session management */\n public readonly auth: AuthClient;\n /** Records — insert, select, update, delete structured data */\n public readonly records: RecordsClient;\n /** Analytics — track events and query history */\n public readonly analytics: AnalyticsClient;\n /**\n * Storage — call with the name of the key you want.\n *\n * ```ts\n * db.storage('avatars').upload(file, { path: 'user.jpg' })\n * db.storage('documents').list({ prefix: 'invoices/' })\n * db.storage('main').stats()\n * ```\n */\n public readonly storage: CallableStorage;\n\n constructor(config: HydrousConfig) {\n if (!config.url) throw new Error('[HydrousDB] config.url is required');\n if (!config.authKey) throw new Error('[HydrousDB] config.authKey is required');\n if (!config.bucketSecurityKey) throw new Error('[HydrousDB] config.bucketSecurityKey is required');\n if (!config.storageKeys || typeof config.storageKeys !== 'object') {\n throw new Error('[HydrousDB] config.storageKeys must be an object of named keys');\n }\n\n this.auth = new AuthClient(config);\n this.records = new RecordsClient(config);\n this.analytics = new AnalyticsClient(config);\n\n // Build the manager then wrap it in a Proxy so db.storage('name') works\n const manager = new StorageManager(config);\n\n const fn = (keyName: string) => manager.use(keyName);\n fn.use = (keyName: string) => manager.use(keyName);\n fn.keyNames = () => manager.keyNames();\n\n this.storage = fn as CallableStorage;\n }\n}\n","// ─── Main client & factory ────────────────────────────────────────────────────\nexport { HydrousClient } from './client.js';\nexport type { CallableStorage } from './client.js';\n\nimport { HydrousClient } from './client.js';\nimport type { HydrousConfig } from './types/index.js';\n\n/**\n * Create a HydrousDB client.\n *\n * @example\n * import { createClient } from 'hydrousdb';\n *\n * const db = createClient({\n * url: 'https://api.myapp.hydrous.app',\n * authKey: 'hk_auth_…',\n * bucketSecurityKey: 'hk_bucket_…',\n * storageKeys: {\n * main: 'ssk_main_…',\n * avatars: 'ssk_avatars_…',\n * documents: 'ssk_docs_…',\n * },\n * });\n */\nexport function createClient(config: HydrousConfig): HydrousClient {\n return new HydrousClient(config);\n}\n\n// ─── Sub-clients ──────────────────────────────────────────────────────────────\nexport { AuthClient } from './auth/index.js';\nexport { RecordsClient } from './records/index.js';\nexport { AnalyticsClient } from './analytics/index.js';\nexport { StorageManager, ScopedStorageClient } from './storage/index.js';\n\n// ─── All types ────────────────────────────────────────────────────────────────\nexport type {\n HydrousConfig, StorageKeys,\n HydrousResponse, HydrousError,\n Filter, FilterOperator, QueryOptions,\n RecordResponse, SingleRecordResponse,\n AuthUser, AuthSession, SignUpOptions, SignInOptions,\n TrackEventOptions, AnalyticsQueryOptions, AnalyticsEvent,\n UploadStage, UploadProgress, DownloadProgress,\n UploadResult, UploadOptions,\n BatchUploadOptions, BatchUploadResult,\n BatchDownloadOptions, BatchDownloadFile,\n FileMetadata, StorageItem, ListResult, ListOptions,\n SignedUrlResult, SignedUrlOptions,\n StorageStats,\n} from './types/index.js';\n\n// ─── Query helpers ────────────────────────────────────────────────────────────\nexport { eq, neq, gt, lt, gte, lte, inArray } from './utils/query.js';\n\n// ─── Error utilities ─────────────────────────────────────────────────────────\nexport { HydrousDBError, isHydrousError } from './utils/errors.js';\n"]}